1. 程式人生 > >淺談TCP三次握手和四次分手

淺談TCP三次握手和四次分手

必須 通信 服務 嘗試 pro 標示 cnblogs 通話 應該

TCP(Transmission Control Protocol傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議提供可靠的連接服務,采用三次握手確認建立一個連接,比如我們去訪問一個網站,從輸入網址到頁面顯示我們所想要瀏覽的內容,這個過程其中就包含了小編要說的三次握手和四次揮手。

一、首先我們來了解一下tcp包頭的6種標示:

URG:(緊急)表示本報文段中發送的數據是否包含緊急數據。

ACK:(確認)表示是否前面的確認號字段是否有效。

PSH:(傳送)提示接收端應用程序應該立即從TCP接收緩沖區中讀走數據,為接收後續數 據騰出空間。

RST:(重置)如果收到一個RST=1的報文,說明與主機的連接出現了嚴重錯誤,必須釋放連接,然後再重新建立連接。

SYN:(建立連接)在建立連接時使用,用來同步序號。

FIN:(結束連接)表示通知對方本端要關閉連接了,標記數據是否發送完畢

二、下面來張匯總圖:

技術分享

2.1 上圖為TCP的狀態機,各種版本、模式相信好多人都應該看到過了,小編也是大概畫個樣板圖,從圖中我們可以看到客戶端和服務器端的狀態處於變換之中,那麽我們來總結一下它們的變換流程。

* 客戶端TCP狀態遷移:

CLOSED——SYN-SEND——ESTABLISHED——FIN-WAIT1——FIN-WAIT2——TIME-WAIT

技術分享

* 服務器端TCP狀態遷移:

CLOSED——LISTEN——SYN-RECEIVED——ESTABLISHED—-CLOSED-WAIT——LAST-ACK——CLOSED

技術分享

2.2 各狀態含義:

1、CLOSED:沒有任何連接狀態

2、LISTEN:監聽狀態,等待來自遠方TCP端口的連接請求

3、SYN-SENT:在發送連接請求後,等待對方確認

4、SYN-RECEIVED:在收到和發送一個連接請求後,等待對方確認

5、ESTABLISHED:傳輸連接建立,雙方進入數據傳送狀態

6、FIN-WAIT-1:主動關閉,主機已發送關閉連接請求,等待對方確認

7、FIN-WAIT-2:主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求

8、TIME-WAIT:完成雙向傳輸連接關閉,等待所有分組消失

9、CLOSE-WAIT:被動關閉,收到對方發來的關閉連接請求,並已確認

10、LAST-ACK:被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失

11、CLOSING:雙方同時嘗試關閉傳輸連接,等待對方確認(這種狀態在上圖中並沒有顯示出來,但偶爾還是會有這種狀態出現的)

三、簡圖1

技術分享

3.1 三次握手(建立連接),如上圖所示:

第一次握手:建立連接時,客戶端A發送SYN包(SYN=1)到服務器B,並進入SYN_SEND狀態,等待服務器B確認。

第二次握手:服務器B收到SYN包,必須確認客戶A的SYN(ACK=x+1),同時自己也發送一個SYN包(SYN=1),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。

第三次握手:客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK(ACK=y+1),此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。之後就可以進行數據傳送了。

這裏的X+1就是指接受方希望收到的下一個序列號

3.2 抓包截圖具體示例TCP的三次握手(SYN,(SYN+ACK),ACK)

技術分享

四、簡圖2

技術分享

4.1 四次揮手(斷開連接),如上圖所示:

第一次揮手:客戶端向服務器發送一個FIN報文段,序列號為u,此時,客戶端進入FIN_WAIT_1狀態,這表示客戶端沒有數據要發送給服務器了

第二次揮手:服務器收到了客戶端發送的FIN報文段,向客戶端回一個ACK報文段,序列號為u+1,客戶端進入FIN_WAIT_2狀態,服務器告訴客戶端,我也沒有數據要發送了,可以進行關閉連接了

第三次揮手:服務器向客戶端發送FIN報文段,請求關閉連接,同時服務器進入CLOSE_WAIT狀態

第四次揮手:客戶端收到服務器發送的FIN報文段,向服務器發送ACK報文段,然後客戶端進入TIME_WAIT狀態;服務器收到客戶端的ACK報文段以後,就關閉連接;此時,客戶端等待2MSL後依然沒有收到回復,則證明服務器已正常關閉,此時,客戶端也可以關閉連接了

4.2 抓包截圖具體示例TCP的四次揮手((FIN+ACK),ACK,(FIN+ACK),ACK)

技術分享

五、兩個小問題

5.1 為什麽連接的時候是三次握手,關閉的時候卻是四次握手?

答:因為當服務器端收到客戶端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當服務器端收到FIN報文時,很可能並不會立即關閉端口,所以只能先回復一個ACK報文,告訴客戶端,"你發的FIN報文我收到了"。只有等到我服務器端這邊所有的報文都發送完了,我才能發送FIN報文,不能應答和報文一起發送。就像我們雙方通話時,一人說要掛電話,他也會等到對方講話結束,並且對方也同意結束通話是一個道理。

5.2 為什麽TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:按道理,四個報文都發送完畢,可以直接進入CLOSE狀態,但是我們要知道,網絡在傳輸數據的過程中也有不穩定的時候,網絡擁擠、堵塞,這都是極有可能發生的事情。這些情況出現的話,最後一個ACK就有可能丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

以上就是小編對三次握手四次揮手的總結,不足之處,大家多多指教哦。

淺談TCP三次握手和四次分手