TCP的3次握手和4次揮手過程
阿新 • • 發佈:2018-12-26
建立連線(3次握手)
- SYN是標誌位,設定SYN=1,表示請求建立連線
- 服務端會同時和多個客戶端建立連線,所以在報文互動時,需要帶上序號seq,在響應是seq+1,以此來檢測報文合法性
連線過程
- 客戶端:我想建立一個連線。狀態:CLOSED -> SYN SENT
- 服務端:可以,我同意建立連線。狀態:LISTEN -> SYN RCVD
- 客戶端:好的,我收到你的確認,我準備好接收資料了。狀態:SYN SENT -> ESTABLISHED
- 服務端聽到客戶端準備好了,也進入準備狀態。狀態:SYN RCVD -> ESTABLISHED
至此,TCP連線就建立完畢,開始互相傳送資料了。
斷開連線(4次揮手)
- 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 | 雙方同時嘗試關閉,等待對方確認 |