TCP四次挥手_Linux



说明:当通信完成后,AB都可以主动断开连接,例如,客户端A不主动断开连接,也不发送数据,B还等着接受,会占用服务器B的资源,B也可以主动断开连接。

           (1)A,B都处于ESTAB-LISHED建立连接状态。当A发送完数据后,想要断开连接,向B发送FIN=1(1代表请求断开连接),seq=u(这次发送的包,在我这所排的序号),发送后,A进入FIN-WAIT-1 终止等待1状态。

       (2)当B收到A的请求后,回复ACK=1(确认收到),seq=v(这个包在我这,即在服务器B这排序为v,因为之前传输数据传输了很多包,这个排序不确定),ack=u+1(请求下一个发送的包为u+1,代表上一个包u已收到),当B发送后,进入CLOSE-WAIT关闭等待状态

       (3)A收到B的回复后,进入FIN-WAIT-2终止等待2状态,因为B仅仅是回复了,我收到你的断开请求了,但是B没说是否同意断开,所以A继续等待。

       (4)服务器B再次发送FIN=1(发送中断请求,即同意中断),ACK=1(确认收到),seq=w(这个包在我这,即在服务器B这排序为w,在请求关闭的同时,可能之前传送的包因网络问题,还在传输过程中,这中间服务器还会收到包,所以包排序不确定,有可能不是v+1,所以命名为w),ack=u+1(请求下一个发送的包为u+1,因为A已经进入终止等待状态,不会主动再发送包了,所以上次请求的包u+1,A没有发送,B这次继续发请求还是这个包),当B发送后进入LIST-ACK最后确认状态。

       (5)当A收到B的中断请求后,发送回复,ACK=1(确认收到),seq=u+1(发送包u+1,这个包在我这排序为u+1,即上次B的回复中,请求下次发的包),ack=w+1(A会算出这个包在B那边的排序。上一个包为w,所以这个包为w+1),发送完后A进入TIME-WAIT时间等待状态,因为网络中可能还有数据在传输,所以A要等待一段时间,确认这些数据发送成功。

       (6)当B收到A的确认后,进入CLOSED关闭状态,断开与A连接,然后会迅速进入LISTEN收听状态,继续接受下一个客户端的请求连接。当A等待2MSL(TCP报文段在网络中的最大生存时间,RFC 1122标准的建议值是2min),进入CLOSED关闭状态,断开与服务器B连接。