再談TCP三次握手 四次揮手

2021-05-07 14:37:46 字數 2344 閱讀 7941

tcp/ip

協議中,

tcp協議提供可靠的連線服務,採用三次握手建立乙個連線,如圖1

所示。 (

1)第一次握手:建立連線時,客戶端a傳送

syn包(

syn=j

)到伺服器

b,並進入

syn_send

狀態,等待伺服器

b確認。(2

)第二次握手:伺服器b收到

syn包,必須確認客戶a的

syn(

ack=j+1

),同時自己也傳送乙個

syn包(

syn=k

),即syn+ack

包,此時伺服器b進入

syn_recv

狀態。(

3)第三次握手:客戶端

a收到伺服器b的

syn+

ack包,向伺服器

b傳送確認包

ack(

ack=k+1

),此包傳送完畢,客戶端

a和伺服器b進入

established

狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送資料。

圖1tcp

三次握手建立連線

由於tcp

連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料傳送任務後就能傳送乙個

fin來終止這個方向的連線。收到乙個

fin只意味著這一方向上沒有資料流動,乙個

tcp連線在收到乙個

fin後仍能傳送資料。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。(1

)客戶端

a傳送乙個

fin,用來關閉客戶

a到伺服器

b的資料傳送(報文段4)。

(2)伺服器

b收到這個

fin,它發回乙個

ack,確認序號為收到的序號加

1(報文段

5)。和

syn一樣,乙個

fin將占用乙個序號。(3

)伺服器

b關閉與客戶端

a的連線,傳送乙個

fin給客戶端

a(報文段6)。

(4)客戶端a發回

ack報文確認,並將確認序號設定為收到序號加

1(報文段7)。

tcp採用四次揮手關閉連線如圖

2所示。

圖2 tcp

四次揮手關閉連線

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報文。

本文摘自:

《tcp連線的狀態轉換圖深度剖析》

參考:

《tcp/ip詳解-卷1》第18章《tcp連線的建立與終止》

TCP三次握手 四次揮手

tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...

TCP三次握手 四次揮手

服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...

TCP三次握手四次揮手

tcp transmission control protocol 傳輸控制協議 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線。位碼即tcp標誌位,有6種標誌 urg urgent緊急 ack acknowledgement 確認 psh push傳送 rst...