TCP協議中的三次握手和四次揮手(圖解)


 

先來看看怎樣建立連接的

 

首先Client端發送連接請求報文,Server段接受連接后回復ACK報文,並為這次連接分配資源。Client端接收到ACK報文后也向Server段發生ACK報文,並分配資源,這樣TCP連接就建立了。

那怎樣斷開連接呢?簡單的步驟例如以下:

【注意】中斷連接端能夠是Client端,也能夠是Server端。

假設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連接就這樣關閉了!

整個過程Client端所經歷的狀態例如以下:

而Server端所經歷的步驟例如以下:

各個狀態的意義如下:
LISTEN - 偵聽來自遠方TCP端口的連接請求;
SYN-SENT -在發送連接請求后等待匹配的連接請求;
SYN-RECEIVED - 在收到和發送一個連接請求后等待對連接請求的確認;
ESTABLISHED- 代表一個打開的連接,數據可以傳送給用戶;
FIN-WAIT-1 - 等待遠程TCP的連接中斷請求,或先前的連接中斷請求的確認;
FIN-WAIT-2 - 從遠程TCP等待連接中斷請求;
CLOSE-WAIT - 等待從本地用戶發來的連接中斷請求;
CLOSING -等待遠程TCP對連接中斷的確認;
LAST-ACK - 等待原來發向遠程TCP的連接中斷請求的確認;
TIME-WAIT -等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認;
CLOSED - 沒有任何連接狀態;

【注意】 在TIME_WAIT狀態中,假設TCP client端最后一次發送的ACK丟失了,它將又一次發送。TIME_WAIT狀態中所須要的時間是依賴於實現方法的。典型的值為30秒、1分鍾和2分鍾。等待之后連接正式關閉,而且全部的資源(包含port號)都被釋放。

【問題1】為什么連接的時候是三次握手,關閉的時候卻是四次握手?
答:由於當Server端收到Client端的SYN連接請求報文后,能夠直接發送SYN+ACK報文。當中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉連接時,當Server端收到FIN報文時,非常可能並不會馬上關閉SOCKET,所以僅僅能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。僅僅有等到我Server端全部的報文都發送完了,我才干發送FIN報文,因此不能一起發送。故須要四步握手。

【問題2】為什么TIME_WAIT狀態須要經過2MSL(最大報文段生存時間)才干返回到CLOSE狀態?

答:盡管按道理,四個報文都發送完成,我們能夠直接進入CLOSE狀態了,可是我們必須假象網絡是不可靠的,又能夠最后一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM