为什么需要四次挥手。详细讲讲time_wait和close_wait。
为什么需要四次挥手。详细讲讲time_wait和close_wait。
题眼:time_wait的作用
time_wait 状态表示一个连接已经完成了关闭过程,并且在等待最后的确认报文。这个状态有两个作用:一是防止上一次连接中的延迟或重复的数据包被下一次复用连接错误地接收;二是确保被动关闭方能在规定时间内正常关闭连接。
time_wait状态的持续时间由TCP协议规定,一般为2倍的最长报文段寿命(Maximum Segment Lifetime,MSL)。MSL是一个网络中数据包在网络上存活的最长时间,通常为几分钟。因此,TIME_WAIT状态的持续时间一般为几分钟。
close_wait 状态表示对方已经发送了关闭连接的请求,等待本端应用程序也关闭连接。这个状态的存在是为了让应用程序有机会处理完剩余的数据,并主动关闭连接。如果应用程序没有及时调用 close() 操作,就可能导致大量的 close_wait 状态积累,占用系统资源。
参考答案:
四次挥手的目的是为了确保双方在断开连接时也是可靠的,其中FIN和ACK包是分开发送的,这样可以让服务端有时间处理完最后的数据,在某些特定情况下可以简化为三次握手。
time_wait的作用主要有两个。第一,防止历史链接中的数据被后面的链接错误接收(极低概率)。第二,保证被动关闭的一方可以正确的关闭。time_wait等待时间是根据操作系统设置的,默认是2MSL,也就是一个网络中数据包在网络上存活的最长时间。
close_wait是为了让应用程序有机会处理完剩余的数据,并主动关闭连接。
引申:最后一次挥手后,客户端是立即关闭的么?服务端可以主动关闭连接么?什么情况下,四次挥手会变成三次?time_wait过多,怎么办?服务端出现大量的close_wait怎么办?
