欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

TCP四次握手断开连接的客户端TIME_WAIT问题

程序员文章站 2022-04-24 13:36:47
...

TCP四次握手断开连接的客户端TIME_WAIT问题

了解TCP四次握手断开连接可知:

==客户端最后一次发送ACK包后进入TIME_WAIT状态,而不是直接进入closed状态==

为什么呢?

  • TCP是面向连接的传输方式,必须保证数据能够正确到达目标文件,不能丢失或者出错,而网络是不稳定的,随时都可能回毁坏数据,所以每一次客户端向服务端发送数据包后,都要求服务端进行确认,回传ACK包,告诉客户端已收到数据,这样客户端才能知道数据传送成功了。
  • 如果客户端没有收到确认包,客户端回重新发送,知道服务端回传ACK包。

​ 但是,在四次握手断开连接过程中,客户端最后一次向服务端回传ACK包时,又可能因为网络问题导致服务器收不到,这时,服务端会再次发送FIN包,如果这时客户端完全关闭了连接,那么服务器无论如何也收不到ACK包了,所以客户端需要等待片刻,确认对方收到ACK包后才能进入CLOSED状态。

那么,这个等待的时间时多久呢?

  • 数据包在网路中是有生存时间的,超过这个时间还未到达目标就会被舍弃,并通知发送源主机。
  • 这个时间称为报文最大生存时间(MSL,Maximum Segment Lifetimr)。而TIME_WAIT要等待2MSL才会进入CLOSED状态。ACK包到达服务器需要MSL时间,服务器重传FIN包也需要MSL时间,2MSL时数据包往返的最大时间,如果2MSL后还未收到服务器重传的FIN包,就说明服务器已经收到了ACK包了。