TCP詳解(二)三次握手與四次揮手

2021-10-16 12:31:53 字數 3025 閱讀 8339

四次揮手

tcp的狀態變遷圖

要了解在連線建立和終止的過程中發生了什麼,最好的方法就是抓包觀察。以下兩圖是訪問某個網頁過程中tcp連線建立和斷開時的資料報。這就是大名鼎鼎的tcp三次握手和四次揮手,我們會對其逐行進行分析。

xx->xx是通訊時選用的埠號。win為傳送方的接收視窗大小,len表示該包的資料部分的長度(還記得tcp資料封裝嗎,len表示的就是那部分的tcp資料長度)。ws是視窗擴大因子;用來控制視窗值如何擴大,選項中的字段。 mss之前也說過,是選項中tcp報文段資料字段的最大長度。sack_perm: 允許選擇確認,選項欄位中的。

分析三次握手和四次揮手的話,重點關注括號中的標誌,以及ack和seq就行。

第一行,我作為請求段通過埠號62703向伺服器的80埠發起建立tcp連線,這個時候我這邊將syn位置1,表示發起乙個連線,並傳送序列號為seq的資料報(seq是乙個隨機值,這個0是因為我檢視的時候顯示的是相對序列號,實際的seq如下圖,是2530960955)。

第三行,我將確認序號設定為伺服器的isn加1以對伺服器的syn報文段進行確認。

這三個報文段完成連線的建立。這個過程就稱為三次握手。

還是用造橋來舉例子,a和b被一條很寬的河隔開了,然後兩邊的人就無法和對面的交流,有一天a的人就想造個橋過去,但又不知道b歡不歡迎他們造橋過來。然後就找了個兩百多斤的大力士,讓他游過去帶句話:造橋嗎?b這邊收到這話很高興,也派出乙個兩百多斤的大力士,他帶的話是:現在造嗎?現在造的話你就讓人去帶個話說現在造。然後a就派人去回答現在造。這樣兩邊協商好就開始架橋。例子可能有點不妥,總之三次握手是個雙向的確認過程。

下圖為三次握手的原理圖。

為什麼不是兩次?

謝希仁版《計算機網路》中的例子是這樣的,「已失效的連線請求報文段」的產生在這樣一種情況下:client發出的第乙個連線請求報文段並沒有丟失,而是在某個網路結點長時間的滯留了,以致延誤到連線釋放以後的某個時間才到達server。本來這是乙個早已失效的報文段。但server收到此失效的連線請求報文段後,就誤認為是client再次發出的乙個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用「三次握手」,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送ack包。但server卻以為新的運輸連線已經建立,並一直等待client發來資料。這樣,server的很多資源就白白浪費掉了。採用「三次握手」的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。server由於收不到確認,就知道client並沒有要求建立連線。

上面這段話太長太多。舉個例子,現在a和b都是兩次握手國的。a的人下命令,b的人是工具人。有一天a派人去b讓他們造橋。

b的人啥也不敢說,啥也不敢問,就作為工具人把橋又造上了。然而a並不會去用它,這就造成了浪費。

為什麼不是四次?

首先,如果使用四次握手,步驟會是怎麼樣呢?

1.客戶端向伺服器傳送syn

2.伺服器對客戶端syn進行ack

3.伺服器對客戶端傳送syn

4.客戶端對伺服器的syn進行ack

可以看到步驟2和3完全能夠合併成一步,只需要伺服器在一次報文互動中同時將syn和ack置位就行了。所以四次握手雖然沒有錯誤,但是它多此一舉,浪費了網路資源。

雖然建立乙個tcp連線只需要三次握手,但終止乙個連線卻要經過四次揮手。這是由於tcp的半關閉(halfclose)造成的。既然乙個tcp連線是全雙工(即資料在兩個方向上能同時傳遞),因此每個方向必須單獨地進行關閉。這原則就是當一方完成它的資料傳送任務後就能傳送乙個 fin來終止這個方向連線。當一端收到乙個 fin,它必須通知應用層另一端幾經終止了那個方向的資料傳送。傳送fin通常是應用層進行關閉的結果。

第二行,客戶端傳送了乙個ack對fin報文進行確認,此時從伺服器到客戶端方向的連線斷開。不久後客戶端重複上述動作,向伺服器傳送fin(第三行),伺服器對fin進行ack(第四行),乙個tcp連線便徹底關閉了。

下圖為四次揮手的原理圖。

等待2msl

在四次揮手中,time_wait狀態也稱為2msl等待狀態。每個具體 tcp實現必須選擇乙個報文段最大生存時間msl(maximum segment lifetime)。它是任何報文段被丟棄前在網路內的最長時間。我們知道這個時間是有限的,因為tcp報文段以ip資料報在網路內傳輸,而ip資料報則有限制其生存時間的ttl欄位。

對乙個具體實現所給定的 msl值,處理的原則是:當tcp執行乙個主動關閉,並發回最後乙個ack,該連線必須在time _ wait狀態停留的時間為2倍的msl。這樣可讓tcp再次傳送最後的ack以防這個ack丟失(另一端超時並重發最後的fin)。

這種2msl等待的另乙個結果是這個tcp連線在2msl等待期間,定義這個連線的套接字(客戶的i p位址和埠號,伺服器的 i p位址和埠號)不能再被使用。這個連線只能在2msl結束後才能再被使用。

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...