TCP四次挥手
TCP作为可靠的连接协议,不仅体现在连接的建立上,也体现在其释放连接上,但是世界上是不存在百分之百可靠的通信机制的,我们来看下TCP释放连接,也就是四次挥手是如何尽可能保证TCP的可靠性的。
使用Wireshark抓包,如图:
1.四次挥手的过程
-
当客户端已经发送完数据后,调用close方法向服务端发送FIN包,请求关闭连接,此时客户端进入 FIN_WAIT1
状态,代表客户端已经不再发送数据,但是还能接收服务端数据,这个状态也叫半关闭
状态。
因为TCP是全双工协议,客户端和服务端能互相发送数据,都有可能先传输完数据请求关闭连接,所以先请求关闭的一方称为
主动关闭方
,而另一方称为被动关闭方
。
-
服务端收到客户端的FIN包后进入
CLOSE_WAIT
状态,并返回一个ACK给客户端,客户端端收到后,进入FIN_WAIT2
状态。 -
当服务端没有数据向客户端发送时,向客户端发送
FIN
包,然后服务端进入LAST_ACK
状态,客户端收到FIN
包,会进入TIME_WAIT
状态,这是一个比较特殊的状态,后面会单独讲解。 -
服务端收到
ACK
后进入CLOSE
状态,客户端在TIME_WAIT
等待2MSL后会进入CLOSE
状态。
MSL是Maximum Segment Lifetime英文的缩写,即报文的最大生存时间,超过这个时间的报文将会被丢弃。
在TCP中还存在一种特殊的情况,就是同时关闭
。就是客户端和服务端同时发送FIN
包,但是这种情况并不常见,知道这么个概念就行了,这里就不过多阐述了。
2.TCP四次挥手改为三次可以吗
因为TCP连接是全双工的,数据在两个方向上能够同时传递,因此每个方向的数据传输都必须单独关闭。当一端收到FIN并响应给对端的时候,这一方向的数据流便停止了,也就是半关闭状态。但是由于TCP有延迟确认
的功能或者服务端收到FIN
包后没有数据发送了,就能同时发送FIN+ACK
包,所以其实三次挥手是可以的。
但是延迟确认
可能会带来一个问题,就是如果被动关闭方没有及时ACK,主动关闭方的FIN
包,主动关闭方可能认为FIN
包丢失了,导致不必要的重传发生。所以四次挥手是相对最合理的关闭连接的方式。
关注作者微信公众号: