登錄

擁塞控制

1.什么是擁塞控制

  擁塞控制是一種用來調整傳輸控制協(xié)議(TCP)連接單次發(fā)送的分組數(shù)量(單次發(fā)送量,在英文文獻和程序代碼中常叫做cwnd)的算法。它通過增減單次發(fā)送量逐步調整,使之逼近當前網(wǎng)絡的承載量。如果單次發(fā)送量為1,此協(xié)議就退化為停等協(xié)議。單次發(fā)送量是以字節(jié)來做單位的;但是如果假設TCP每次傳輸都是按照最大報文段來發(fā)送數(shù)據(jù)的,那么也可以把數(shù)據(jù)包個數(shù)當作單次發(fā)送量的單位,所以有時我們說單次發(fā)送量增加1也就是增加相當于1個最大報文段的字節(jié)數(shù)。

  網(wǎng)絡擁塞現(xiàn)象是指到達通信子網(wǎng)中某一部分的分組數(shù)量過多,使得該部分網(wǎng)絡來不及處理,以致引起這部分乃至整個網(wǎng)絡性能下降的現(xiàn)象,嚴重時甚至會導致網(wǎng)絡通信業(yè)務陷入停頓,即出現(xiàn)死鎖現(xiàn)象。擁塞控制是處理網(wǎng)絡擁塞現(xiàn)象的一種機制。

2.擁塞控制的算法

  擁塞控制假設分組的丟失都是由網(wǎng)絡繁忙造成的。擁塞控制有三種動作,分別對應主機感受到的情況:

  1.收到一條新確認。這很好,表明當前的單次發(fā)送量小于網(wǎng)絡的承載量。

  2.收到三條對同一分組的確認,即三條重復的確認。單次發(fā)送量往往大于3,例如發(fā)送序號為0、10、20、30、40的5條長度為10字節(jié)的分組,其中序號20的丟了,則返回的確認是10、20、20、20。3個20就是重復的確認。

  3.對某一條分組的確認遲遲未到,即超時。例如發(fā)送序號為0、10、20、30、40的5條長度為10字節(jié)的分組,其中序號30的丟了,則返回的確認是10、20、30、30。這才只有兩條重復確認。然而剛剛說過,單次發(fā)送量往往大于3,所以超時更可能是因為不止一條分組或確認丟失而引起的,這說明網(wǎng)絡比上一情況中的更加繁忙。

  當主機收到一條新確認,此時可以增加單次發(fā)送量。若當前單次發(fā)送量小于倍增閥限(在英文文獻和程序代碼中常叫做ssthresh),則單次發(fā)送量加倍(乘以2),即指數(shù)增長;否則單次發(fā)送量加1,即線性增長。

  當主機收到三條重復的確認——單次發(fā)送量減半,倍增閥限等于單次發(fā)送量。(進入線性增長期)

  當主機探測到超時——倍增閥限=單次發(fā)送量÷2,單次發(fā)送量=1。

3.擁塞控制的內容

  1.TCP的擁塞控制

  TCP是Internet上通用的傳輸層協(xié)議之一,是目前應用最廣泛的傳輸控制協(xié)議,其核心是擁塞控制機制?;贗nternet的交換機的通信信道、處理速度及緩沖存儲空間通常是網(wǎng)上所有主機共享的資源,也是網(wǎng)絡系統(tǒng)潛在的瓶頸。隨著信源主機數(shù)以及信源業(yè)務端業(yè)務量的不斷增多,瓶頸處就有可能發(fā)生資源競爭,從而導致網(wǎng)絡擁塞。TCP的一個重要組成部分是執(zhí)行擁塞控制和擁塞恢復的算法集合。TCP擁塞控制算法的目標是最大限度利用網(wǎng)絡帶寬,同時不產生數(shù)據(jù)流傳輸中的擁塞現(xiàn)象。因此,自從上個世紀80年代出現(xiàn)第一次擁塞崩潰以來,TCP擁塞控制策略就在不斷地進行完善和改進。

  2.傳統(tǒng)的TCP擁塞控制機制

  傳統(tǒng)的TCP中的擁塞控制機制主要是基于VanJacobson提出的"慢啟動"算法、"擁塞避免"算法和一個用于估計周轉RTT(roundtriptime)的算法。

  慢啟動算法通過觀察到新分組進入網(wǎng)絡的速率應該與另一端返回確認的速率相同而進行工作。慢啟動為發(fā)送方的TCP增加了另一個窗口:擁塞窗口(congestionwindow),記為cwnd。當與另一個網(wǎng)絡的主機建立TCP連接時,擁塞窗口被初始化為1個報文段(即另一端通告的報文段大?。?。每收到一個ACK,擁塞窗口就增加一個報文段(cwnd以字節(jié)為單位,但是慢啟動以報文段大小為單位進行增加)。發(fā)送方取擁塞窗口與通告窗口中的最小值作為發(fā)送上限。擁塞窗口是發(fā)送方使用的流量控制,而通告窗口則是接收方使用的流量控制。發(fā)送方開始時發(fā)送一個報文段,然后等待ACK。當收到該ACK時,擁塞窗口從1增加為2,即可以發(fā)送兩個報文段。當收到這兩個報文段的ACK時,擁塞窗口就增加為4,這是一種指數(shù)增加的關系。在某些點上可能達到了互聯(lián)網(wǎng)的容量,于是中間路由器開始丟棄分組。擁塞避免算法是一種處理丟失分組的方法。該算法假定由于分組受到損壞引起的丟失是非常少的(遠小于1%),因此分組丟失就意味著在源主機和目的主機之間的某處網(wǎng)絡上發(fā)生了擁塞。有兩種分組丟失的指示:發(fā)生超時和接收到重復的確認。擁塞避免算法和慢啟動算法是兩個目的不同、獨立的算法。但是當擁塞發(fā)生時,我們希望降低分組進入網(wǎng)絡的傳輸速率,于是可以調用慢啟動來作到這一點。在實際中這兩個算法通常在一起實現(xiàn)。1990年出現(xiàn)的TCPReno版本增加了"快速重傳"算法、"快速恢復"算法,避免了當網(wǎng)絡擁塞不夠嚴重時采用"慢啟動"算法而造成過大地減小發(fā)送窗口尺寸的現(xiàn)象。

  3.擁塞控制的四個階段

  a.慢啟動階段(slowstart):發(fā)送方一開始便向網(wǎng)絡發(fā)送多個報文段,直至達到接收方通告的窗口大小為止。當發(fā)送方和接收方處于同一個局域網(wǎng)時,這種方式是可以的。但是如果在發(fā)送方和接收方之間存在多個路由器和速率較慢的鏈路時,就有可能出現(xiàn)一些問題。一些中間路由器必須緩存分組,并有可能耗盡存儲器的空間。

  b.擁塞避免階段(congestionavoidance):當發(fā)現(xiàn)超時或收到3個相同ACK確認幀時,則表示有丟包事件,此時網(wǎng)絡已發(fā)生擁塞現(xiàn)象,此時要進行相應的擁塞控制。將慢啟動閾值設置為當前擁塞窗口的一半;如檢測到超時,擁塞窗口就被置為l。如果擁塞窗口小于或等于慢啟動閾值,TCP重新進人慢啟動階段;如果擁塞窗口大于慢啟動閾值,TCP執(zhí)行擁塞避免算法。

  c.快速重傳階段(fastretransmit):當TCP源端收到到三個相同的ACK副本時,即認為有數(shù)據(jù)包丟失,則源端重傳丟失的數(shù)據(jù)包,而不必等待RTO超時。同時將ssthresh設置為當前cwnd值的一半,并且將cwnd減為原先的一半。

  d.快速恢復階段(fastrecovery):當"舊"數(shù)據(jù)包離開網(wǎng)絡后,才能發(fā)送"新"數(shù)據(jù)包進入網(wǎng)絡,即同一時刻在網(wǎng)絡中傳輸?shù)臄?shù)據(jù)包數(shù)量是恒定的。如果發(fā)送方收到一個重復的ACK,則認為已經(jīng)有一個數(shù)據(jù)包離開了網(wǎng)絡,于是將擁塞窗口加1。

  4.對傳統(tǒng)TCP擁塞控制機制的發(fā)展及改進

  (1)對慢啟動的改進  

  慢啟動(slowstart)算法通過逐漸增加cwnd的大小來探測可用的網(wǎng)絡容量,防止連接開始時采用不合適的發(fā)送量導致網(wǎng)絡擁塞。然而有時該算法也會浪費可用的網(wǎng)絡容量,因為慢啟動算法總是從cwnd=l開始,每收到一個ACK,cwnd增加l,對RTT時間長的網(wǎng)絡,為使cwnd達到一個合適的值,需要花很長的時間,特別是網(wǎng)絡實際容量很大時,會造成浪費。為此可采用大的初始窗口,大的初始窗口避免了延遲ACK機制下單個報文段初始窗口的等待超時問題,縮短了小TCP流的傳輸時間和大延遲鏈路上的慢啟動時間。

  在慢啟動階段,在每個RTT時間內,cwnd增加一倍,這樣當cwnd增加到一定的值時,就可能導致以網(wǎng)絡能夠處理的最大容量的2倍來發(fā)送數(shù)據(jù),從而淹沒網(wǎng)絡。Hoe建議使用packet-pair算法和測量RTT來為ssthresh估計合適值,以此來適時地結束慢啟動階段。但是由于受各方面干擾,估算合理的ssthresh值并不容易,因此這個方法的效果是有限的。而Smooth-start較為平滑地從慢啟動過渡到擁塞避免階段,減少了報文段丟失和突發(fā)通訊量,提高了TCP擁塞控制的性能。

  (2)對重傳與恢復的改進

  為了避免不必要的重傳超時,有人提出了一種受限傳輸機制:如果接收方的廣播窗口允許的話,發(fā)送方接收到一個或者兩個重復的ACK(acknowledgment)后,繼續(xù)傳輸新的數(shù)據(jù)報文段。受限的傳輸機制允許具有較小窗口的TCP連接進行錯誤恢復,而且避免了不必要的重傳。

  有很多情況下,數(shù)據(jù)報文段并沒有丟失,但TCP發(fā)送方可能會誤判數(shù)據(jù)報文段丟失,然后調用擁塞控制規(guī)程減少擁塞窗口的大小。比如當重傳定時器過早溢出時,發(fā)送方在重傳數(shù)據(jù)報文段時不必要地減少了擁塞窗口,而這時并沒有數(shù)據(jù)報文段丟失。如果是由于數(shù)據(jù)報文段的重新組織而不是數(shù)據(jù)報文段丟失,而導致3個重復的確認,同樣會導致發(fā)送方不必要地在快速重傳數(shù)據(jù)報文段后減少擁塞窗口。

  如果TCP的發(fā)送方在重傳數(shù)據(jù)報文段一個RTT后發(fā)現(xiàn)接收方接收到了重傳數(shù)據(jù)報文段的兩個拷貝,則可以推斷重傳是不必要的。這時,TCP的發(fā)送方可以撤銷對擁塞窗口的減少。發(fā)送方可以通過將慢啟動門限增加到原始值,調用慢啟動規(guī)程使擁塞窗口恢復原先值。除了恢復擁塞窗口,TCP發(fā)送方還可以調整重復確認門限或者重傳超時參數(shù)來避免由于多次不必要的重傳而浪費帶寬。

  (3)對公平性的改進

  在擁塞避免階段,如果沒有發(fā)生丟包事件,則TCP發(fā)送方的cwnd在每個RTT時間內大約可以增加一個報文段大小,但這樣會造成具有不同RTT時間或窗口尺寸的多個連接在瓶頸處對帶寬競爭的不公平性,RTT時間或窗口小的連接,相應的cwnd增長速度也相對緩慢,所以只能得到很小一部分帶寬。

  要解決上述問題,可以通過在路由器處使用公平隊列和TCP友好緩存管理來進行控制以增加公平性。然而如沒有路由器的參與,要增加公平性,就要求TCP發(fā)送端的擁塞控制進行相應的改變,在擁塞避免階段使共享同一資源的各個TCP連接以相同速度發(fā)送數(shù)據(jù),從而確保了各個連接間的公平性。

評論  |   0條評論