慢啓動,是傳輸控制協議使用的一種阻塞控制機制。慢啓動也叫作指數增加期。慢啓動是指每次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個報文段。code
在一個正常的網絡,服務端在公網,客戶端是一臺虛擬機,經過客戶端223.226.200.34,每次發送大小爲102400大小數據到服務端223.226.200.200,循環次數是1000次。雙方的網絡良好,最開始的時候能夠達到客戶端每發送一個數據,服務端就發送一次ack,以下:blog
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,沒法接收任何數據。io