TCP慢啟動算法


慢啟動定義

慢啟動,是傳輸控制協議使用的一種阻塞控制機制。慢啟動也叫做指數增長期。慢啟動是指每次TCP接收窗口收到確認時都會增長。增加的大小就是已確認段的數目。這種情況一直保持到要么沒有收到一些段,要么窗口大小到達預先定義的閾值。如果發生丟失事件,TCP就認為這是網絡阻塞,就會采取措施減輕網絡擁擠。一旦發生丟失事件或者到達閾值,TCP就會進入線性增長階段。這時,每經過一個RTT窗口增長一個段。

慢啟動解析

 發送方一開始便向網絡發送多個報文段,直至達到接收方通告的窗口大小為止。當發送方和接收方處於同一個局域網時,這種方式是可以的。但是如果在發送方和接收方之間存在多個路由器和速率較慢的鏈路時,就有可能出現一些問題。
一些中間路由器必須緩存分組,並有可能耗盡存儲器的空間。
現在,TCP需要支持一種被稱為“慢啟動(slow start)”的算法。該算法通過觀察到新分組進入網絡的速率應該與另一端返回確認的速率相同而進行工作。
慢啟動為發送方的TCP增加了另一個窗口:擁塞窗口(congestion window),記為cwnd。當與另一個網絡的主機建立T C P連接時,擁塞窗口被初始化為 1個報文段(即另一端通告的報文
段大小)。每收到一個ACK,擁塞窗口就增加一個報文段( c w n d以字節為單位,但是慢啟動以報文段大小為單位進行增加)。發送方取擁塞窗口與通告窗口中的最小值作為發送上限。擁
塞窗口是發送方使用的流量控制,而通告窗口則是接收方使用的流量控制。發送方開始時發送一個報文段,然后等待 A C K。當收到該A C K時,擁塞窗口從1增加為2,即可以發送兩個報文段。當收到這兩個報文段的 A C K時,擁塞窗口就增加為4。這是一種指數增加的關系。

在某些點上可能達到了互聯網的容量,於是中間路由器開始丟棄分組。這就通知發送方它的擁塞窗口開得過大。當我們在下一章討論 T C P的超時和重傳機制時,將會看到它們是怎樣對擁塞窗口起作用的。現在,我們來觀察一個實際中的慢啟動。


慢速網絡例子


下圖表示的是將從主機sun發送到主機vangogh.cs.berkeley.edu的數據。這些數據將通過一個慢的SLIP鏈路,該鏈路是TCP連接上的瓶頸(我們已經在時間系列上去掉了連接建立的過程)。

我們觀察到發送方發送一個長度為5 1 2字節的報文段,然后等待ACK。該ACK在716 ms后收到。這個時間是一個往返時間的指示。於是擁塞窗口增加了 2個報文段,且又發送了兩個報
文段。當收到報文段5的ACK后,擁塞窗口增加為3。此時盡管可發送多達3個報文段,可是在下一個ACK收到之前,只發送了2個報文段。

 

正常網絡例子

在一個正常的網絡,服務端在公網,客戶端是一台虛擬機,通過客戶端223.226.200.34,每次發送大小為102400大小數據到服務端223.226.200.200,循環次數是1000次。雙方的網絡良好,最開始的時候可以達到客戶端每發送一個數據,服務端就發送一次ack,如下:

17:11:42.437707 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 1:1025, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961746], length 1024
17:11:42.437721 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 1025, win 33, options [nop,nop,TS val 972961748 ecr 2003558], length 0
17:11:42.437805 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 1025:2485, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961746], length 1460
17:11:42.437816 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 2485, win 38, options [nop,nop,TS val 972961748 ecr 2003558], length 0
....
17:11:42.468767 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 24025:25461, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961753], length 1436
17:11:42.468780 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 25461, win 83, options [nop,nop,TS val 972961756 ecr 2003558], length 0


大家可以看到兩個報文之間的時間差不超過50ms左右,一般是20ms。

但是后來,可能是由於一些中間路由器必須緩存分組,並有可能耗盡存儲器的空間。導致服務端不能及時響應,確認數據,如下:

17:11:42.468965 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [.], seq 25461:26897, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961753], length 1436
17:11:42.469200 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 26897:28333, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961753], length 1436
......
17:11:42.478755 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 52745:54181, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961756], length 1436
17:11:42.507104 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 54181, win 27, options [nop,nop,TS val 972961766 ecr 2003558], length 0
17:11:42.516476 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 54181:55617, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
17:11:42.516597 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 55617:57053, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
......
17:11:42.517263 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 64233:65669, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
17:11:42.517437 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 65669:67105, ack 1, win 64240, options [nop,nop,TS val 2003558 ecr 972961766], length 1436
17:11:42.555104 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 67105, win 2, options [nop,nop,TS val 972961778 ecr 2003558], length 0
17:11:47.457101 IP 223.226.200.34.42567 > 223.226.200.200.6888: Flags [P.], seq 67105:68129, ack 1, win 64240, options [nop,nop,TS val 2003608 ecr 972961778], length 1024
17:11:47.457116 IP 223.226.200.200.6888 > 223.226.200.34.42567: Flags [.], ack 68129, win 0, options [nop,nop,TS val 972963003 ecr 2003608], length 0


可以看到這里客戶端連續發送數據到服務端的這些報文里,每兩個報文之間的時間差比較大,基本都達到100ms以上的差距,所以可以確定是由於服務器發送ack報文過遲,發送方才會根據擁塞窗口大小,連續發送多個報文段。

另外,這里的服務端代碼中是自己的程序,並沒有read數據,所以會見到win越來越小。直到最后win為0,無法接收任何數據。

參考資料:TCP/IP詳解卷一


免責聲明!

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



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