zoukankan      html  css  js  c++  java
  • tcp为什么需要3次握手4次挥手

    一、起因

       在网络请求中,为了提升性能,通常会采用长连接的方式避免在每一次交互都进行网络链接的创建和关闭,而长连接就是tpc的链接方式。因而有必要对tcp的创建链接和关闭有所了解。在网络上查询了一些知识,加以理解,整理成了如下的总结,然后给组装到自己的认识体系中。

    二、创建链接三次握手

        tpc创建链接需要三次握手:

             1)client 发送链接请求到server

             2)server发送响应请求给到client

             3)client再次发送响应请求给到server端

         三次握手之前是知道,但为什么要用三次握手,而不是两次、四次呢?

         现在能查到的解释是有两种:1)为了避免已失效的链接再次到达服务端而引起的错误,2)是网络中存在延迟的网络分组。这两个解释对应的事同样的。

         要解决的问题是:client向server发送了一个创建链接的请求,但由于网络原因,在达到客户端的超时时间后还没有收到server端的响应,客户端就重发一次建链请求,这次顺利的创建链接,然后开始进行数据传输,然后关闭链接。当关闭链接后,client第一次发送的建链请求才到达server,如果按照两次握手,server任务链接创建成功,而client发现server的响应请求超出了时间,直接进行丢弃,也不向server发送通知请求。而server还在等待客户端发送数据,这样就会造成server资源浪费。

          三次握手和我们去饭店点餐有些类似:1)食客先选择菜品 2)服务员查看点餐单,然后再向食客重复一遍 3)食客确定,然后服务员会把菜品报给厨房开始烹制。如果是两次握手,那就有可能出现食客说这个菜品我们没有点啊或者是我们点了那个菜品怎么没有上啊。。

         另外,二次握手可能会存在死锁问题:client向server发送建链请求,server然后向clent发送确认请求,然后server向client发送数据。当由于网络原因或client的问题,导致client未能获取到server发送的响应请求,就会一直等待server发送确认响应,但此时server确一直在发送数据,而不再发送确认响应,导致死锁问题。

          上述的解释存在几个前提:

          1)client在创建网络连接时,如果server在规定时间内没有响应,将会从自己的存储中移除该次的创建网络请求数据

          2)client只有在接收到server发出响应请求,验证通过后,才接受server发出的数据

    三、关闭链接四次握手

      tcp关闭链接四次握手原因在于tpc链接是全双工通道,需要双向关闭。

      client向server发送关闭请求,表示client不再发送数据,server响应。此时server端仍然可以向client发送数据,待server端发送数据结束后,就向client发送关闭请求,然后client确认。

      类似的例子是面试,面试本身是一个双向沟通的过程,也即全双工。面试官吧啦吧啦向面试人员问了一堆问题,问完了告诉面试人员我没有问题了,面试人员确认。但这个时候面试人员还是可以向面试官问问题了,等面试人员也问完了,向面试官说:我也没有问题了,面试官说:好的,我们就到此为止,后续有hr同学联系你,这次的面试结束。

     

  • 相关阅读:
    JS常用设计模式
    react native两次点击返回按钮退出APP
    react-native-device-info集成遇到的坑
    Django环境搭建之hello world
    jmeter之beanshell断言实例
    jmeter之beanshell断言---数据处理
    Jmeter将JDBC Request查询结果作为下一个接口参数方法(转载)
    App功能测试的注意点
    mybatis的CRUD实例(四)
    mybatis的CRUD实例(三)
  • 原文地址:https://www.cnblogs.com/sunzhenchao/p/6197481.html
Copyright © 2011-2022 走看看