四次挥手

四次挥手

  1. 定义:四次挥手就是客户端和服务端释放连接时的四个步骤。

  2. 产生原因:TCP连接是全双工的,因此每个方向都需要单独关闭,一方发送FIN只表示自己发完了要发送的数据。

  3. 流程:

    1. 第一次挥手:当客户端不再向服务端发送数据了。客户端先向TCP发出连接释放请求,TCP通知服务端需要释放从客户端到服务端的这个连接,客户端进入FIN_WAIT-1 (终止等待状态)。

    2. 第二次挥手:服务端收到客户端的释放连接请求后,立即释放连接。这样客户端到服务端的连接就释放了,服务端进入CLOSE_WAIT(半关闭状态)。相当于客户端对服务端说:我已经发完了我要发的数据,但仍然可以接收你发的数据。

    3. 第三次挥手:当服务端不再向客户端发送数据了。服务端先向TCP发出连接释放请求,TCP通知客户端需要释放从服务端到客户端的这个连接,服务端进入LAST_WAIT(最后确认状态)。

    4. 第四次挥手:客户端收到服务端的释放请求后,进入2MSL(一个报文的来回时间)的TIME_WAIT(时间等待)状态,接着发送一个ACK给服务端,服务端进入CLOSE(关闭状态)整个连接全部释放。客户端在2MSL的TIME_WAIT后进入CLOSE状态。

以上释放过程是4次联络,也可以看成2个2次联络。

  1. TIME_WAIT的状态必须等待2MSL的原因?

    • 保证当客户端最后一个ACK丢失后,能收到服务端重传的FIN包。这个ACK报文段可能丢失,因而处于LAST_ACK状态的B可能收不到对已发送的FIN+ACK报文段的确认,服务端会超时重传这个报文段,则客户端就可以在2MSL这个时间内收到这个重传的FIN+ACK报文段。接着客户端会重传一次确认,然后启动2MSL计时器。

    • 如果客户端在TIME_WAIT这个状态不等待一段时间,而是在发送ACK报文段后立即释放连接,那么就无法收到服务端重传的FIN+ACK报文段,因而也不会再发送一次确认报文段,B则无法按正常步骤进入CLOSED状态。(注:TIME_WAIT状态一般维持在1-4分钟)


四次挥手
http://example.com/四次挥手/
作者
Panyurou
发布于
2022年8月15日
许可协议