Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

TCP-四次挥手

  • 客户端

    • 首先发送FIN=1,seq=u的连接释放报文,进入FIN-WAIT-1状态
  • 服务端

    • 收到请求后,发送ACK=1,seq=v,ack=u+1的确认报文
    • 同时进入CLOSE-WAIT状态,不再接收来自客户端的数据
    • 但服务端还是能继续返回数据的
  • 至此两次挥手完成,客户端收到这个报文后,进入FIN-WAIT-2状态

  • 服务端

    • 等到没有数据要返回,就会发送FIN=1,ACK=1,seq=w,ack=u+1的连接释放报文
    • 同时进入LAST-ACK状态
  • 客户端

    • 收到报文后,会发送ACK=1,seq=u+1,ack=w+1的确认报文
    • 同时进入TIME-AWAIT状态,这个状态会自动持续 2MSL 时间
    • 这段时间内如果都没有来自服务端的请求,就会进入CLOSED状态
  • 至此四次挥手完成,服务端收到这个报文后,也会进入CLOSED状态

  • 【问题】为什么最后还要等待2MSL?

    • 两句话:
      • 让滞留的报文从网络中过期消失,避免新的连接混杂有旧的报文
      • 就算最后的确认报文丢失,也能有时间重新接收到来自服务端的重传,从而重新给出确认报文,并重启2MSL,保证服务端能安全关闭
  • 【问题】为什么建立是3次,断开要4次?

    • 两句话:
      • 建立时,服务端把ACK和SYN统一到1次报文发送中
      • 而断开时,服务端可能还有数据要传,所以先ACK,再传剩余数据,再SYN,这样分开发送后就会多1次