TCP的三次握手和四次揮手


原文永久鏈接:https://github.com/AttemptWeb/Record/issues/10

上面有一篇專門介紹過TCP和UCP協議,其中只是粗略的提到TCP協議的三次握手,而四次揮手完全沒有說到,所以這次專門總結了這篇文章,專門講講三次握手和四次揮手。

備注:(下文中提到的專業術語)

ack —— 確認號碼

seq —— 順序號碼

ISN —— 初始序列號

ACK —— 確認,使得確認號有效(握手使用)

SYN —— 用於初始化一個連接的序列號,建立聯機

FIN —— 該報文的發送方已經結束向對方發送數據

#TCP的三次握手

三次握手 實際就是Client端和Server端建立穩定TCP連接的發送三個包的過程。

img1

  • 第一次握手:(SYN=1, ACK=0, seq=x):

    Client發送SYN標志位1的包到Server,以及初始序號x(保存在包頭的序列號seq字段,簡稱ISN),和ACK標志位為0,並進入SYN_SEND狀態,等待Server確認。

  • 第二次握手:(SYN=1, ACK=1, seq=y, ack=x+1):

    Server發回確認包(ACK)應答。即 SYN 標志位和 ACK 標志位均為1。Server確認ISN序列號,放到seq域里,同時將確認序號(ack)設置為Client的ISN加1,即x+1。 發送完畢后,Server進入 SYN_RCVD 狀態。

  • 第三次握手:(ACK=1,seq=x+1,ack=y+1)

    Client再次發送確認包(ACK),ACK標志位為1,並且把Server發來ISN的序號字段+1,放在確定字段中發送給對方。

發送完畢后,Client和Server建立連接,TCP 握手結束。

#TCP四次揮手

四次揮手 實際就是Client端和Server端關閉TCP連接的發送四個包的過程。

img23

  • 第一次揮手(FIN=1,seq=u)

Client 想要關閉連接,Client 會發送一個FIN標志位置為1,當前序列號為u的包,表示需要關閉連接了。Client進入 FIN_WAIT_1 狀態。

  • 第二次揮手(ACK=1,seq=v,ack=u+1)

Server收到Client的FIN包之后,會發送一個確認序號為收到的序列號u+1的包,表明自己接受到了Client關閉連接的請求,但還未准備好關閉連接。Server進入 CLOSE_WAIT 狀態,Client進入 FIN_WAIT_2 狀態。

  • 第三次揮手(FIN=1,ACK=1,seq=w,ack=u+1)

當Server將剩余數據發送完之后,會發送一個自己的FIN包,序列號為u+1。Server進入 LAST_ACK 狀態,等待來自Client的最后一個ACK。

  • 第四次揮手(ACK=1,seq=u+1,ack=w+1)

Client接收到來自Server端的關閉請求之后,發送最后一個ACK確認包,確認序號設置為收到序號加1。Client進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK 包。Server接收到這個確認包之后,關閉連接,進入CLOSED狀態。(Client會等待2MSL之后,沒有收到Server的ACK ,就確認Server進入CLOSED狀態,自己也關閉進入CLOSED狀態。)

發送完畢后,Client和Server斷開連接,TCP 揮手結束。

以上就是這次揮手和握手的全部內容了,如果有疑問歡迎留言哦。

#參考資料

知乎:“三次握手,四次揮手”你真的懂嗎?

bilibili: 計算機網絡TCP傳輸層連接管理

ps: 順便推一下自己的個人公眾號:Yopai,有興趣的可以關注,每周不定期更新,分享可以增加世界的快樂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM