網絡基礎:TCP協議-如何保證傳輸的高性能

TCP高性能的保證

TCP傳輸相比於UDP傳輸,其更具有可靠性,安全性。但是傳輸效率與速度都比UDP要稍遜一籌。不過TCP協議自身是保證其效率及性能的。

TCP協議保證高性能的方式有:

  • 滑動窗口
  • 快速重傳
  • 延遲應答
  • 捎帶應答

滑動窗口

在保證TCP傳輸的可靠的性的時候,其中有一條就是確認應答。倘若是每發送一條數據,就等待一次ACK應答的話。大量的時間就會浪費在數據的往返上,這樣性能會大大降低。如果能夠一次發送多條數據,就可以大大的提高性能(實質是將多個數據等待的ACK響應時間重疊)。

窗口大小指的是無需等待ACK應答可發送的數據最大值。
這裏寫圖片描述
這裏寫圖片描述
如圖,假設窗口大小爲4000。那麼就是是說圖上1001~5001之間的數據是可以一次性全部發送,並且不需要等待ACK響應的。當發送完這4000的數據後,此時等待。等到ACK響應中確認收到1001~2000的數據時,滑動窗口右移。
這裏寫圖片描述

以此類推。滑動窗口內部的數據都是已經發送但是沒有收到ACK應答的數據。滑動窗口左側的都是已經收到了ACK應答的數據。滑動窗口右側是未發送的數據。

操作系統維護滑動窗口時,需要開闢一個發送緩衝區,緩衝區內的記錄了沒有被應答的數據。只有去確認過應答的數據才能夠被緩衝區刪除掉。

滑動窗口處理丟包問題

丟包問題主要有兩種情況:

  1. 發送端發送的數據丟包
  2. 接收端的ACK響應丟包
發送端發送的數據丟包

這裏寫圖片描述

這裏1001~2000的數據報文丟失,此時發送端並不知道,繼續發送滑動窗口內的報文。這時候接收到了三條重複的ACK響應(TCP協議規定,收到三條相同的ACK響應就出發重傳)。此時重傳1001~2000的數據報文。重傳完畢後,等待接收端的響應。此時接收端響應爲下一條是6001的數據報文,也就是說在2001~6000的報文都接收到了,這段報文被放到了接收端的接收緩衝區中。那麼此時滑動窗口繼續移動,發送端繼續發送。

這個接收到三個重複的ACK響應,就開始重傳響應所要求的報文的機制就是快重傳速機制。

注:快重傳機制與超時重傳機制不同,超時重傳機制應用於沒有任何一條ACK響應收到,而超時時間已經到達,則出發超時重傳;而快速重傳機制是接收到了重複的三條ACK響應才觸發。兩者缺一不可!!
接收端ACK響應丟包

這裏寫圖片描述

接連三條的ACK響應都丟包,但是第四條ACK響應到達。此時並不會影響發送端的發送。因爲ACK響應的是下一條數據包是4001,這意味着接收端已接收到前面的所以報文數據。所以接收端ACK響應丟包其實對發送端發送的影響並不是那麼大,後續的ACK響應能夠處理好這個問題。

延遲應答

我們知道,TCP傳輸的效率是由接收端的窗口大小決定。窗口越大,網絡的吞吐量就越大,傳輸效率就越高。在避免網絡阻塞的前提下進程提高傳輸效率。 而窗口大小就是每次接收端接收到數據後,發送 ACK響應中保存的一個字段。

比如說接收端接收緩衝區起初大小爲 1 M,發送端發送500K的數據供接收端處理,接收端收到後,立刻進行ACK應答,此時的窗口大小應該是500K。倘若接收端處理剛剛接收的500K數據速度很快,在ACK應答還沒有到達的時候已經處理完了,這個時候實際上窗口大小是1M,但是由於響應的過快,發送端收到ACK響應時默認的窗口大小是500K,這就變相的浪費了500K的空間。如果能夠在收到數據時,延遲一會再應答,那麼可能就將一些簡易處理的數據已經處理完畢了,這樣的話,使得窗口大小變大,從而增加傳輸的效率。

延遲應答的規則:

  • 數量限制:每個N個包就應答一次
  • 時間限制:超過最大延遲時間就應答一次

具體的數量以及時間限制與操作系統有關。一般情況數量取 2,最大延遲時間取200ms。

捎帶應答

在兩主機之間通信時,常常採用捎帶應答的方式來提高效率。而ACK響應常常伴隨着數據報文共同傳輸。比如說TCP連接的三次握手時,在服務器收到SYN請求報文後,也會給客戶端發送SYN請求,這時候服務器對於剛纔客戶端SYN請求的ACK應答就隨着服務器發送的SYN請求一併過去,這個過程就是捎帶應答。


歡迎大家共同討論,如有錯誤及時聯繫作者指出,並改正。謝謝大家!

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