TCP 三次握手和四次揮手

2022-05-17 08:08:07 字數 1640 閱讀 9405

作為面試會被經常考察的的點,自己複習了一下,總結如下:

先上圖:

所謂三次握手,是指建立乙個 tcp 連線時,需要客戶端和伺服器總共傳送 3 個包。

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

建立連線時,客戶端傳送 syn 包到伺服器,並進入syn_send狀態,等待伺服器確認;

(syn 標誌位為 1,初始化序號 為 j)

第二次握手(syn=1, ack=1, ack=j+1, seq=k)

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

第三次握手(ack=1, ack=k+1)

客戶端收到伺服器的確認包 (ack),客戶端再次傳送確認包 (ack)。syn 標誌位為 0,ack 標誌位為 1,同時將確認序列號 (ack) 設定為伺服器的 isn 加 1,即 k+1。

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

上述描述可能不太好理解,我們可以理解成兩個人之間的對話:

先上圖:

由於 tcp 連線時全雙工的,因此每個方向都必須單獨進行關閉。即關閉 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狀態。

客戶端等待了某個固定時間之後,沒有收到伺服器端的 ack ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入closed狀態。

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後,它必須通知應用層另一端已經終止了那個方向的資料傳...