一.TCP释放连接的过程(四次挥手)
TCP释放连接的过程如下图所示。
现在假设客户端A和服务器端B都处于数据传送状态。TCP连接断开的步骤如下:
1.客户端A发送FIN=1的连接释放报文给服务器B,并进入FIN-WAIT1状态;
2.服务器B收到A发送的连接释放报文段之后,发出确认报文段,并进入关闭等待状态;客户端A在收到确认状态之后,进入FIN-WAIT2状态,此时,客户端A不再向服务器端发送数据,但是,服务器端B仍然可以向A发送数据;
3.在服务器B发送完数据之后,发送一遍FIN=1的连接释放报文段,表明自己发送数据完毕,准备断开连接,并进入LAST-ACK状态;
4.客户端A在收到服务器端的连接释放报文段,给服务器端发送确认报文段,并进入TIME-WAIT状态,在等待了2MSL时间后进入CLOSED状态;而服务器端B在收到客户端发送的应答报文段之后,就进入CLOSED状态。
时间MSL叫做最长报文段寿命,建议时间为2分钟。
上述的TCP释放连接的过程是四次握手,但是也可以看做是两个二次握手
二.为什么客户端A在TIME-WAIT状态之后必须等待2MSL的时间呢?
1.为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN-ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着A重传一次确认,重新启动2MSL计时器。最后,A和B都正常进入到CLOSED状态。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段。这样,B就无法按照正常步骤进入CLOSED状态。
2.为了防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使得本连接持续时间内说产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
三.保活计时器
除了时间等待计时器外,TCP还设有一个保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两个小时。若两个小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75分钟发送一次,若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。保活计时器是为了防止连接建立之后,客户端突然出现故障而没有出现响应,导致服务器一直出了连接状态而设置的。
参考文献
谢希仁, 计算机网络(第五版): 电子工业出版社, 2007.
版权所有,欢迎转载,转载请注明出处,谢谢
版权声明:本文为博主原创文章,未经博主允许不得转载。