1. 程式人生 > 其它 >TCP三次握手,四次分手。個人感覺最容易理解的解釋

TCP三次握手,四次分手。個人感覺最容易理解的解釋

三次握手

名詞解釋

SYN,ACK,FIN存放在TCP的標誌位,一共有6個字元,這裡就介紹這三個:

SYN:代表請求建立連線,所以在三次握手中前兩次要SYN=1,表示這兩次用於建立連線,至於第三次什麼用,在疑問三裡解答。

FIN:表示請求關閉連線,在四次分手時,我們發現FIN發了兩遍。這是因為TCP的連線是雙向的,所以一次FIN只能關閉一個方向。

ACK:代表確認接受,從上面可以發現,不管是三次握手還是四次分手,在迴應的時候都會加上ACK=1,表示訊息接收到了,並且在建立連線以後的傳送資料時,都需加上ACK=1,來表示資料接收成功。

seq:序列號,什麼意思呢?當傳送一個數據時,資料是被拆成多個數據包來發送,序列號就是對每個資料包進行編號,這樣接受方才能對資料包進行再次拼接。

初始序列號是隨機生成的,這樣不一樣的資料拆包解包就不會連線錯了。(例如:兩個資料都被拆成1,2,3和一個數據是1,2,3一個是101,102,103,很明顯後者不會連線錯誤)

ack:這個代表下一個資料包的編號,這也就是為什麼第二請求時,ack是seq+1,

過程

在建立連線時,

1.客戶端首先要SYN=1,表示要建立連線,

2.服務端接收到後,要告訴客戶端:我接受到了!所以加個ACK=1,就變成了ACK=1,SYN=1

3.理論上這時就建立連線成功了,但是要防止一個意外(見疑問三),所以客戶端要再發一個訊息給服務端確認一下,這時只需要ACK=1就行了。

為什麼要握三次手:

如果傳送兩次就可以建立連線話,那麼只要客戶端傳送一個連線請求,服務端接收到併發送了確認,就會建立一個連線。

可能出現的問題:如果一個連線請求在網路中跑的慢,超時了,這時客戶端會從發請求,但是這個跑的慢的請求最後還是跑到了,然後服務端就接收了兩個連線請求,然後全部迴應就會建立兩個連線,浪費資源!

如果加了第三次客戶端確認客戶端在接受到一個服務端連線確認請求後,後面再接收到的連線確認請求就可以拋棄不管了。

四次揮手

過程:

1.首先客戶端請求關閉客戶端到服務端方向的連線,這時客戶端就要傳送一個FIN=1,表示要關閉一個方向的連線(見上面四次分手的圖)

2.服務端接收到後是需要確認一下的,所以返回了一個ACK=1

3.這時只關閉了一個方向,另一個方向也需要關閉,所以服務端也向客戶端發了一個FIN=1 ACK=1

4.客戶端接收到後傳送ACK=1,表示接受成功

為什麼要揮四次手:
TCP是雙向的,所以需要在兩個方向分別關閉,每個方向的關閉又需要請求和確認,所以一共就4次。

長風破浪會有時,直掛雲帆濟滄海