TCP三次握手和四次揮手及wireshark抓取

2022-05-04 15:48:08 字數 3239 閱讀 4944

tcp的三次握手與四次揮手的詳細介紹:

三次握手:

第一次握手(syn=1, seq=x):

客戶端傳送客戶端傳送乙個 tcp 的 syn 標誌位置1的,指明客戶端打算連線的伺服器的埠,以及初始序號 x,儲存在包頭的序列號(sequence number)欄位裡。

第二次握手(syn=1, ack=1, seq=y, acknum=x+1):

伺服器發回確認包(ack)應答。即 syn 標誌位和 ack 標誌位均為1。伺服器端選擇自己 isn 序列號,放到 seq 域裡,同時將確認序號(acknowledgement number)設定為客戶的 isn 加1,即x+1。 傳送完畢後,伺服器端進入syn_rcvd狀態。

第三次握手(ack=1,acknum=y+1):

客戶端再次傳送確認包(ack),syn 標誌位為0,ack 標誌位為1,並且把伺服器發來 ack 的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫isn的+1

傳送完畢後,客戶端進入established狀態,當伺服器端接收到這個包時,也進入established狀態,tcp 握手結束。

握手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,tcp連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,tcp 連線都將被一直保持下去。

三次握手

wireshark抓取三次握手過程;

在瀏覽器中輸入www.golang.com,通過 ping www.golang.com知道golang的ip是 216.239.37.1, 在wireshark filter中輸入ip.src == 216.239.37.1 or ip.dst ==  216.239.37.1 用於過濾出所有跟216.239.37相關的報文。

可以看到,訪問**時,客戶端(瀏覽器)會建立起三次握手。

第一次握手,由客戶端發出。

syn=1,seq的值為 f5 75 60 37。

第二次握手,伺服器發出。

ack=1,seq為 61 d0 be 42, acknumber是f5 75 60 38,它是第一次握手的seq(f5 75 60 37)值加1。

第三次握手,客戶端發出。

ack=1。acknumber是61 d0 be 43, 是上一次的seq值加1,第二次握手的seq值是61 d0 be 42.

四次揮手:

與建立連線的「三次握手」類似,斷開乙個tcp連線則需要「四次握手」。

第一次揮手(fin=1,seq=x):

假設客戶端想要關閉連線,客戶端傳送乙個 fin 標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。傳送完畢後,客戶端進入fin_wait_1狀態。

第二次揮手(ack=1,acknum=x+1):

伺服器端確認客戶端的 fin 包,傳送乙個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線。傳送完畢後,伺服器端進入close_wait狀態,客戶端接收到這個確認包之後,進入fin_wait_2狀態,等待伺服器端關閉連線。

第三次揮手(fin=1,seq=y):

伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,fin 置為1。傳送完畢後,伺服器端進入last_ack狀態,等待來自客戶端的最後乙個ack。

第四次揮手(ack=1,acknum=y+1):

客戶端接收到來自伺服器端的關閉請求,傳送乙個確認包,並進入time_wait狀態,等待可能出現的要求重傳的 ack 包。伺服器端接收到這個確認包之後,關閉連線,進入closed狀態。

客戶端等待了某個固定時間(兩個最大段生命週期,2msl,2 maximum segment lifetime)之後,沒有收到伺服器端的 ack ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入closed狀態。

四次揮手

wireshark抓取三次揮手過程:

第一次揮手,客戶端發出。這次斷開連線時客戶端發出的,但實際上,客戶端和伺服器都可以主動發出斷開連線。

seq值為f5 75 6a b4。

第二次揮手,服務端發出。

seq值為61 d3 6c 82, acknumber為f5 75 6a b5, 是第一次揮手的seq值加1。

第三次揮手,服務端發出。

seq值為61 d3 6c 82, acknumber為f5 75 6a b5, 是第一次揮手的seq值加1。

第四次揮手,客戶端發出。

acknumber為f5 75 6a b5, 是第2/3次揮手的seq值加1

補充:為什麼建立連線協議要三次握手,而關閉連線卻是四次握手?

因為服務端的listen狀態下的socket收到syn報文的建立連線請求後,主機a可以把ack和syn(ack起應答作用,syn起同步作用)放在乙個報文裡來傳送。但是關閉連線時,當收到主機b的fin報文通知時,它僅僅表示對方沒有資料傳送了;但主機b未必將所有的資料都全部傳送給主機a了,所以主機b未必會馬上會關閉socket,也即主機b可能還需要傳送一些資料給對方之後,再傳送fin報文給主機a來表示同意現在可以關閉連線,所以這裡的ack報文和fin報文多數可以分開傳送的。

參考:

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

TCP三次握手和四次揮手

一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...

TCP三次握手和四次揮手

三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...