參考手冊
18-03-0114:04
關於tcp三次握手四次分手,之前看資料解釋的都很籠統,很多地方都不是很明白,所以很難記,前幾天看的乙個部落格豁然開朗,可惜現在找不到了。現在把之前的疑惑總結起來,方便一下大家。
先上個tcp三次握手和四次分手的圖
網上好多都是錯的,只能自己畫了,乙個正確的圖的確可以方便理解。
疑問一,上圖傳遞過程**現的幾個字元(syn,ack,fin,seq,ack)各代表什麼意思
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,
(這裡要吐槽一下,當初不懂的時候查資料,發現好多地方把ack和ack都搞混了,害的我被坑了好久…)
如果你仔細看了上面對每個字元的解釋,那麼相信我畫的三次握手和四次分手的圖你也就明白了。
再複習一遍
在建立連線時,
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,表示接受成功
四次分手完成!
我為什麼沒有在上面的過程中,加入seq和ack呢?就如我對這兩個關鍵字的解釋的一樣,這兩個是資料拆分和組裝必備元素,所以所有的請求都需要這兩個元素,只要明白了作用,就可以自己舉一反三。
關於握手和分手,主要還是syn,fin,ack的變化,這才是重點!
疑問二,每次傳送請求時為什麼ack要+1
關於seq和ack關鍵字的解釋中已經說明了。
疑問三,為什麼需要三次握手
下面解釋明明兩次就可以建立連線的為什麼還要加第三次的確認。
如果傳送兩次就可以建立連線話,那麼只要客戶端傳送乙個連線請求,服務端接收到並傳送了確認,就會建立乙個連線。
可能出現的問題:如果乙個連線請求在網路中跑的慢,超時了,這時客戶端會從發請求,但是這個跑的慢的請求最後還是跑到了,然後服務端就接收了兩個連線請求,然後全部回應就會建立兩個連線,浪費資源!
如果加了第三次客戶端確認,客戶端在接受到乙個服務端連線確認請求後,後面再接收到的連線確認請求就可以拋棄不管了。
疑問四,為什麼需要四次分手
tcp是雙向的,所以需要在兩個方向分別關閉,每個方向的關閉又需要請求和確認,所以一共就4次。
TCP三次握手,四次分手
tcp報文重要字段 1 序號 seq序號,佔32位 2 確認號 ack序號,32位,只有標誌位ack位1時,確認號才有效。ack seq 1 3 標誌位 共六個 urg 緊急指標,告訴接收tcp模組緊要指標域指著緊要資料。ack 置1時表示確認號 為合法,為0的時候表示資料段不包含確認資訊,確認號被...
TCP三次握手與四次分手
ack 此標誌表示應答域有效,就是說前面所說的tcp應答號將會包含在tcp資料報中 有兩個取值 0和1,為1的時候表示應答域有效,反之為0 syn 表示同步序號,用來建立連線。syn標誌位和ack標誌位搭配使用,當連線請求的時候,syn 1,ack 0 連線被響應的時候,syn 1,ack 1 這個...
TCP三次握手與四次分手
三次握手 解釋 客戶端a和伺服器b剛開始處於closed狀態,兩者之間沒有任何聯絡,a主動開啟,b被動開啟由 closed進入listen狀態,這是a傳送乙個syn 1的標誌位的資料報,並且資料的序列為seq x,a也由closed進入syn sent狀態,b接收到a的請求,也主動 傳送syn 1的...