1. 程式人生 > >TCP四次揮手

TCP四次揮手

linux

TCP四次揮手



技術分享



說明:當通信完成後,AB都可以主動斷開連接,例如,客戶端A不主動斷開連接,也不發送數據,B還等著接受,會占用服務器B的資源,B也可以主動斷開連接。

A,B都處於ESTAB-LISHED建立連接狀態。當A發送完數據後,想要斷開連接,向B發送FIN=1(1代表請求斷開連接),seq=u(這次發送的包,在我這所排的序號),發送後,A進入FIN-WAIT-1 終止等待1狀態,當B收到A的請求後,回復ACK=1(確認收到),seq=v(這個包在我這,即在服務器B這排序為v,因為之前傳輸數據傳輸了很多包,這個排序不確定),ack=u+1(請求下一個發送的包為u+1,代表上一個包u已收到),當B發送後,進入CLOSE-WAIT關閉等待狀態,A收到B的回復後,進入FIN-WAIT-2終止等待2狀態,因為B僅僅是回復了,我收到你的斷開請求了,但是B沒說是否同意斷開,所以A繼續等待。服務器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最後確認狀態,當A收到B的中斷請求後,發送回復,ACK=1(確認收到),seq=u+1(發送包u+1,這個包在我這排序為u+1,即上次B的回復中,請求下次發的包),ack=w+1(A會算出這個包在B那邊的排序。上一個包為w,所以這個包為w+1),發送完後A進入TIME-WAIT時間等待狀態,因為網絡中可能還有數據在傳輸,所以A要等待一段時間,確認這些數據發送成功。當B收到A的確認後,進入CLOSED關閉狀態,斷開與A連接,然後會迅速進入LISTEN收聽狀態,繼續接受下一個客戶端的請求連接。當A等待2MSL(TCP報文段在網絡中的最大生存時間,RFC 1122標準的建議值是2min),進入CLOSED關閉狀態,斷開與服務器B連接。


TCP四次揮手