TCP如何保證可靠性?


TCP如何保證可靠性?


TCP協議傳輸的特點主要就是面向字節流、傳輸可靠、面向連接。本篇文章,我們就重點討論一下TCP協議如何確保傳輸的可靠性的。

TCP協議保證數據傳輸可靠性的方式主要有:

1. 校驗和

2. 序列號

3. 確認應答

4. 超時重傳

5. 連接管理

6. 流量控制

7. 擁塞控制


二、確認應答與序列號

序列號:TCP傳輸時將每個字節的數據都進行了編號,這就是序列號。


確認應答:TCP傳輸的過程中,每次接收方收到數據後,都會對傳輸方進行確認應答。也就是發送ACK報文。這個ACK報文當中帶有對應的確認序列號,告訴發送方,接收到了哪些數據,下一次的數據從哪裡發。


序列號的作用不僅僅是應答的作用,有了序列號能夠將接收到的數據根據序列號排序,並且去掉重複序列號的數據。這也是TCP傳輸可靠性的保證之一。


三、 超時重傳


在進行TCP傳輸時,由於確認應答與序列號機制,也就是說發送方發送一部分數據後,都會等待接收方發送的ACK報文,並解析ACK報文,判斷數據是否傳輸成功。如果發送方發送完數據後,遲遲沒有等到接收方的ACK報文,這該怎麼辦呢?而沒有收到ACK報文的原因可能是什麼呢?


發送方沒有接收到ACK響應的原因:其中一方出現了網絡問題。


1. 數據發送方:數據發送過程中有由於網絡問題全體丟包,接收方根本沒有收到數據。

2. 數據接收方:數據拿到了。但是發送ACK報文的時候由於網絡問題,發送失敗。


為了解決丟包問題導致的【確認應答、序列號】機制失效,TCP引入了超時重傳機制。簡單的理解就是在發送方發送數據後的一段時候內,如果沒有接收到接收方的ACK響應,那麼剛剛發送的數據需要重新發送。對應上面說到的兩種原因,如果是數據發方的問題,數據重新發送,數據接收方進行響應ACK;如果是數據接收方的問題,數據發送過來之後,接收方根據序列號判斷是否是重複數據,如果是直接丟棄,然後繼續返回ack響應。


那麼發送方發送完畢後等待的時間是多少呢?如果這個等待的時間過長,那麼會影響TCP傳輸的整體效率,如果等待時間過短,又會導致頻繁的發送重複的包。如何權衡?


由於TCP傳輸時保證能夠在任何環境下都有一個高性能的通信,因此這個最大超時時間(也就是等待的時間)是動態計算的。


四、 網絡連接


五、 流量控制


接收端在接收到數據後,對其進行處理。如果發送端的發送速度太快,導致接收端的結束緩衝區很快的填充滿了。此時如果發送端仍舊發送數據,那麼接下來發送的數據都會丟包,繼而導致丟包的一系列連鎖反應,超時重傳呀什麼的。而TCP根據接收端對數據的處理能力,決定發送端的發送速度,這個機制就是流量控制。


在TCP協議的報頭信息當中,有一個16位字段的窗口大小。在介紹這個窗口大小時我們知道,窗口大小的內容實際上是接收端接收數據緩衝區的剩餘大小。這個數字越大,證明接收端接收緩衝區的剩餘空間越大,網絡的吞吐量越大。接收端會在確認應答發送ACK報文時,將自己的即時窗口大小填入,並跟隨ACK報文一起發送過去。而發送方根據ACK報文裡的窗口大小的值的改變進而改變自己的發送速度。如果接收到窗口大小的值為0,那麼發送方將停止發送數據。並定期的向接收端發送窗口探測數據段,讓接收端把窗口大小告訴發送端。


TCP如何保證可靠性?

關於TCP流量控制以及在 Flink 中是如何實現的,可以參考這篇培訓:https://files.alicdn.com/tpsservice/fb0ce0ef70a1b938bbf95724beb231ac.pdf


六、擁塞控制


TCP傳輸的過程中,發送端開始發送數據的時候,如果剛開始就發送大量的數據,那麼就可能造成一些問題。網絡可能在開始的時候就很擁堵,如果給網絡中在扔出大量數據,那麼這個擁堵就會加劇。擁堵的加劇就會產生大量的丟包,就對大量的超時重傳,嚴重影響傳輸。


所以TCP引入了慢啟動的機制,在開始發送數據時,先發送少量的數據探路。探清當前的網絡狀態如何,再決定多大的速度進行傳輸。這時候就引入一個叫做擁塞窗口的概念。發送剛開始定義擁塞窗口為 1,每次收到ACK應答,擁塞窗口加 1。在發送數據之前,首先將擁塞窗口與接收端反饋的窗口大小比對,取較小的值作為實際發送的窗口。


擁塞窗口的增長是指數級別的。慢啟動的機制只是說明在開始的時候發送的少,發送的慢,但是增長的速度是非常快的。為了控制擁塞窗口的增長,不能使擁塞窗口單純的加倍,設置一個擁塞窗口的閾值,當擁塞窗口大小超過閾值時,不能再按照指數來增長,而是線性的增長。在慢啟動開始的時候,慢啟動的閾值等於窗口的最大值,一旦造成網絡擁塞,發生超時重傳時,慢啟動的閾值會為原來的一半(這裡的原來指的是發生網絡擁塞時擁塞窗口的大小),同時擁塞窗口重置為 1。


分享到:


相關文章: