TCP的三次握手與四次揮手過程介紹

2021-07-10 06:04:07 字數 3447 閱讀 6884

圖源網路

詳細介紹參考此文:

首先需要認識幾個tcp的狀態名稱與含義,在tcp層,有個flags欄位,這個欄位有以下幾個標識:

syn, fin, ack, psh, rst, 

syn標誌位用來建立連線,如果syn=1而ack=0,表明它是乙個連線請求;如果syn=1且ack=1,則表示同意建立乙個連線。

fin表示關閉連線,置1時表示發端完成傳送任務。用來釋放連線,表明傳送方已經沒有資料傳送了。

ack表示響應,置1時表示確認號(為合法,為0的時候表示資料段不包含確認資訊,確認號被忽略。) 

psh表示有 data資料傳輸,置1時請求的資料段在接收方得到後就可直接送到應用程式,而不必等到緩衝區滿時才傳送。 

rst標誌位用來復位一條連線。當rst=1時,表示出現嚴重錯誤,必須釋放連線,然後再重新建立。

urg為緊急資料標誌,如果urg為1,表示本資料報中包含緊急資料。此時緊急資料指標表示的值有效,

它表示在緊急資料之後的第乙個位元組的偏移值(即緊急資料的總長度)。

一般地,當出現fin包或rst包時,我們便認為客戶端與伺服器端斷開了連線;而當出現syn和syn+ack包時,我們認為客戶端與伺服器建立了乙個連線。

psh為1的情況,一般只出現在 data內容不為0的包中,也就是說psh為1表示的是有真正的tcp資料報內容被傳遞。

tcp的連線建立和連線關閉,都是通過請求-響應的模式完成的。

配合下圖(來自網路)來說明tcp的3次握手過程:

第一次握手:客戶機a傳送標識位syn = 1,隨機產生序列號seq = x的資料報到伺服器b,伺服器b由syn = 1知道客戶機a要建立連線,並進入syn_send狀態,等待伺服器確認;;

第二次握手:伺服器b收到請求並確認聯機資訊後,向客戶機a傳送標識位syn = 1,ack = 1和隨機產生的序列號seq = y, 確認碼ack number = x+1(客戶機a傳送的seq+1)的資料報,此時伺服器進入syn_recv狀態;

第三次握手:客戶機a收到後檢查確認碼ack number是否正確,即和第一次握手傳送的序列號加1結果是否相等,以及ack標識位是否為1;若正確,客戶機a傳送標識位ack = 1、seq = x + 1和確認碼ack number = y + 1(伺服器b傳送的seq+1)到伺服器b,伺服器b收到後確認ack=1和seq是否正確,若正確則完成建立連線,此包傳送完畢,客戶端和伺服器進入established狀態,完成三次握手,客戶端與伺服器開始傳送資料.。

對於建鏈結的3次握手,主要是要初始化sequence number 的初始值。通訊的雙方要互相通知對方自己的初始化的sequence number(縮寫為isn:inital sequence number)——所以叫syn,全稱synchronize sequence numbers。也就上圖中的 x 和 y。這個號要作為以後的資料通訊的序號,以保證應用層接收到的資料不會因為網路上的傳輸的問題而亂序(tcp會用這個序號來拼接資料)。

如果想自己實踐下,可參考此文:

配合下圖(來自水印)來說明tcp的4次揮手過程:

對於4次揮手,其實你仔細看是2次,因為tcp是全雙工的,所以,傳送方和接收方都需要fin和ack。只不過,有一方是被動的,所以看上去就成了所謂的4次揮手。

由於tcp連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向的連線。收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料。

如果兩邊同時斷連線,那就會就進入到closing狀態,然後到達time_wait狀態。上圖是雙方同時斷連線的示意圖。

第一次揮手:客戶端a傳送乙個fin = 1、初始化序列號seq = u,到伺服器b,用來主動關閉客戶a到伺服器b的資料傳送,客戶機a進入fin-wait-1狀態,等待伺服器b傳送fin;

第二次揮手:伺服器b收到這個fin,它發回ack = 1、確認序號ack number為收到的序號加1(ack number=u+1);和syn一樣,乙個fin將占用乙個序號seq = v,客戶機a進入fin-wait-2,稍後關閉連線,伺服器b進入close_wait,等待關閉連線;

第三次揮手:伺服器b關閉與客戶端a的連線,發回標識位fin = 1,ack = 1,seq = w和確認碼ack number=u+1給客戶端a,伺服器b進入last_ack,等待最後一次ack確認;

第四次揮手:客戶端a傳送ack = 1報文確認,並將確認序號設定為收到序號加1(ack number=w+1)到伺服器b,客戶機a進入time-wait等待2mal後進入close可用狀態,伺服器b進入close可用狀態。

關於2msl是什麼,參考此文:

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

這是因為服務端的listen狀態下的socket當收到syn報文的建連請求後,它可以把ack和syn(ack起應答作用,而syn起同步作用)放在乙個報文裡來傳送。但關閉連線時,當收到對方的fin報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部傳送給對方了,所以你可以未必會馬上會關閉socket,也即你可能還需要傳送一些資料給對方之後,再傳送fin報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ack報文和fin報文多數情況下都是分開傳送的.

2.為什麼time_wait狀態還需要等2msl後才能返回到closed狀態?

這是因為雖然雙方都同意關閉連線了,而且握手的4個報文也都協調和傳送完畢,按理可以直接回到closed狀態(就好比從syn_send狀態到establish狀態那樣);但是因為我們必須要假想網路是不可靠的,你無法保證你最後傳送的ack報文會一定被對方收到,因此對方處於last_ack狀態下的socket可能會因為超時未收到ack報文,而重發fin報文,所以這個time_wait狀態的作用就是用來重發可能丟失的ack報文。

3. timewait的作用?

主動關閉的socket端會進入time_wait狀態,並且持續2msl時間長度,msl就是maximum segment lifetime(最大分節生命期),這是乙個ip資料報能在網際網路上生存的最長時間,超過這個時間將在網路中消失。msl在rfc 1122上建議是2分鐘,而源自berkeley的tcp實現傳統上使用30秒,因而,time_wait狀態一般維持在1-4分鐘。

如有錯誤請指出交流,謝謝!

參考:

TCP三次握手四次揮手過程

tcp三次握手四次揮手過程 三次握手 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線 第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認。第二次握手 伺服器收到syn包,必須確認客戶的syn ack j 1 同時...

TCP三次握手 四次揮手過程

tcp是面向位元組流的可靠協議,傳輸的資料單元叫報文段,報文段包括 首部和資料。序號 本報文段傳送的資料的第乙個位元組的序號 確認ack 連線請求報文段的ack 0,建立連線後ack 1 ack 1時確認號有效,ack 0時確認號無效 同步syn 當syn 1,ack 0這是連線請求報文段,若對方同...

Tcp三次握手與四次揮手

tcp三次握手 四次揮手 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 第二次...