TCP四次挥手协议
四次揮手表示TCP斷開連接的時候,需要客戶端和服務端總共發送4個包以確認連接的斷開;客戶端或服務器均可主動發起揮手動作(因為TCP是一個全雙工協議),在?socket 編程中,任何一方執行 close() 操作即可產生揮手操作。
單工:數據傳輸只支持數據在一個方向上傳輸?
半雙工:數據傳輸允許數據在兩個方向上傳輸,但是在某一時刻,只允許在一個方向上傳輸,實際上有點像切換方向的單工通信?
全雙工:數據通信允許數據同時在兩個方向上傳輸,因此全雙工是兩個單工通信方式的結合,它要求發送設備和接收設備都有獨立的接收和發送能力?
單工:數據傳輸只支持數據在一個方向上傳輸?
半雙工:數據傳輸允許數據在兩個方向上傳輸,但是在某一時刻,只允許在一個方向上傳輸,實際上有點像切換方向的單工通信?
全雙工:數據通信允許數據同時在兩個方向上傳輸,因此全雙工是兩個單工通信方式的結合,它要求發送設備和接收設備都有獨立的接收和發送能力?
第一次揮手(FIN=1,seq=x) 假設客戶端想要關閉連接,客戶端發送一個 FIN 標志位置為1的包,表示自己已經沒有數據可以發送了,但是仍然可以接受數據。發送完畢后,客戶端進入 FIN_WAIT_1 狀態。?
第二次揮手(ACK=1,ACKnum=x+1) 服務器端確認客戶端的 FIN包,發送一個確認包,表明自己接受到了客戶端關閉連接的請求,但還沒有準備好關閉連接。發送完畢后,服務器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之后,進入 FIN_WAIT_2 狀態,等待服務器端關閉連接。?
第三次揮手(FIN=1,seq=w)?服務器端準備好關閉連接時,向客戶端發送結束連接請求,FIN置為1。發送完畢后,服務器端進入 LAST_ACK 狀態,等待來自客戶端的最后一個ACK。?
第四次揮手(ACK=1,ACKnum=w+1) 客戶端接收到來自服務器端的關閉請求,發送一個確認包,并進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK包。?
服務器端接收到這個確認包之后,關閉連接,進入 CLOSED 狀態。?
客戶端等待了某個固定時間(兩個最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,沒有收到服務器端的 ACK,認為服務器端已經正常關閉連接,于是自己也關閉連接,進入 CLOSED狀態。?
假設Client端發起中斷連接請求,也就是發送FIN報文。Server端接到FIN報文后,意思是說"我Client端沒有數據要發給你了"
,但是如果你還有數據沒有發送完成,則不必急著關閉Socket,可以繼續發送數據。所以你先發送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉連接了"。Client端收到FIN報文后,"就知道可以關閉連接了,但是他還是不相信網絡,怕Server端不知道要關閉,所以發送ACK后進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK后,"就知道可以斷開連接了"。Client端等待了2MSL后依然沒有收到回復,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。Ok,TCP連接就這樣關閉了!?
?
總結
- 上一篇: TCP/IP协议的TCP握手协议
- 下一篇: 【问题1】为什么连接的时候是三次握手,关