如今的網路頻寬在逐步的提高,延遲反而成了影響網路效能的重要原因。tcp 的多種機制會導致新建的連線一開始效能不高的問題。這都是為了防止tcp網路擁堵崩潰而加入的慢啟動機制。
tcp 的連線建立需要經過三次握手過程,當然 tfo(tcp fast open)機制在一定程度上減少了握手的時間。在網際網路上非常短的 tcp 連線非常常見,因此延遲所帶來的影響也就非常可觀,tcp 的復用也就成為了提高效能的乙個有效手段。
熟悉tcp的應該都很熟悉這張圖,tcp建立連線的三次握手階段,三次握手之後客戶端與伺服器之間就可以通訊了,客戶端可以在傳送 ack 之後立即傳送資料,而伺服器必須等接收到 ack 分組之後才能傳送資料。因此每次傳輸應用資料之前,都必須耗費乙個 rtt 在握手階段。
tfo 可以在支援的情況下,依賴加密的 cookie,可以隨同 syn 分組一起傳送應用資料,但是資料淨荷會有限制,而且只能應用在重複的連線上。
在節點頻寬不對稱的網路中,為了防止資料爆發導致的網路崩潰,tcp 中使用了很多的機制,控制雙方傳送資料的速度,流量控制,擁塞控制和擁塞預防。
tcp 使用接收視窗(rwnd)來控制傳送端過多的向接收端傳送資料,建立連線時,兩端使用自身系統預設的 rwnd 值來設定儲存資料的緩衝區大小。然後每個 ack 分組會通知最新的 rwnd 值,方便兩端動態的調整資料流速。
tcp 最初的規範分配給通知視窗大小的字段是 16 位,相當於接收視窗的最大值為 65535 位元組,在 rfc 1323 中提供了 tcp window scaling 選項,可以左移 16 位視窗字段,接收視窗的最大值提高到 1g 位元組。
流量控制可以有效的防止傳送端過多的傳送資料,但是在連線建立之初並不知道可用頻寬是多少,依然有可能在建立之初就傳送了過多的資料,導致網路擁塞崩潰。
因此又引入了擁塞視窗大小(cwnd),表示傳送端對從客戶端接收到確認 ack 之前可以傳送的資料量的限制。
兩端的 cwnd 值是在本地根據演算法確定的,兩端不會通知對方 cwnd,cwnd 具有乙個初始值,最初是 1 個 tcp 段,rfc 2581 調整為 4 個,rfc 6928 再次調整為 10 個,(乙個 tcp 段是1460 位元組)tcp 建立好之後,傳送端能夠傳送資料的大小為 rwnd 和 cwnd 的最小值,在收到分組確認 ack 之後增大 cwnd 的大小,慢慢的加快傳送資料量,直到超過 rwnd 的值,也就是所謂的慢啟動。
那麼在丟包之後又怎麼處理呢,這時候擁塞預防演算法就介入了。
aimd 倍減加增演算法,發生丟包時,先將擁塞視窗減半,然後每次往返再緩慢的給視窗增加乙個固定的值。這種演算法比較保守,有時候達不到最高的效果。
linux 3.2+ 之後預設採用 prr 比例降速演算法,tcp 中還有非常多的演算法來確保快速恢復,有空再來研究~~~
tcp 中還有乙個 ssr(slow-start restart,慢啟動重啟)機制,就是在連線空閒一定時間後重置連線的擁塞視窗。ssr 對於會出現突發空閒的長週期 tcp 連線有比較大的影響,有一種建議是最好在伺服器上禁用。
擁塞視窗 cwnd 和 接收視窗 rwnd 的最小值限制了在途未確認的最大資料量,兩端之間的資料超過了未確認的最大資料量,都必須等到另一方的 ack 確認才能繼續傳送資料。所以應該讓視窗足夠的大,只要傳輸不中斷,才能保證最大的吞吐量。
那麼最優的視窗大小的值多大才合適?tcp 引入乙個頻寬延遲積的概念(bdp, bandwidth-delay product),既資料鏈路的容量與端到端延遲的乘積。這個結果就是任意時刻處在於在途未確認狀態的最大資料量,也即是視窗大小的最優值。
tcp 是乙個可靠的傳輸協議,分組資料必須按序交付,如果中途有分組丟失沒能到達接收端,那麼後續分組必須儲存在接收端的緩衝區中,等待丟失的分組重發並到達接收端。
這就會導致分組到達時間存在無法預知的延遲變化,通常稱之為 抖動(jitter) ,也是影響應用程式效能的乙個主要因素。
1、使用最新版本的**
2、適當的開啟 tfo 機制
3、保證tcp視窗足夠的大
4、盡可能的重用 tcp 連線
5、一定要新建連線的情況下,盡早去做
6、結合 dns 優化
TCP慢啟動 擁塞避免 快速重傳 快速恢復
慢啟動,是傳輸控制協議使用的一種阻塞控制機制。慢啟動也叫做指數增長期。慢啟動是指每次tcp接收視窗收到確認時都會增長。增加的大小就是已確認段的數目。這種情況一直保持到要麼沒有收到一些段,要麼視窗大小到達預先定義的閾值。如果發生丟失事件,tcp就認為這是網路阻塞,就會採取措施減輕網路擁擠。一旦發生丟失...
TCP協議的慢啟動
tcp協議的慢啟動 傳統的tcp協議慢啟動時的演算法是每次收到新的ack則視窗 1,即cwnd cwnd 1 而很多演算法對tcp實現改進也是從這裡入手,因為這樣的演算法,視窗值是隨著rtt時間指數增長的。為什麼說是隨著rtt時間指數增長的?這裡解釋一下。www.2cto.com 例如某一次傳送過程...
TCP 慢啟動簡介
內容絕對正確,所 以請讀者抱著懷疑的態度閱讀本部落格內的文字。如果讀 者因本部落格內的文字造成損失,本人 無力負責。如果有任何謬誤或者問題,希望讀者不吝賜教。在廣域網,tcp報文可能要經過多個路由器和速率較慢的鏈路。如果傳送方一開始就向網路 傳送多個報文段,則中間路由器的緩衝負擔會立刻加重,很可能致...