TCP三次握手 四次揮手

2021-08-25 13:28:42 字數 3167 閱讀 6088

tcp三次握手

tcp連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換

tcp視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程:

1. 客戶端向伺服器傳送乙個

syn置位的

tcp報文,其中包含連線的初始序列號

x 和乙個視窗大小(表示客戶端上用來儲存從伺服器傳送來的傳入段的緩衝區的大小)。

2. 伺服器收到客戶端傳送過來的

syn報文後,向客戶端傳送乙個

syn和 ack

都置位的

tcp報文,其中包含它選擇的初始序列號

y 、對客戶端的序列號的確認

x+1和乙個視窗大小(表示伺服器上用來儲存從客戶端傳送來的傳入段的緩衝區的大小)。

3. .

客戶端接收到伺服器端返回的

syn+ack

報文後,向伺服器端返回乙個確認號

y+1和序號

x+1的 ack

報文,乙個標準的

tcp連線完成。

tcp 使用類似的握手過程來結束連線。這可確保兩個主機均能完成傳輸並確保所有的資料均得以接收

tcp client

flags

tcp server

1 send syn (seq=x)

----syn--->

syn received

2 syn/ack received

send syn (seq=y)

,ack (x+1)

3 send ack (y+1)

----ack--->

ack received

,connectionestablished

w: isn (initial sequence number) oftheclient

x: isn of the server

詳解tcp/ip

協議的連線建立與釋放

在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

所示。圖2tcp

四次揮手關閉連線

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...