1. 程式人生 > >TCP的3次握手和4次揮手過程

TCP的3次握手和4次揮手過程

建立連線(3次握手)

TCP3次握手.png

  • SYN是標誌位,設定SYN=1,表示請求建立連線
  • 服務端會同時和多個客戶端建立連線,所以在報文互動時,需要帶上序號seq,在響應是seq+1,以此來檢測報文合法性

連線過程

  • 客戶端:我想建立一個連線。狀態:CLOSED -> SYN SENT
  • 服務端:可以,我同意建立連線。狀態:LISTEN -> SYN RCVD
  • 客戶端:好的,我收到你的確認,我準備好接收資料了。狀態:SYN SENT -> ESTABLISHED
  • 服務端聽到客戶端準備好了,也進入準備狀態。狀態:SYN RCVD -> ESTABLISHED

至此,TCP連線就建立完畢,開始互相傳送資料了。

斷開連線(4次揮手)

TCP4次揮手.png

  • FIN是標誌位,設定FIN=1,表示請求斷開連線

斷開連線過程

  • 客戶端:我資料發完了,我要斷開連線了。狀態:ESTABLISHED -> FIN WAIT 1
  • 服務端:好,我知道你要斷開連線了。狀態:ESTABLISHED -> CLOSE WAIT

此時,客戶端確認服務端已經知道要斷開了。但是,服務端可能還有資料沒傳送完,所以客戶端還能接收資料但不會發送資料。狀態:FIN WAIT 1 -> FIN WAIT 2

過了一會,服務端資料發完了。
* 服務端:我準備好了,斷開連線吧。狀態:CLOSE WAIT -> LAST ACK
* 客戶端:好,那我斷開連線了,再見。狀態:FIN WAIT 2 -> TIME WAIT
* 服務端:客戶端已經斷開了,我也斷開吧。狀態:LAST ACK -> CLOSED
* 客戶端等待2個MSL時間以後斷開連線,狀態:TIME WAIT -> CLOSED

TCP握手揮手的狀態

狀態 描述
CLOSED 關閉狀態,沒有連線活動或正在進行
LISTEN 監聽狀態,伺服器正在等待連線進入
SYN SENT 已經發出連線請求,等待確認
SYN RCVD 收到一個連線請求,尚未確認
ESTABLISHED 連線建立,正常資料傳輸狀態
FIN WAIT 1 (主動關閉)已經發送關閉請求,等待確認
FIN WAIT 2 (主動關閉)收到對方關閉確認,等待對方關閉請求
TIME WAIT 完成雙向關閉,等待所有分組死掉
CLOSE WAIT (被動關閉)收到對方關閉請求,已經確認
LAST ACK (被動關閉)等待最後一個關閉確認,並等待所有分組死掉
CLOSING 雙方同時嘗試關閉,等待對方確認