zoukankan      html  css  js  c++  java
  • TCP 连接为什么需要 3 次握手和 4 次挥手

      

    1、为什么需要 3 次握手

      目的:为了防止 已失效的连接请求报文段 突然又传送到了服务端,因而产生错误。主要防止资源的浪费。

      额外补充:TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求!两次无法保证数据可靠,四次及以上无法保证效率。

       详解过程:

        当客户端发出第一个连接请求报文段时并没有丢失,而是在某个网络节点出现了长时间的滞留,以至于延误了连接请求,然后在某个时间之后才到达服务器。

        这应该是一个早已失效的报文段。

        但是服务器在收到此失效的连接请求报文段后,以为是客户端的一个新请求,于是就响应客户端发出了确认报文段,同意建立连接。

        假设不采用三次握手,那么只要服务器发出确认后,新的连接就可以建立了。但是由于客户端没有发出建立连接的请求,因此不会管服务器的确认,也不会向服务器发送数据,但服务器却以为新的运输连接已经建立,一直在等待,所以,服务器的资源就白白浪费掉了。

        采用 “三次握手” 的办法可以防止上述现象发生,例如上面提到的这种情况,client 不会像 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。

    2、为什么断开连接需要 4 次挥手

      目的:防止 “已失效的连接请求报文” 出现在连接中,在释放连接的过程中会有一些无效的滞留报文,这些报文在经过2MSL的时间内就可以发送到目的地,不会滞留在网络中。这样就可以避免在下一个连接中出现上一个连接的滞留报文了

      详解过程:

        为了保证在最后断开的时候,客户端能够发送最后一个ACK报文段能够被服务器接收到

        如果客户端在收到服务器给它的断开连接的请求之后,回应完服务器就直接断开连接的话,若服务器没有收到回应就无法进入CLOSE状态,所以客户端要等待两个最长报文段寿命的时间,以便于服务器没有收到请求之后重新发送请求。

  • 相关阅读:
    redis_ 5 集群
    redis_4 主从模式
    redis_3 持久化
    redis_2 数据类型
    linux_ubuntu 连接xftp
    redis_1 安装和简单使用
    Activiti 各个节点涉及的表
    oracle 数据库imp操作导入dmp文件时表空间问题
    ORA-27101: shared memory realm does not exist 错误的处理
    oralce清理user 和tablespace.
  • 原文地址:https://www.cnblogs.com/liang1101/p/13202738.html
Copyright © 2011-2022 走看看