三報文握手
1.概述
TCP是面向連接的協議。TCP建立連接的過程叫做握手,握手需要在客戶和服務器之間交換三個TCP報文段,即我們說的“三次握手”(嚴格講是一次握手過程中交換了三個報文)。
2.過程
一開始客戶端和服務器端中的TCP進程都處於關閉狀態,假設客戶端主動打開連接,服務器端被動打開連接;這時客戶端TCP進程創建傳輸控制模塊TCB,服務器端進程也創建傳輸控制模塊TCB並監聽客戶請求,以便及時響應。
- 第一次
客戶端打算建立TCP連接時,向服務器端發送連接請求報文段,其首部中的同步位SYN=1,ACK=0,並選擇一個初始序號seq=x,這時客戶端TCP進程進入同步已發送狀態(SYN-SENT)。 - 第二次
服務器端收到連接請求報文段后,如果同意連接,則向客戶端發送確認報文段,其首部中的同步位和ACK位都為1,確認號為ack=x+1,並選擇一個初始序號為seq=y,這時服務器端TCP進程進入同步已收到狀態(SYN-RCVD)。 - 第三次
客戶端收到服務器端的確認后,還需要向服務器端發送確認報文段,其首部中的同步位和ACK位都為1,確認號為ack=y+1,自己的序號為seq=x+1,這時客戶端TCP進程進入已建立連接狀態(ESTABLISHED)。
當服務器端收到客戶端的確認后,也進入已建立連接狀態(ESTABLISHED)。
3.過程圖示
4.四報文握手
在三報文握手中的第二次報文發送時,可以先發送一個確認報文段(ACK=1,ack=x+1),再發送一個同步報文段(SYN=1,seq=y),這就變成了四報文握手。
四報文揮手
1.概述
TCP釋放連接的過程叫做揮手。揮手需要在客戶和服務器之間交換四個TCP報文段。
2.過程
數據傳輸結束后,通信的雙方都可釋放連接。假設客戶端停止發送數據,先主動關閉TCP連接。
- 第一次
客戶端TCP進程發送連接釋放報文段並進入終止等待1狀態(FIN-WAIT-1),其中報文段首部的終止控制位FIN=1,其序號seq=u(u等於已傳送過的數據的最后一個字節的序號加1)。 - 第二次
服務器端收到連接釋放報文段后發出確認報文段並進入關閉等待狀態(CLOSE-WAIT),其中報文段首部確認號為ack=u+1,其序號為seq=v(v等同於u)。
客戶端收到服務器端的確認后,進入終止等待2狀態(FIN-WAIT-2),等待服務器端發送連接釋放報文段。
這時TCP連接處於半關閉狀態,即客戶端到服務器端的連接釋放了,但是服務器端仍可發送數據,客戶端仍可以接收數據。 - 第三次
當服務器端停止發送數據,其應用進程會通知TCP釋放連接。
服務器端TCP進程發送連接釋放報文段並進入最后確認狀態(LAST-ACK),其中報文段首部的終止控制位FIN=1,其序號seq=w(半關閉狀態時可能發送了數據),確認號ack=u+1。 - 第四次
客戶端收到連接釋放報文段后發出確認報文段並進入時間等待狀態(TIME-WAIT),其中報文段首部的ACK=1,確認號ack=w+1,其序號為seq=u+1。
此時TCP連接還沒有釋放,等待時間等待計時器設置的2MSL時間后(建議四分鍾),客戶端才進入關閉狀態。
3.圖示
幾個問題
- 1.三報文握手為什么客戶端最后還要發送一次確認呢?
為了防止已失效的連接請求報文段又發給服務器端而產生錯誤。
比如客戶端發送的第一個請求報文段在某些網絡節點滯留了,導致連接釋放后的某個時間才到達服務器端,服務器端會向客戶端發送確認報文段。
如果不采用三報文握手,那么新的連接就建立了,但客戶端不知道建立了連接,就不會發送數據導致服務器端一直等待;
而采用三報文握手,客戶端不會向服務器端的確認發出確認,服務器端收不到確認,就不會建立連接。 - 2.為什么四報文揮手客戶端在時間等待狀態需要等待2MSL?
其一是為了保證客戶端發送的最后一個確認報文段能到達服務器端。因為最后一個ACK報文段可能丟失,服務器端收不到這個報文段會超時重傳FIN報文段,在2MSL時間內客戶端能收到重傳的FIN報文段並重傳ACK報文段,保證客戶端和服務器端正常關閉TCP連接。
其二是防止已失效的請求連接報文段出現在本次連接中。客戶端在發送完最后一個ACK報文段后經過2MSL時間后,本次連接內的所有報文段將消失,下一次新的連接中就不會有本次的無效的請求連接報文段了。