tcp(transmission control protocol) 傳輸控制協議
tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線:
位碼即tcp標誌位,有6種標示:syn(synchronous建立聯機) ack(acknowledgement 確認) psh(push傳送) fin(finish結束) rst(reset重置) urg(urgent緊急)
sequence number(順序號碼) acknowledge number(確認號碼)
第一次握手:主機a傳送位碼為syn=1,隨機產生seq number=1234567的資料報到伺服器,主機b由syn=1知道,a要求建立聯機;
第二次握手:主機b收到請求後要確認聯機資訊,向a傳送ack number=(主機a的seq+1),syn=1,ack=1,隨機產生seq=7654321的包
第三次握手:主機a收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,主機a會再傳送ack number=(主機b的seq+1),ack=1,主機b收到後確認seq值與ack=1則連線建立成功。
完成三次握手,主機a與主機b開始傳送資料。
在tcp/ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入syn_send狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=j+1),同時自己也傳送乙個syn包(syn=k),即syn+ack包,此時伺服器 進入syn_recv狀態; 第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=k+1),此包傳送完畢,客戶端和伺服器進入 established狀態,完成三次握手。 完成三次握手,客戶端與伺服器開始傳送資料.
例項:ip 192.168.1.116.3337 > 192.168.1.123.7788: s 3626544836:3626544836
ip 192.168.1.123.7788 > 192.168.1.116.3337: s 1739326486:1739326486 ack 3626544837
ip 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116傳送位碼syn=1,隨機產生seq number=3626544836的資料報到192.168.1.123,192.168.1.123由syn=1知道192.168.1.116要求建立聯機;
第二次握手:192.168.1.123收到請求後要確認聯機資訊,向192.168.1.116傳送ack number=3626544837,syn=1,ack=1,隨機產生seq=1739326486的包;
第三次握手:192.168.1.116收到後檢查ack number是否正確,即第一次傳送的seq number+1,以及位碼ack是否為1,若正確,192.168.1.116會再傳送ack number=1739326487,ack=1,192.168.1.123收到後確認seq=seq+1,ack=1則連線建立成功。
**:乙個三次握手的過程(圖1,圖2)
(圖1)
(圖2)
第一次握手的標誌位(圖3)
我們可以看到標誌位裡面只有個同步位,也就是在做請求(syn)
(圖3)
第二次握手的標誌位(圖4)
我們可以看到標誌位裡面有個確認位和同步位,也就是在做應答(syn + ack)
(圖4)
第三次握手的標誌位(圖5)
我們可以看到標誌位裡面只有個確認位,也就是再做再次確認(ack)
乙個完整的三次握手也就是請求---應答---再次確認
四次分手:
由於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)。
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是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線 位碼即tcp標誌位,有6種標示 syn synchronous建立聯機 ack acknowledgement 確認 psh pus...
tcp三次握手 TCP 三次握手總結
tcp特點概述 tcp segment structure 段結構 step2 server host receives syn,replie with syn ack segment 答覆syn ack報文段 step3 client receives synack,replies with ac...
TCP三次握手過程分析
傳輸控制協議 tcp 旨在用作分組交換計算機通訊網路中,以及這些網路的互連系統中的主機之間的高度可靠的主機到主機協議。最簡單的三次握手如下所示 tcp a tcp b 0.closed listen 1.syn sent syn received 2.established syn received...