複習題——計算機網絡之TCP的三次握手和四次揮手

TCP是什麼?(What)

TCP(Transmission Control Protocol)傳輸控制協議,是一種面向連接的、可靠的傳輸層通信協議。

 

TCP的目的?(Why)

爲了在不可靠的互聯網絡上提供可靠的端到端字節流,或說提供可靠鏈接和可靠的信息傳送。

 

TCP是如何達成目的?(How)

   1:在可靠信息傳輸前建立可靠的連接(三次握手)

   什麼是可靠的信息傳輸?   

   發送信息且收到確認信息表示發送信息是可靠傳輸的。

   TCP 的可靠數據傳輸是靠 seq( sequence numbers 序列號)和ack(Acknowledge character確認號)來達成的。

  如果通信一方A能發送一份攜帶seq=x的信息給通信另一方B,且之後A又能收到一份B發送的攜帶ack=x+1的確認信息,則說明這次A到B的數據傳輸是可靠的。

 

  爲什麼需要建立可靠連接,即爲什麼要三次握手,而非直接數據傳輸?

  但因爲網絡是不穩定的,可能會出現丟包或報文延遲到達的現象。

  第一次A向B發送信息Q1時,

  B可能 1:報文丟失收不到   2:報文延遲不能立即收到   3:收到了但發送給A確認信息包,出現如1,2種情況導致A接收不到。

  因爲接受不到B的確認信息,A會重新給B再發生一條信息Q2,而Q2也同樣遇到上面的出現幾種問題,即網絡擁塞。

  爲了避免網絡擁塞而導致的重複發送大容量數據包而再導致網絡更加擁塞的這種惡性循環發生。

  在可靠傳輸數據的前,我們可先嚐試建立輕量化的連接(只傳輸必要信息),若連接成功連接再傳輸數據。

  (一般來說,如果可靠連接能建立,網絡運行狀態則大概率是通暢的。若在可靠連接建立後網絡變差,又出現丟包延遲等現象,這就需要更多的操作這裏先不加贅述。但先建立輕量級連接而非直接傳輸數據是有利且必要的。)

  爲了建立可靠連接,從而達到可靠數據傳輸。TCP採用三次握手的方式來建立可靠的連接,並採用四次揮手方式結束這次連接。

 

  爲什麼是三次握手,而不是兩次或四次?

  三次是必要的,正如之前所說,發送信息且收到確認信息只能表示發送信息方是可靠傳輸的,而不能說明確認信息方是可靠的(對方無法確認你有沒有收到)。所以在發送信息(一次連接)後對方回覆確認信息(二次連接)後需要第三次連接,來證明不僅僅是A->B通,且B->A通。之於爲什麼不是四次,因爲三次就夠了。

   這可能和下面的觀點”防止已失效的鏈接請求報文突然傳輸到服務器"不同:

   這當然也是一種的思考角度,依照他的想法,“三次握手”處理滯留的報文,不在兩次握手中開始蘇劇傳遞是爲了不浪費服務器資源。而我的想法是1,2次握手使A知道A->B可通,2,3次握手使B知道B->A可通,雙方相互可通則連接穩定。

   哈,這種情況我一般會合起來看。結合主流觀點和自己觀點。或許有一天發現那個地方需要再修改也不遲。

   現在來總結一下答案。

    爲什麼是三次握手,而不是兩次或四次?

    如果是兩次握手,A發送請求建立給B後,B確認一下後立馬開始發生數據信息給A。可能會導致,在網絡中滯留的A之前發送的“無效的”請求報文到達B後,B直接發送A數據,而這些數據是“不必要”傳輸,可見兩次握手可能會浪費資源。所以需要三次握手,第三次握手是對前面兩份信息的確認,確認一下此次連接的雙方初始seq,同時也變現確認兩次了網絡的數據可達。至此便可開始傳輸數據,而無需多餘握手。

 

   下面想講下其中兩個比較重要的標誌位

           SYN: 同步序列編號(Synchronize Sequence Numbers),SYN = 1,請求建立連接。握手完後SYN=0。

           ACK: 確認字符 (Acknowledge character),當ACK=1時,確認號字段纔有效。ACK=0時,確認號無效

    接下來是保證TCP可靠數據傳輸的最重要的兩個字段

            seq:通信雙方在建立連接時都會產生一個“唯一”的seq,用於標識數據與接受對應ack。之後seq在不斷累加。

            ack:確認號,當前報文段最後一個字節的編號+1即爲確認號。很多資料上說這是期待下一個seq的編號,其實我認爲它的副作用確實是有這方面的,但主要的是確認了我收到你的seq,告訴對方你的信息傳輸可靠。

            seq和ack貫穿TCP數據傳輸始終,即從開始建立連接,數據正式傳輸和結束連接,都需要seq和ack不斷的確認可靠性。

   其他份參考資料:

                     https://www.cnblogs.com/bj-mr-li/p/11106390.html

                     https://www.zhihu.com/question/24853633

                     https://blog.csdn.net/justloveyou_/article/details/78303617?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.compare


                   

爲什麼採取四次揮手方式結束這次連接

   當我們不再需要TCP連接傳輸數據時,我們應當結束連接,減少資源消耗。

   下面是四次揮手的具體過程

   1.當一方A主動要求結束連接時,發生FIN=1(一次揮手)給另一方B。

   2.B收到FIN=1的消息後報告,通知A已確認收到消息發送ACK=1(兩次揮手),但存在有一部分數據仍需發生

   3.直到B將所有需要的信息發送於A,最終發送FIN=1,ACK=1(三次揮手)的信息給A

   4.A收到後回覆ACK=1(四次揮手),開闢2MSL確認再無B信息後,關閉本次TCP連接

   可以說,四次揮手之於三次握手,多在了第三次揮手。B因爲是被動關閉,可能存在爲沒有發送完全的信息,要等待信息發送完全後再發送消息給A。而第二次揮手卻不能少,否則A將不知道B有沒有收到停止的信息,並不斷髮生FIN=1給B(B需要即使反應A的請求,而非先幹自己的幹完了再通知A)。

   至於等待2MSL,是因爲這是這次通信時的最後一次,是沒有確認信息的,無法保證最後一句的的可靠。若B收不到A的最後一句會發送消息給A,A需要即使處理(爲了讓B休息),所有需要保持2MSL的可處理時間(MSL:MaximumSegmentLifetime報文最大生存時間)變向的確認B收到了信息。

 

    TCP其中還有許多保持可靠傳輸的方法,三次握手僅是其中一種。

    從三次握手中,可以引發的我的思考有:

    1、可用seq序號和ack確認號作爲一種確認機制,保證在不穩定的通信能找到丟失的包,然後進行重新發送

    2、在大數據傳輸前,可用試探機制(建立連接)確認網絡通暢,避免一開始就傳輸“浪費資源的”大文件

    3、在傳輸最後一句報文時,可採用等待2MSL方式無響應的方式(無法採用等待ACK的方式),來解決最後一文的傳輸問題。

    4、可靠的數據傳輸不是保證不丟包,而是保證你能不能發現丟的包是什麼並處理丟的包或傳輸慢的報文。可靠應指所有必要傳輸的報文都傳遞到了。

    .....

 

本文僅爲整理了個人觀點所做,可能存在偏差,若有歡迎指出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章