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