在
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 協議 傳輸控制協議 transmission control protocol,tcp 是種面向連線 確保資料在端到端間可靠傳輸的協議。面向連線是插在傳送資料前,需要先建立一條虛擬的鏈路,然後讓資料在這條鏈路上 流動 完成傳輸。1 tcp 協議的報文頭 2 協議六個狀態位 連線協議相關的...
TCP連線關閉過程筆記
tcp協議的連線是全雙工連線,乙個tcp連線存在雙向的讀寫通道。簡單說來是 先關讀,後關寫 一共需要四個階段。以客戶機發起關閉連線為例 1.伺服器讀通道關閉 2.客戶機寫信道關閉 3.客戶機讀通道關閉 4.伺服器寫信道關閉 關閉行為是在發起方資料傳送完畢之後,給對方發出乙個fin finish 資料...
TCP連線關閉過程筆記
前言 tcp協議的連線是全雙工連線,乙個tcp連線存在雙向的讀寫通道。簡單說來是 先關讀,後關寫 一共需要四個階段。以客戶機發起關閉連線為例 1.伺服器讀通道關閉 2.客戶機寫信道關閉 3.客戶機讀通道關閉 4.伺服器寫信道關閉 關閉行為是在發起方資料傳送完畢之後,給對方發出乙個fin finish...