TCP IP協議(二) 三次握手與四次揮手

2021-08-01 08:18:54 字數 1692 閱讀 9532

一、三次握手完成鏈結

通俗的過程:

客戶端發個請求「開門吶,我要進來」給伺服器

伺服器發個「進來吧,我去給你開門」給客戶端

客戶端有很客氣的發個「謝謝,我要進來了」給伺服器

流程圖:

過程描述:

(1)第一次握手:client將標誌位syn置為1,隨機產生乙個值seq=j,並將該資料報傳送給server,client進入syn_sent狀態,等待server確認。

(2)第二次握手:server收到資料報後由標誌位syn=1,直到client請求建立連線,server將標誌位syn和ack都置為1,ack=j+1,隨機產生乙個值seq=k,並將該資料報傳送給client以確認連線請求,server進入syn_rcvd狀態。

(3)第三次握手:client收到確認後,檢查ack是否為j+1,ack是否為1,如果正確則將標誌位ack置為1,ack=k+1,並將該資料報傳送給server,server檢查ack是否為k+1,ack是否為1,如果正確則連線建立成功,client和server進入established狀態,完成三次握手,隨後client與server之間可以開始傳輸資料了。

二、四次揮手:

通俗的過程:

客戶端發個「時間不早了,我要走了」給伺服器,等伺服器起身送他

伺服器聽到了,發個「我知道了,那我送你出門吧」給客戶端,等客戶端走

伺服器把門關上後,發個「我關門了」給客戶端,然後等客戶端走(尼瑪~矯情啊)

客戶端發個「我知道了,我走了」,之後自己就走了

由於tcp連線時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成資料傳送任務後,傳送乙個fin來終止這一方向的連線,收到乙個fin只是意味著這一方向上沒有資料流動了,即不會再收到資料了,但是在這個tcp連線上仍然能夠傳送資料,直到這一方向也傳送了fin。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

(1)第一次揮手:client傳送乙個fin,用來關閉client到server的資料傳送,client進入fin_wait_1狀態。

(2)第二次揮手:server收到fin後,傳送乙個ack給client,確認序號為收到序號+1(與syn相同,乙個fin占用乙個序號),server進入close_wait狀態。

(3)第三次揮手:server傳送乙個fin,用來關閉server到client的資料傳送,server進入last_ack狀態。

(4)第四次揮手:client收到fin後,client進入time_wait狀態,接著傳送乙個ack給server,確認序號為收到序號+1,server進入closed狀態,完成四次揮手。

為什麼建立連線是三次握手,而關閉連線卻是四次揮手呢?

這是因為服務端在listen狀態下,收到建立連線請求的syn報文後,把ack和syn放在乙個報文裡傳送給客戶端。而關閉連線時,當收到對方的fin報文時,僅僅表示對方不再傳送資料了但是還能接收資料,己方也未必全部資料都傳送給對方了,所以己方可以立即close,也可以傳送一些資料給對方後,再傳送fin報文給對方來表示同意現在關閉連線,因此,己方ack和fin一般都會分開傳送。

TCP IP協議三次握手與四次握手釋放

我們知道tcp建立連線要進行 三次握手 即交換三個分組。大致流程如下 只有就完了三次握手,但是這個三次握手發生在socket的那幾個函式中呢?請看下圖 圖1 socket中傳送的tcp三次握手 從圖中可以看出,當客戶端呼叫connect時,觸發了連線請求,向伺服器傳送了syn j包,這時connec...

TCP IP 協議 三次握手與四次揮手

1.序號 seq序號,佔32位,用來標識從tcp源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。2.確認序號 ack序號,佔32位,只有ack標誌位為1時,確認序號欄位才有效,ack seq 1。3.標誌位 共6個,即urg ack psh rst syn fin等,具體含義如下 a ur...

TCP IP協議三次握手與四次揮手

一.標誌位和序號 seq序號 傳送方隨機生成的 ack確認序號 ack seq 1 標誌位ack 1時確認序號有效 syn標誌位 發起乙個新連線 ack標誌位 確認序號有效 fin標誌位 斷開連線 二.三次握手 三次握手是客戶端與服務端建立乙個tcp連線時,需要客戶端和服務端傳送三個包建立連線的過程...