流量控制和阻塞控制實例:
可以用一個例子來說明這種區別。設某個光纖網絡的鏈路傳輸速率為1000Gbit/s。有一台巨型計算機向一台個人電腦以1Gbit/s的速率傳送文件。顯然,網絡本身的帶寬是足夠大的,因而不存在產生擁塞的問題。但流量控制卻是必須的,因為巨型計算機必須經常停下來,以便使個人電腦來得及接收。(流量控制)
但如果有另一個網絡,其鏈路傳輸速率為1Mbit/s,而有1000台大型計算機連接在這個網絡上,假定其中的500台計算機分別向其余的500台計算機以100kbit/s的速率發送文件。那么現在的問題已不是接收端的大型計算機是否來得及接收,而是整個網絡的輸入負載是否超過網絡所能承受的。(阻塞控制)
TCP流量控制
1.什么是流量控制?
所謂的流量控制就是讓發送方的發送速率不要太快,讓接收方來得及接受。
2.什么方式進行流量控制?
a.利用滑動窗口機制可以很方便的在TCP連接上實現對發送方的流量控制。
b.TCP的窗口單位是字節,不是報文段,發送方的發送窗口不能超過接收方給出的接收窗口的數值。
滑動窗口機制示意圖:
1.設A向B發送數據。在連接建立時,B告訴了A:“我的接收窗口rwnd = 400”(這里rwnd表示recevier window)。
2.發送方的發送窗口不能超過接收方給出的接收窗口的數值,請注意,TCP的窗口單位是字節,不是報文段。
3.再設每一個報文段為100字節長,而數據報文段序號的初始值設為1(圖中第一個箭頭上面的序號為seq=1。從1開始,data里有100個字節的數據。)
4.圖中箭頭上面大寫ACK表示首部中的確認位ACK(應答標識,表示接收到信息),小寫ack表示確認字段的值(表示接收到了哪些具體的數據)。
a.接收方的主機N進行了三次流量控制,第一次把窗口減小到rwnd =300。
b.第二次又減小到rwnd = 100。
c.最后減到rwnd = 0,即不允許發送方再發生數據了。
d.這種使發送方暫停發送的狀態將持續到主機B重新發出一個新的窗口值為止。
e.B向A發送的三個報文段都設置了ACK = 1,只有在ACK = 1時確認號字段才有意義。(相當於判定條件,只有條件成立時,才去價差下面的信息)
3.以上處理的不足
死鎖問題
1.B向A發送了零窗口的報文段后不久,B的接收緩存又有了一些存儲空間。於是B向A發送了rwnd = 400的報文段,然而這個報文段在傳送過程中丟失了。
2.A一直等待收到B發送的非零窗口的通知,而B也一直等待A發送的數據,如果沒有其他措施,這種相互等待的死鎖局面將一直持續下去。
4.解決方法
1.TCP為每一個連接設有一個持續計時器。
2.只要TCP連接的一方收到對方的零窗口通知,就啟動持續計時器。
3.若持續計時器設置的時間到期,就發送一個零窗口探測報文段(僅攜帶1字節的數據),而對方就在確認這個探測報文時給出了現在的窗口值。
4.如果窗口值仍然是零,那么收到這個報文段的一方就重新設置持續計時器。
5.如果窗口不是零,那么死鎖的僵局就可以打破了。
5.三種TCP傳輸機制
1.TCP維持一個變量,它等於最大報文段長度MSS。只要緩存中存放的數據達到了MSS字節時,就組裝成一個TCP報文段發送出去。
2.發送方的應用進程指明要求發送報文段,即TCP支持的推送(push)操作。
3.發送方的一個計時器期限到了,這時就把當前已有的緩存數據裝入報文段(但長度不超過MSS)發送出去。
6.如何控制TCP發送報文段的時機?
TCP的實現中廣泛使用Nagle算法
1.若發送應用進程把要求發送的數據逐個地送到TCP的發送緩存,則發送方就把第一個數據字節先發送出去,把后面到達的數據字節都緩存起來。
2.當發送方收到第一個數據字節的確認后,再把發送緩存中的所有數據組裝成一個報文段發送出去,同時繼續對隨后到達的數據進行緩存,只有在收到對前一個報文段的確認后才繼續發送下一個報文段。
3.當數據到達較快而網絡速率較慢時,用這養的方法可明顯減少所用的網絡帶寬。
4.Nagle算法還規定,當到達的數據已達到發送窗口大小的一半或已達到報文段的最大長度時,就立即發送一個報文段。這樣就可以有效的提高網絡的吞吐量。
7.糊塗窗口綜合症
1.TCP接收方的緩存已滿,而交互式的應用進程一次只從接收緩存中讀取為1個字節(這樣就使接收緩存空間僅騰出1個字節)
2.然后向發送方發送確認,並把窗口設置為1個字節(但發送的數據報是40字節長)。
3.接收方發回確認,仍然將窗口設置為1個字節。
4.這樣進行下去,使網絡的效率很低。
8.如何解決糊塗窗口綜合證
1.讓接收方等待一段時間,使得或者接收緩存已有足夠空間容納一個最長的報文段,或者等到接收緩存已有一半空閑的空間。
2.只要出現這兩種情況之一,接收方就發出確認報文,並向發送方通知當前的窗口大小。
3.此外。發送方也不要發送太小的報文段,而是把數據積累成足夠大的報文段,或達到接收方緩存的空間的一半大小。
Nagle算法和解決糊塗窗口綜合證配合使用,使得在發送方不發送很小的報文段的同時接收方也不要在緩存剛剛有了一點小的空間就急忙把這個很小的窗口大小信息通知給對方。
TCP擁塞控制
1.什么是擁塞控制
1.擁塞控制就是防止過多的數據注入網絡中,這樣可以使網絡中的路由器或鏈路不致過載。
2.擁塞控制要考慮的因素
1.擁塞控制所作的都有一個前提,就是網絡能夠承受現有的網絡負荷。
2.擁塞控制是一個全局性的過程,涉及到所有的主機、所有的路由器,以及與降低網絡傳輸性能有關的所有因素。
3.TCP連接的端點只要遲遲不能收到對方的確認信息,就猜想在當前網絡中的某處可能發生了擁塞,但這時卻無法知道擁塞到底發生在網絡的何處,也無法知道發生擁塞的具體原因。
3.擁塞控制的方法:
1.慢開始
2.擁塞避免
3.快重傳
4.快恢復
前提:
1) 數據是單方向傳送的,對方只傳送確認報文。
2) 接收方總是有足夠大的緩存空間,因而發送窗口的大小由網絡的擁塞程度來決定。
4.慢開始和擁塞避免
a.下面討論的擁塞控制也叫做基於窗口的擁塞控制。
b.發送方維持一個叫做擁塞窗口cwnd(Congestion window)的狀態變量。
c.擁塞窗口的大小取決於網絡的擁塞程度,並且動態地在變化。
d.發送方讓自己的發送窗口等於擁塞窗口。
發送方控制擁塞窗口的原則
1.只要網絡沒有出現擁塞,擁塞窗口就可以再增大一些,以便把更多的分組發送出去,這樣就可以提高網絡的利用率。
2.但只要網絡出現擁塞或有可能出現擁塞,就必須把擁塞窗口減小一些,以減少注入到網絡中的分組數,以便緩解網絡出現的擁塞。
慢開始算法的思路
1.當主機開始發送數據時,由於並不清楚網絡的負荷情況,所以如果立即把大量數據字節注入到網絡,那么就有可能引起網絡發生擁塞。
2.經驗證表明,較好的辦法是先探測一下,即由小到大逐漸增大發送窗口,也就是說,由小到大逐漸增大擁塞窗口的數值。
新的RFC 5681把初始擁塞窗口cwnd設置規定
1.若SMSS > 2190 字節 ,則設置初始擁塞窗口 cwnd = 2 * SMSS字節,且不得超過2個報文段。
2.若SMSS > 1095 且SMSS < 2190字節, 則設置初始擁塞窗口cwnd = 3 * SMSS字節,且不得超過 3 個報文段。
3.若 SMSS <= 1095字節, 則設置初始擁塞窗口cwnd = 4* SMSS 字節,且不得超過4個報文段。
4.慢開始規定,在每收到一個新的報文段的確認后,可以把擁塞窗口增加最多一個SMSS的數值。
5.擁塞窗口cwnd 每次的增加量 = min(N, SMSS)
慢開始示意圖
1.在一開始發送方先設置cwnd = 1,發送第一個報文段M1,接收方收到后確認M1
2.發送方收到對M1的確認后,把cwnd從1增大到2,於是發送方接着發送M2和M3兩個報文段,接收方收到后發回對M2和M3的確認
3.發送方每收到一個對新報文段的確認(重傳的不算在內)就使發送方的擁塞窗口加1,因此發送方在收到兩個確認后,cwnd就從2增大到4,並可發送M4~M7共4個報文段
4.使用慢開始算法后,每經過一個傳輸輪次,擁塞窗口cwnd就加倍。
什么是RTT
1.一個傳輸輪次所經歷的時間其實就是往返時間RTT(RTT並非恆定的數值)
2.使用“傳輸輪次”是更加強調:把擁塞窗口所允許發生的報文段都連續發送出去,並收到了對已發送的最后一個字節的確認
3.例如,擁塞窗口cwnd的大小是4個報文段,那么這時的往返時間RTT就是發送方連續發送4個報文段,並收到這4個報文段的確認,總共經歷的時間。
4.在TCP的實際運行中,發送方只要收到一個對新報文段的確認,其擁塞窗口cwnd就立即加1,並可以立即發送新的報文段,而不需要等這個輪次中所有的確認都收到后再發送新的報文段。
什么是ssthresh狀態變量,以及作用
為了防止擁塞窗口cwnd增長過大引起網絡擁塞,還需要設置一個慢開始門限ssthresh狀態變量
1.當cwnd < ssthresh時,使用上述的慢開始算法
2.當cwnd > ssthresh時, 停止使用慢開始算法而改用擁塞避免算法
3.當cwnd = ssthresh時 , 即可以使用慢開始算法,也可以使用擁塞避免算法。
擁塞避免算法的思路
擁塞避免算法的思路是讓擁塞避免窗口cwnd緩慢的增大,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1。
1.假定cwnd等於10個MSS的長度,而MSS是1460字節,發送方可一連發送14600字節(即10個報文段)。
2.假定接收方每收到一個報文段就發回一個確認。
3.於是發送方每到一個新的確認,就把擁塞窗口稍微增大一些,即增大0.1 MSS = 146字節。
4.經過一個往返時間RTT(或一個傳輸輪次)后,發送方共收到10個新的確認,擁塞窗口就增大了1460字節,正好是一個MSS的大小。)
5.不是像慢開始階段那樣加倍增長。因此在擁塞避免階段就有“加法增大”AI的特點。
6.這表明在擁塞避免階段,擁塞窗口cwnd按線性規律緩慢增長,比慢開始算法的擁塞窗口增長速率緩慢得多。
5.快重傳和快恢復
什么是快重傳,以及優勢。
1.采用快重傳算法可以讓發送方盡早知道發生了個別報文段的丟失。
2.快重傳算法首先要求接收方不要等待自己發送數據時才進行捎帶確認,而是要立即發送確認,即使收到了失序的報文段也要立即發出對已收到的報文段的重復確認。
1、接收方收到了M1和M2后都分別及時發出了確認。
2、現假定接收方沒有收到M3的但收到了M4,本來接收方可以什么都不做。
3、但按照快重傳算法,接收方必須立即發送對M2的重復確認,以便讓發送方及早知道接收方沒有收到報文段M3。
4、發送方接着發送M5和M6,接收方收到后也仍要再次分別發出對M2的重復確認。
5、這樣,發送方共收到了接收方的4個對M2的確認,其中后3個都是重復確認。
6、快重傳算法規定,發送方只要一收到3個重復確認,就知道接受方確實沒有收到報文段M3,因而應當立即進行重傳(即“快重傳”),這樣就不會出現超時,發送方也不就會認為出現了網絡擁塞。
快恢復的兩個特點
快恢復和慢開始的區別:
慢開始算法只是在TCP建立時才使用,快恢復是在遇到網絡擁塞接收不到數據時觸發,常常伴隨着快重傳算法。
慢開始和擁塞避免的實例
為了便於理解,上圖中的窗口單位不使用字節而是用報文段的個數。
1、當TCP連接進行初始化時,把擁塞窗口cwnd置為1。
2、慢開始門限的初始值置為16個報文段,即ssthresh = 16。
3、在執行慢開始算法時,發送方每收到一個對新報文段的確認ACK,就把擁塞窗口值加1,然后開始下一輪的傳輸(圖中的橫坐標是傳輸輪次,不是時間)。
4、因此擁塞窗口cwnd隨着傳輸輪次按指數規律增長。
5、當擁塞窗口cwnd增長到慢開始門限值ssthresh時(圖中點(1),此時擁塞窗口cwnd=16)。
6、改為執行擁塞避免算法,擁塞窗口按線性規律增長。
7、“擁塞避免”並非完全能夠避免擁塞,“擁塞避免”是說把擁塞窗口控制為線性規律增長,使網絡比較不容易出現擁塞。
8、當擁塞窗口cwnd=24時,網絡出現了超時(圖中點(2)),發送方判斷為網絡擁塞,於是調整門限值ssthresh=cwnd/2=12,同時設置擁塞窗口cwnd=1,進入慢開始階段。
9、按照慢開始算法,發送方每收到一個對新報文段的確認ACK,就把擁塞窗口值加1。
10、當擁塞窗口cwnd=ssthresh = 12時(圖中點(3),則是新的ssthresh值),改為執行擁塞避免算法,擁塞窗口按線性規律增大。
11、當擁塞窗口cwnd=16時(圖中點(4)),出現了一個新的情況,就是發送方一連收到3個對同一個報文段的重復確認(圖中記為3-ACK)。這是因為:有時,個別報文段會在網絡中丟失,但實際上網絡並未發生擁塞。如果發送方遲遲收不到確認,就會產生超時,就會誤認為網絡發生了擁塞。這就導致發送方錯誤地啟動慢開始,把擁塞窗口cwnd又設置為1,因而降低了傳輸效率。
12、圖中的點(4),發送方知道現在只是丟失了個別的報文段,於是不啟動慢開始,而是執行快恢復算法。
13、這時,發送方調整門限值ssthresh = cwnd/2 = 8,同時設置擁塞窗口cwnd=ssthresh = 8(上上圖中點(5)),並開始執行擁塞避免算法。
14、請注意,也有的快恢復實現是把快恢復開始時的擁塞窗口cwnd值再增大一些(增大3個報文段的長度),即等於新的ssthresh+3* MSS。這樣做的理由是:既然發送方收到了3個重復的確認,就表明有3個分組已經離開了網絡。這三個分組不再消耗網絡的資源而是停留在接收方的緩存中(接收方發送出3個重復的確認就證明了這個事實)。可見現在網絡中並不是堆積了分組而是減少了3個分組。因此可以適當把擁塞窗口擴大些。
總結:
在擁塞避免階段,擁塞窗口時按照線性規律增大的,這常稱為加法增大AI(Additive Increase)。而一旦出現超時或3個重復的確認,就要把門限值設置為當前擁塞窗口值的一半,並大大減小擁塞窗口的數值。這稱為“乘法減小”MD(Multiplicative Decrease)。二者合在一起就是所謂的AIMD算法。
TCP擁塞控制流程圖:
TCP擁塞控制實際流程和上文理論的區別
1.我們剛開始就假定了接收方總是有足夠大的緩存空間,因而發送窗口的大小由網絡的擁塞程度來決定。
2.實際上接收方的緩存空間總是有限的。
3.接收方根據自己的接收能力設定了接收方窗口rwnd,並把這個窗口值寫入TCP首部中的窗口字段,傳送給發送方。
4.從接收方對發送方的流量控制的角度考慮,發送方的發送窗口一定不能超過對方給出的接收方窗口值rwnd。
5.把這里所討論的擁塞控制和接收方對發送方的流量控制一起考慮,那么很顯然,發送方的窗口的上限值應當取為 接收方窗口rwnd和擁塞窗口cwnd這兩個變量中較小的一個。
6.發送方窗口的上限值 = Min[ rwnd, cwnd ]
7.當rwnd < cwnd 時,是接收方的接收能力限制發送方窗口的最大值。
8.反之,當cwnd < rwnd 時,則是網絡的擁塞程度限制發送方窗口的最大值。
9.也就是說,rwnd和cwnd中數值較小的一個,控制了發送方發送數據的速率。