TCP三次握手与四次挥手

前言

TCP连接与断开都不是普通的一次牵手、分手,为什么呢?又是怎么牵手、分手的呢?
下面探个究竟~

三次握手机制

  • 第一次握手
    • 主机A 向 主机B 发送一个含有同步序列号(SYN)标志位数据段,请求建立连接。通过这个数据段,主机A 告诉 主机B:我想与你通信;你可以使用哪个序列号作为起始数据段来回应我
  • 第二次握手
    • 主机B 收到 主机A 的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位数据段响应 主机A,也告诉 主机A:我已收到请求,你可以传输数据了;你要用序列号作为起始数据段来回应我
  • 第三次握手
    • 主机A 收到数据段后,再发送一个带有确认应答数据段,确认已收到 主机B 的数据段

三次握手成功,主机A 与 主机B 可以传输数据了

握手的特点

  • 没有应用层的数据
  • SYN这个标志位只有在TCP建产连接时才会被置1
  • 握手完成后SYN标志位被置0

为什么需要三次握手

如果一个连接请求在网络中跑得慢,超时了,这时客户端会重新发出请求,但是这个跑得慢的请求最后还是跑到了,服务端就接收了两个连接请求。客户端收到一个确认后,后面发来的确认就不管了,服务器不知道,就会一直维持着资源,造成浪费

三次握手的话,当服务器收不到客户端的 确认应答ACK 时,就会认为这个 SYN 无效,释放;对客户端的数据传输返回 RST

名词解释

  • ACK
    • TCP报头的控制位之一,对数据进行确认
    • 确认由目的端发出,用它来告诉发送端这个序列号之前的数据段都收到了。比如:确认号为X,则表示前X-1个数据段都收到了
    • 只有当ACK=1时,确认号才有效;当ACK=0时,确认号无效,这时会要求重传数据,保证数据的完整性
  • SYN
    • 同步序列号,TCP建立连接时会将这个位 置1
  • RST
    • 表重置连接、复位连接

四次挥手

  • 第一次挥手
    • 当 主机A 完成数据传输后,将控制位 FIN 置1,提出停止 TCP 连接的请求
  • 第二次挥手
    • 主机B 收到 FIN 后对其作出相应,确认这一方向的 TCP 连接将关闭,将 ACK 置1
  • 第三次挥手
    • 主机B 再提出反方向的关闭请求,将 FIN 置1
  • 第四次挥手
    • 主机A 对 主机B 的请求进行确认,将 ACK 置1,双方向的关闭结束

      为什么需要四次分手

      TCP是双向的,所以需要在两个方向分别关闭,每个方向的关闭又需要请求和确认,所以一共就4次

名词解释

  • FIN
    • 发送端完成发送任务位,当TCP完成数据传输需要断开时,提出断开连接的一方将这位置1