1. 程式人生 > >TCP三次握手和四次揮手通俗理解

TCP三次握手和四次揮手通俗理解

lap 字節 是否 u+ last ble size text font

一、TCP報文格式

技術分享圖片

    在了解三次握手和四次揮手之前,先知道TCP報文內部包含了哪些東西。

  1. TCP報頭中的源端口號和目的端口號同IP數據報中的源IP與目的IP唯一確定一條TCP連接。TCP在發送數據前必須在彼此間建立連接,這裏連接意思是:雙方需要內保存對方信息(例如:IP,Port…)

  2. 報文主要段的意思

    序號:表示發送的數據字節流,確保TCP傳輸有序,對每個字節編號

    確認序號:發送方期待接收的下一序列號,接收成功後的數據字節序列號加 1。只有ACK=1時才有效。

    ACK:確認序號的標誌,ACK=1表示確認號有效,ACK=0表示報文不含確認序號信息

    SYN:連接請求序號標誌,用於建立連接,SYN=1表示請求連接

    FIN:結束標誌,用於釋放連接,為1表示關閉本方數據流

二、“三次握手”

2.1 三次握手過程

建立TCP連接時,需要客戶端和服務器共發送3個包。

  • 第一次:客戶端發送初始序號x和syn=1請求標誌

  • 第二次:服務器發送請求標誌syn,發送確認標誌ACK,發送自己的序號seq=y,發送客戶端的確認序號ack=x+1

  • 第三次:客戶端發送ACK確認號,發送自己的序號seq=x+1,發送對方的確認號ack=y+1

技術分享圖片

2.2 三次握手過程分析:

  • 第一次:客戶端發送請求到服務器,服務器知道客戶端發送,自己接收正常。SYN=1,seq=x
  • 第二次:服務器發給客戶端,客戶端知道自己發送、接收正常,服務器接收、發送正常。ACK=1,ack=x+1,SYN=1,seq=y
  • 第三次:客戶端發給服務器:服務器知道客戶端發送,接收正常,自己接收,發送也正常.seq=x+1,ACK=1,ack=y+1

上面分析過程可以看出,握手兩次達不到讓雙方都得出自己、對方的接收、發送能力都正常的結論的。

三、 “四次揮手”

3.1 四次揮手過程

  • 第一次揮手:客戶端發出釋放FIN=1,自己序列號seq=u,進入FIN-WAIT-1狀態
  • 第二次揮手:服務器收到客戶端的後,發出ACK=1確認標誌和客戶端的確認號ack=u+1,自己的序列號seq=v,進入CLOSE-WAIT狀態
  • 第三次揮手:客戶端收到服務器確認結果後,進入FIN-WAIT-2狀態。此時服務器發送釋放FIN=1信號,確認標誌ACK=1,確認序號ack=u+1,自己序號seq=w,服務器進入LAST-ACK(最後確認態)
  • 第四次揮手:客戶端收到回復後,發送確認ACK=1,ack=w+1,自己的seq=u+1,客戶端進入TIME-WAIT(時間等待)。客戶端經過2個最長報文段壽命後,客戶端CLOSE;服務器收到確認後,立刻進入CLOSE狀態。

技術分享圖片

3.2四次揮手過程分析

  • 第一次:客戶端請求斷開FIN,seq=u
  • 第二次:服務器確認客戶端的斷開請求ACK,ack=u+1,seq=v
  • 第三次:服務器請求斷開FIN,seq=w,ACK,ack=u+1
  • 第四次:客戶端確認服務器的斷開ACK,ack=w+1,seq=u+1

四、其他問題

4.1為什麽三次握手和四次揮手?

  • 三次握手時,服務器同時把ACK和SYN放在一起發送到了客戶端那裏
  • 四次揮手時,當收到對方的 FIN 報文時,僅僅表示對方不再發送數據了但是還能接收數據,己方是否現在關閉發送數據通道,需要上層應用來決定,因此,己方 ACK 和 FIN 一般都會分開發送。

4.2為什麽客戶端最後還要等待2MSL?

  • 客戶端需要保證最後一次發送的ACK報文到服務器,如果服務器未收到,可以請求客戶端重發,這樣客戶端還有時間再發,重啟2MSL計時。

參考:https://blog.csdn.net/u010918487/article/details/87207531

TCP三次握手和四次揮手通俗理解