天天看點

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連接配接上的瓶頸(我們已經在時間系列上去掉了連接配接建立的過程)。

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,如下:

TCP慢啟動算法慢啟動定義慢啟動解析 慢速網絡例子 正常網絡例子
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      
TCP慢啟動算法慢啟動定義慢啟動解析 慢速網絡例子 正常網絡例子

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

但是後來,可能是由于一些中間路由器必須緩存分組,并有可能耗盡存儲器的空間。導緻服務端不能及時響應,确認資料,如下:

TCP慢啟動算法慢啟動定義慢啟動解析 慢速網絡例子 正常網絡例子
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      
TCP慢啟動算法慢啟動定義慢啟動解析 慢速網絡例子 正常網絡例子

可以看到這裡用戶端連續發送資料到服務端的這些封包裡,每兩個封包之間的時間差比較大,基本都達到100ms以上的差距,是以可以确定是由于伺服器發送ack封包過遲,發送方才會根據擁塞視窗大小,連續發送多個封包段。

另外,這裡的服務端代碼中是自己的程式,并沒有read資料,是以會見到win越來越小。直到最後win為0,無法接收任何資料。

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

繼續閱讀