1.概述算法
所謂的流量控制就是讓發送方的發送速率不要太快,讓接收方來得及接受。利用滑動窗口機制能夠很方便的在TCP鏈接上實現對發送方的流量控制。TCP的窗口單位是字節,不是報文段,發送方的發送窗口不能超過接收方給出的接收窗口的數值。
如圖所示,說明了利用可變窗口大小進行流量控制。設主機A向主機B發送數據。雙方肯定的窗口值是400.再設每個報文段爲100字節長,序號的初始值爲seq=1,圖中的箭頭上面大寫ACK,表示首部中的卻認爲爲ACK,小寫ack表示確認字段的值。
接收方的主機B進行了三次流量控制。第一次把窗口設置爲rwind=300,第二次減少到rwind=100最後減到rwind=0,即不容許發送方再發送過數據了。這種使發送方暫停發送的狀態將持續到主機B從新發出一個新的窗口值爲止。
假如,B向A發送了零窗口的報文段後不久,B的接收緩存又有了一些存儲空間。因而B向A發送了rwind=400的報文段,然而這個報文段在傳送中丟失了。A一直等待收到B發送的非零窗口的通知,而B也一直等待A發送的數據。這樣就死鎖了。爲了解決這種死鎖狀態,TCP爲每一個鏈接設有一個持續計時器。只要TCP鏈接的一方收到對方的零窗口通知,就啓動持續計時器,若持續計時器設置的時間到期,就發送一個零窗口探測報文段(僅攜帶1字節的數據),而對方就在確認這個探測報文段時給出瞭如今的窗口值。
2.TCP報文段發送時機的選擇
TCP豹紋短短髮送時機主要有如下幾種選擇途徑。
1)TCP維持一個變量,它等於最大報文段長度MSS,只要緩存中存放的數據達到MSS字節就組裝成一個TCP報文段發送出去。
2)由發送方的應用程序指明要求發送報文段,即TCP支持的推送操做
3)是發送方的一個計時器期限到了,這時就把當前已有的緩存數據裝入報文段發送出去。
在某段時間,若對網絡中的某一資源的需求超過了該資源所能提供的可用部分,網絡的性能就要變化,這種狀況叫作擁塞。
網絡擁塞每每是由許多因素引發的,簡單的提升節點處理機的速度或者擴大結點緩存的存儲空間並不能解決擁塞問題。例如
1)當某個結點緩存容量擴展到很是大,因而凡到達該結點的分組都可在結點的緩存隊列中排隊,不受任何限制。因爲輸出鏈路的容量和處理機的速度並未提升,所以在這隊列中的絕大多數的分組在排隊等待時間會大大增長,結果上層軟件只好把他們進行重傳。
所以,問題的是指每每是整個系統的各個部分不匹配,只有各個部分平衡了,問題纔會獲得解決。
2.擁塞控制和流量控制的差異
所謂擁塞控制就是防止過多的數據注入到網絡中,這樣可使網絡中的路由器或鏈路不致過載。擁塞控制所要作的都有一個前提,就是網絡能承受現有的網絡負荷。
流量控制每每指的是點對點通訊量的控制,是個端到端的問題。流量控制所要作的就是控制發送端發送數據的速率,以便使接收端來得及接受。
3.擁塞控制設計
擁塞控制是很難設計的,由於它是一個動態的問題,許多狀況下,甚至正式擁塞控制機制自己成爲引發網絡性能惡化甚至死鎖的緣由。從控制理論的角度來看擁塞控制這個問題,能夠分爲開環控制和閉環控制兩種方法。開環控制就是在設計網絡時事先將有關擁塞發生的全部因素考慮周到,一旦系統運行起來就不能在中途改正。
閉環控制是基於反饋環路的概念,包括以下措施:
1)監測網路系統以便檢測擁塞在什麼時候何地發生
2)把擁塞發生的信息傳送到可採起行動的地方
3)調整網絡系統的行動以解決出現的問題。
4.擁塞控制方法
因特網建議標準RFC2581定義了進行擁塞控制的四種算法,即慢開始(Slow-start),擁塞避免(Congestion Avoidance)快重傳(Fast Restrangsmit)和快回復(Fast Recovery)。咱們假定
1)數據是單方向傳送,而另一個方向只傳送確認
2)接收方老是有足夠大的緩存空間,由於發送窗口的大小由網絡的擁塞程度來決定。
--慢開始和擁塞避免
發送報文段速率的肯定,既要根據接收端的接收能力,又要從全局考慮不要使網絡發生擁塞,這由接收窗口和擁塞窗口兩個狀態量肯定。接收端窗口(Reciver Window)又稱通知窗口(Advertised Window),是接收端根據目前的接收緩存大小所許諾的最新窗口值,是來自接收端的流量控制。擁塞窗口cwnd(Congestion Window)是發送端根據本身估計的網絡擁塞程度而設置的窗口值,是來自發送端的流量控制。
慢啓動原理:
1)當主機開始發送數據時,若是當即將較大的發送窗口的所有數據字節都注入到網絡中,那麼因爲不清楚網絡的狀況,有可能引其網絡擁塞
2)比較好的方法是試探一下,即從小到達逐漸增大發送端的擁塞控制窗口數值
3)一般在剛剛開始發送報文段時可先將擁塞窗口cwnd設置爲一個最大報文段的MSS的數值。在每收到一個對新報文段確認後,將擁塞窗口增長至多一個MSS的數值,當rwind足夠大的時候,爲了防止擁塞窗口cwind的增加引發網絡擁塞,還須要另一個變量---慢開始門限ssthresh
擁塞控制具體過程爲:
1)TCP鏈接初始化,將擁塞窗口設置爲1
2)執行慢開始算法,cwind按指數規律增加,知道cwind == ssthress開始執行擁塞避免算法,cwnd按線性規律增加
3)當網絡發生擁塞,把ssthresh值更新爲擁塞前ssthresh值的一半,cwnd從新設置爲1,按照步驟(2)執行。
--快重傳和快恢復
一條TCP鏈接有時會因等待重傳計時器的超時而空閒較長的時間,慢開始和擁塞避免沒法很好的解決這類問題,所以提出了快重傳和快恢復的擁塞控制方法。
快重傳算法並不是取消了重傳機制,只是在某些狀況下更早的重傳丟失的報文段(若是當發送端接收到三個重複的確認ACK時,則判定分組丟失,當即重傳丟失的報文段,而沒必要等待重傳計時器超時)。慢開始算法只是在TCP創建時才使用
快恢復算法有如下兩個要點:
1)當發送方連續收到三個重複確認時,就執行「乘法減少」算法,把慢開始門限減半,這是爲了預防網絡發生擁塞。
2)因爲發送方如今認爲網絡極可能沒有發生擁塞,所以如今不執行慢開始算法,而是把cwnd值設置爲慢開始門限減半後的值,而後開始執行擁塞避免算法,是擁塞窗口的線性增大。