三次握手
四次揮手
疑問一,上圖傳遞過程**現的幾個字元(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。
三次握手
在建立連線時,
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的三次握手和四次揮手
三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...
TCP三次握手和四次揮手
一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...
TCP三次握手和四次揮手
三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...