TCP四次挥手中TIME_WAIT的作用及危害

TIME_WAIT的意义

TCP四次挥手中TIME_WAIT的作用及危害

(1)为实现TCP连接的可靠释放

保证最后一个ACK能到达服务器,如果服务器没有收到客户端的确认报文,它会重新进行第四次挥手,这样客户端在2MSL内能收到重发的报文,并给出回应,重置2MSL计时器(MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”)

(2)为使旧的重复数据包在网络中因过期而消失

服务端发送给客户端的一些报文在传输过程中由于网络拥堵而导致严重推迟,而在它到达客户端之前服务端已经重发了该报文,并完成其任务。如果在被推迟的报文未抵达前客户端就断开了连接,随后又建立了一个与之前相同IP、Port的连接,而之前被推迟的报文在这时恰好到达,而此时此新连接非彼连接,从而会发生数据错乱,进而导致无法预知的情况。因此必须维持一段等待时间,使迟到的报文在网络中完全消失。这个时间可以时所有网络中的报文到达应该到的位置,新的连接中不会出现旧的连接的报文

TMIE_WAIT的危害

在高并发短连接的TCP服务器上,当服务器处理完请求后主动请求关闭连接,这样服务器上会有大量的连接处于TIME_WAIT状态,服务器维护每一个连接需要一个socket,也就是每个连接会占用一个文件描述符,而文件描述符的使用是有上限的,如果持续高并发,会导致一些连接失败。

如何避免——端口重用

设置套接字选项为SO_REUSEADDR,告诉操作系统,如果端口忙,但占用该端口TCP连接处于TIME_WAIT状态,并且套接字选项为SO_REUSEADDR,则该端口可被重用。如果TCP连接处于其他状态,依然返回端口被占用。该选项对服务程序重启非常有用。