Skip to content

tcp连接的四次挥手(TCP连接的释放)

  • TCP标记
    • 大小:占6位,每位各有不同意义
      图示
      1. URG:Urgent 紧急位,URG = 1,表示紧急数据
      2. ACKAcknowledgement 确认位,ACK = 1,确认号才生效
      3. PSH:Push 推送位,PSH = 1,尽快的把数据交付给应用层
      4. RST:Reset 重置位,RST = 1,重新建立连接
      5. SYNSynchronization 同步位,SYN = 1 表示连接请求报文
      6. FINFinish 终止位,FIN = 1 表示释放连接

挥手过程

tcp连接的四次挥手

  • 挥手过程
    1. 发送方向接收方发送一个特殊的报文 FIN = 1, seq = u,表示客户端需要释放这个链接。当客户端发送这个报文之后就进入了 FIN-WAIT-1 断开连接的第一个状态。这就是第一次挥手。
    2. 接收方接收到发送方发送的释放连接的报文之后,接收方也会进行一次确认 ACK = 1, seq = v, ack = u + 1,确认的是发送方发送给接收方的序列号接收方已经收到了,并且接收方对发送方表示释放连接表达回复确认。当发送方接收到接收方回复的确认释放连接的状态的时候,发送方将会进入 FIN-WAIT-2 断开连接的第二个状态。这就是第二次挥手。
      • Tips:对于接收方来说,只要第二个报文发送出去之后,接收方就会进入 CLOSE_WAIT 关闭等待的状态,当接收方进入关闭等待状态的时候,其实接收方依旧可以给发送方进行输出传输,这是因为释放连接的请求是由发送方发出的,发送方发出的就表明发送方的数据已经发送完成了,但是对于被动释放的接收方来说可能接收方对发送方发送的数据还没有发送完成,所以在接收方 CLOSE_WAIT 关闭等待状态的时候依旧可以给发送方发送数据。
    3. 继Tips,等待接收方数据发送完成之后,接收方也会向发送一次确认释放连接的报文 FIN = 1, ACK = 1, seq = w, ack = u + 1 表示接收方也可以进入释放连接的状态了,并且在报文内还会携带一个ack,重复的对第一个报文进行确认。这就是第三次挥手。
    4. 当发送方接收到接收方也发送的确认释放连接报文之后,发送方会向接收方再次发送一次确认报文 ACK = 1, seq = u + 1, ack = w + 1 表示接收方发送给发送方连接释放的信号发送方已经确认收到了,至此 发送方和接收方就一起把这个连接释放掉吧。这就是第四次挥手的意思。
      • Tips:对于接收方来说,第三次挥手到第四次挥手中就进入了 LAST-ACK 最后确认的状态,它是为了确认发送方已经接收到了连接释放的这个报文。
      • Tips:对于发送方来说,进入了第四次挥手状态之后,就会进入一个特殊定时器的状态 TIME-WAIT 时间等待的状态。
        • TIME-WAIT 发送方会在等待状态中确认释放连接无误之后,连接才会进入关闭状态。

等待计时器 TIME-WAIT

  • 等待计时器会等待2倍的MSL(Max Segment Lifetime 最长报文段寿命)时间
  • 通常的MSL建议设置为2分钟
  • 确保当前连接的所有报文都已经过期

Danger

等待计时器主要是为了确保发送方发送的第四次挥手报文能够正确到达接收方,如果接收方未接收到第四次挥手的报文则接收方会重复发送第三次报文给发送方,以正确的结束本次的连接

Question

为什么需要等待2倍的MSL?
因为最后一个报文没有确认
确保发送方的ACK可以到达接收方,2倍的MSL也是可以在网络中存活的最长的一个时间
如果第四次挥手的报文没有发送给接收方,那么接收方就会认为它发送的第三次报文发送方未收到,因此接收方会再次发送第三次挥手的报文给发送方