TCP断开连接,需要四次挥手。话不多说,先上图。

图片摘自《趣谈网络协议》侵删
注释:主动方用A表示 被动方用B表示
第一次挥手:A向B发出了FIN标志位的包,表示A想断开连接了。此时A进入FIN-WAIT-1
状态。【此时A不再发送数据包了,但是B的事情还不知道是否结束,可能B还在向A发送数据,所以这个时候,A还不能直接就断开,不管B;如果B不管A收到FIN包后,直接断开,A就处于不知所措的情况,也不行】
第二次挥手:B收到A的FIN包后,回复一个ACK包,表示B已经收到断开连接的请求了。此时B进入CLOSED-WAIT
状态。A收到ACK包后,进入FIN-WAIT2
状态。
第三次挥手:B发出ACK包后,B如果觉得自己的事情办完了的话,就可以把发送FIN包给A,表示自己也要断开连接了。此时B进入LAST_ACK
状态。
第四次挥手:A接收到B的断开连接FIN包后,发出一个ACK包给B,等待2MSL(2个报文最大生存时间)后,就断开连接。【此时A收到FIN包后,直接断开的话,A的端口被空出来了,B原来发过来的包还可能在路上,空出来的A的端口被别的应用占用的话,B的后续的包可能会发给新的应用,这样,就有可能导致混乱,所以要等一段时间,确认B发的包都丢弃或者没有了,才会断开连接】
以上是自己的学习笔记,如有错误,还请大家指出,及时纠正。
参考致谢:《趣谈网络协议》《网络是怎样连接的》