在tcp/ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。
位碼即tcp標誌位,有6種標示:
syn(synchronous建立聯機)
ack(acknowledgement 確認)
psh(push傳送)
fin(finish結束)
rst(reset重置)
urg(urgent緊急)
先來張三次握手圖
第一次握手:建立連線時,客戶端傳送syn包(syn=x)到伺服器,並進入syn_send狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=x+1),同時自己也傳送乙個syn包(syn=y),即syn+ack包,此時伺服器進入syn_recv狀態;
第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=y+1),此包傳送完畢,客戶端和伺服器進入 established狀態,完成三次握手。 完成三次握手,客戶端與伺服器開始傳送資料.
四次揮手:
由於tcp連線是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向的連線。收到乙個 fin只意味著這一方向上沒有資料流動,乙個tcp連線在收到乙個fin後仍能傳送資料。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。
1.客戶端a傳送乙個fin,用來關閉客戶a到伺服器b的資料傳送
2.伺服器b收到這個fin,它發回乙個ack,確認序號為收到的序號加1。和syn一樣,乙個fin將占用乙個序號。
3.伺服器b關閉與客戶端a的連線,傳送乙個fin給客戶端a;
4.客戶端a發回ack報文確認,並將確認序號設定為收到序號加1。
問題來了,為什麼建立連線協議是三次握手,而關閉連線三次不行?
因為服務端的listen狀態下的socket當收到syn報文的建連請求後,它可以把ack和syn(ack起應答作用,而syn起同步作用)放在乙個報文裡來傳送。但關閉連線時,當收到對方的fin報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部傳送給對方了,所以你不可以馬上關閉socket,也即你可能還需要傳送一些資料給對方之後,再傳送fin報文給對方來表示你同意現在可以關閉連線了,所以它這裡的ack報文和fin報文多數情況下都是分開傳送的。
time_wait 狀態
從四次揮手過程可以看到,當伺服器像客戶端傳送 fin 報文後,客戶端響應確認報文時,客戶端處於 time_wait 狀態,而不是處於 close 狀態。之所以會這樣主要是因為客戶端傳送確認報文後,不能立刻關閉連線。因為如果服務端收不到確認報文,會將 fin 報文重傳,但此時客戶端已經關閉連線了,這樣會導致客戶端收不到,而服務端則一直苦苦等待客戶端傳送確認報文,不斷重傳 fin 報文。因此客戶端在響應確認報文後,需要等待兩個報文(2msl)往返時間,以此來確保服務端能夠正常收到確認報文關閉連線。
Tcp三次握手與四次揮手
tcp三次握手 四次揮手 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 第二次...
TCP三次握手與四次揮手
也許三次握手你會經常聽到,但你知道三次握手的真正意義嗎,為什麼需要三次握手呢?首先我們必須明白tcp是面向連線的協議,無論哪乙個方向在傳送資料之前,都必須先在雙方之間建立連線。這一點與udp協議是不一樣的,udp在傳送資料報之前是不需要建立連線的。建立tcp連線的過程中,通訊的雙方需要互相發報文進行...
tcp三次握手與四次揮手
一.tcp三次握手 簡述 a傳送乙個請求給b,b發回確認,然後a再加以確認,來回共3次 1 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認。2 第二次握手 伺服器收到syn包之後,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn syn...