學習TCP/IP - TCP三次握手連接和四次握手斷開連接


TCP連接

一、為什么需要TCP

  鏈路層將位流封裝成數據幀,同時屏蔽了底層物理層的復雜性; 網絡層定義了IP地址,划分了網段,使得源計算機可以快速找到目標計算機,但它無法保證數據准確到達. 所以在傳輸層定義了TCP協議,它是面向連接的可靠傳輸協議,

 

、TCP如何建立連接

   2.1) TCP三次握手建立連接

  

  TCP三次握手創建連接

 

    a. 由於TCP是面向連接的,所以有服務端和客戶端之分。服務端先在對應的端口監聽(LISTENING), 等待客戶端發送的tcp連接請求。

    b. A機器向B機器發起TCP連接的請求(SYN=1), 假設序列號seq=x, 此時A機器進入SYNC_SENT狀態。

      c. B機器收到請求后,對A機器的TCP請求進行確認(SYN=1,ACK=1,ack=x+1), 該數據序列號假設為y, 此時B機器進入SYNC_RCVD。

    d. A機器對B機器的確認進行確認回復(ACK=1, ack=y+1), 該數據序列號為x+1。此時A機器進入ESTABLISHED狀態。

    e. B機器收到之后,也進入ESTABLISHED狀態, 此時兩個機器已經建立了TCP連接,可以進行雙向數據傳輸。

 

 

  2.2) 為什么需要三次握手,而不是兩次

  (1) 確保雙方信息對等

  

 

 

  (2) 防止因請求超時導致臟鏈接

    a. 第一次超時, 請求包仍在網絡上傳輸

    b. A重復請求, B收到后建立連接,然后向A確認,A收到后,確認建立連接

    c. 雙方交流完畢后,斷開鏈接.

    d. 此時,B收到第一次超時的請求包,B會建立鏈接, A仍認為沒有連接. 這時,就出現了臟連接

  

  兩次握手建立連接會產生臟連接

 

  

三、TCP如何斷開連接

   3.1) 四次握手斷開連接

  

  TCP四次握手斷開連接

      a. A發送完己方數據后(FIN=1), 主動請求關閉連接, 假設序列號seq=u,  此時A進入FIN_WAIT_1

    b. B收到請求后,需要向A回復確認(ACK=1, ack=u+1), 假設序列號seq=v, 此時B進入CLOSE_WAIT,

      為什么不立即關閉呢?因為是全雙工通信, B的數據有可能尚未發送完畢

    c.  A收到確認之后進入FIN_WAIT_2

      d. B發送完數據之后(FIN=1), 向A發出信號, 假設數據序列號seq=w, (因為B會發送不定量的數據,所以序列號不確定),

      此時B進入LAST_ACK, 等待A的最后確認

    e. A收到B發完數據的消息后, 向B回復確認(ACK=1, ack=w+1),序列號seq=u+1, 此時A進入TIME_WAIT狀態, 將會等待2MSL時間

       (RFC793規定MSL為2分鍾, 實際會更小, 因為當前網絡設施比較好)

    f. B收到之后, 即進入關閉狀態CLOSED

    g. A等待了2MSL時間后, 沒有收到B的任何數據,即進入關閉狀態CLOSED

 

  3.2) 為什么要在TIME_WAIT等待2MSL時間?

   MSL是報文在網絡上生存的最大時間,超過閥值便將報文丟棄。一般來說,MSL大於TTL衰減至0的時間。在TIME_WAIT等待2MSL有以下2個原因:

       (1) 確認被動關閉方能夠順利進入CLOSED狀態

  如果A發出第4次握手的數據之后,直接進入CLOSED狀態,當B沒有收到第4次握手的數據時,會一直重發第3次握手的數據,由於A已經CLOSED,B不會停止重發數據。

       (2) 防止失效請求,確保本次連接中傳輸的數據消亡,避免失效連接的數據與正常連接的數據混淆

 

 

 

學習資料

  《碼出高效 Java開發手冊》 1.5.3 ,  1.5.4

    

 

  


免責聲明!

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



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