TCP 三次握手:
第一次握手?:
- 初始狀態:開始時,客戶端處于?
CLOSED
(關閉)狀態,服務端處于?LISTEN
(監聽)狀態,等待客戶端的連接請求。 - 客戶端發送請求:客戶端向服務端發送一個?
SYN
(Synchronize Sequence Numbers,同步序列號)報文,該報文將?SYN
?標志位置為 1,表示這是一個連接請求報文。同時,客戶端會隨機初始化一個序列號(seq=x
,這里的?x
?是一個隨機生成的數值),并將此序列號置于 TCP 首部的「序號」字段中。此報文不包含應用層數據,發送完后,客戶端進入?SYN_SENT
(已發送 SYN 報文等待確認)狀態。
第二次握手?:
- 服務端接收并響應:服務端收到客戶端的?
SYN
?報文后,知道客戶端想要建立連接。服務端會以自己的?SYN
?報文作為應答,并且也隨機初始化自己的序號(seq=y
,y
?也是一個隨機生成的數值),將此序號填入 TCP 首部的「序號」字段中。同時,把客戶端的?seq
?值加 1(即?ack=x+1
)作為?ACK
(Acknowledgment,確認)的值,表示自己已經收到了客戶端的?SYN
,接著把?SYN
?和?ACK
?標志位置為 1。 - 服務端發送報文:最后把該報文發給客戶端,此報文也不包含應用層數據。發送完這個報文后,服務端進入?
SYN_RCVD
(已收到 SYN 報文等待客戶端確認)狀態。
第三次握手:
- 客戶端確認:客戶端收到服務端的?
SYN+ACK
?報文后,會對服務端的?SYN
?分組進行確認。客戶端將?ACK
?標志位置為 1,確認序號?ack=y+1
(這里的?y
?是服務端在第二次握手中發送的序列號),并且把自己的序列號加 1(即?seq=x+1
,這里的?x
?是客戶端在第一次握手中發送的序列號),然后將該報文發送給服務端。此報文可以攜帶客戶到服務端的數據,但如果不攜帶數據,則不消耗序號。 - 連接建立:服務端收到客戶端的確認報文后,也進入?
ESTABLISHED
(已建立連接)狀態。至此,客戶端和服務端都完成了三次握手,雙方的 TCP 連接正式建立,之后就可以開始相互發送數據了。
第一次握手斷開:客戶端會在一段時間后超時并重傳?SYN
?報文,以嘗試重新建立連接。
第二次握手斷開:客戶端也會進行重傳?SYN
?報文。而服務器端在發送?SYN-ACK
?報文后,會進入?SYN_RCVD
(已收到?SYN
?報文等待客戶端確認)狀態,并等待客戶端的?ACK
?報文。如果服務器端在一段時間內沒有收到客戶端的?ACK
?報文,也會認為連接建立失敗,并釋放為此次連接申請的資源。
第三次握手斷開:服務器端由于沒有收到客戶端的確認報文,會多次重傳?SYN-ACK
?報文,等待客戶端的回應。最終會認為連接建立失敗,并釋放相關資源。客戶端在發送?ACK
?報文后,會認為連接已經建立成功。當客戶端后續向服務器發送數據時,服務器會以?RST
(復位)包響應客戶端,客戶端收到?RST
?包后,就會意識到連接出現了問題。
TCP 四次揮手:
第一次揮手?客戶端發出連接釋放報文,并且停止發送數據。
第二次揮手?服務器端接收到連接釋放報文后,發出確認報文,服務端就進入了CLOSE-WAIT 關閉等待狀態
第三次揮手?客戶端接收到服務器端的確認請求后,客戶端就會進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文,服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認
第四次揮手 客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態,但此時TCP連接還未終止,必須要經過2MSL后(最長報文壽命),當客戶端撤銷相應的TCB后,客戶端才會進入CLOSED關閉狀態,服務器端接收到確認報文后,會立即進入CLOSED關閉狀態,到這里TCP連接就斷開了,四次揮手完成