TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])
TCP的流量控制
1. 利用滑動(dòng)窗口實(shí)現(xiàn)流量控制
??? 如果發(fā)送方把數(shù)據(jù)發(fā)送得過快,接收方可能會(huì)來不及接收,這就會(huì)造成數(shù)據(jù)的丟失。所謂流量控制就是讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收。
??? 利用滑動(dòng)窗口機(jī)制可以很方便地在TCP連接上實(shí)現(xiàn)對(duì)發(fā)送方的流量控制。
??? 設(shè)A向B發(fā)送數(shù)據(jù)。在連接建立時(shí),B告訴了A:“我的接收窗口是 rwnd = 400 ”(這里的 rwnd 表示 receiver window) 。因此,發(fā)送方的發(fā)送窗口不能超過接收方給出的接收窗口的數(shù)值。請(qǐng)注意,TCP的窗口單位是字節(jié),不是報(bào)文段。TCP連接建立時(shí)的窗口協(xié)商過程在圖中沒有顯示出來。再設(shè)每一個(gè)報(bào)文段為100字節(jié)長,而數(shù)據(jù)報(bào)文段序號(hào)的初始值設(shè)為1。大寫ACK表示首部中的確認(rèn)位ACK,小寫ack表示確認(rèn)字段的值ack。
??? 從圖中可以看出,B進(jìn)行了三次流量控制。第一次把窗口減少到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最后減到 rwnd = 0 ,即不允許發(fā)送方再發(fā)送數(shù)據(jù)了。這種使發(fā)送方暫停發(fā)送的狀態(tài)將持續(xù)到主機(jī)B重新發(fā)出一個(gè)新的窗口值為止。B向A發(fā)送的三個(gè)報(bào)文段都設(shè)置了 ACK = 1 ,只有在ACK=1時(shí)確認(rèn)號(hào)字段才有意義。
??? TCP為每一個(gè)連接設(shè)有一個(gè)持續(xù)計(jì)時(shí)器(persistence timer)。只要TCP連接的一方收到對(duì)方的零窗口通知,就啟動(dòng)持續(xù)計(jì)時(shí)器。若持續(xù)計(jì)時(shí)器設(shè)置的時(shí)間到期,就發(fā)送一個(gè)零窗口控測報(bào)文段(攜1字節(jié)的數(shù)據(jù)),那么收到這個(gè)報(bào)文段的一方就重新設(shè)置持續(xù)計(jì)時(shí)器。
2. 必須考慮傳輸速率
??? 可以用不同的機(jī)制來控制TCP報(bào)文段的發(fā)送時(shí)機(jī)。如:?<1>. TCP維持一個(gè)變量,它等于最大報(bào)文段長度MSS。只要緩存中存放的數(shù)據(jù)達(dá)到MSS字節(jié)時(shí),就組裝成一個(gè)TCP報(bào)文段發(fā)送出去。<2>. 由發(fā)送方的應(yīng)用進(jìn)程指明要求發(fā)送報(bào)文段,即TCP支持的推送( push )操作。<3>. 發(fā)送方的一個(gè)計(jì)時(shí)器期限到了,這時(shí)就把已有的緩存數(shù)據(jù)裝入報(bào)文段(但長度不能超過MSS)發(fā)送出去。
??? Nagle算法:若發(fā)送應(yīng)用進(jìn)程把要發(fā)送的數(shù)據(jù)逐個(gè)字節(jié)地送到TCP的發(fā)送緩存,則發(fā)送方就把第一個(gè)數(shù)據(jù)字節(jié)先發(fā)送出去,把后面到達(dá)的數(shù)據(jù)字節(jié)都緩存起來。當(dāng)發(fā)送方接收對(duì)第一個(gè)數(shù)據(jù)字符的確認(rèn)后,再把發(fā)送緩存中的所有數(shù)據(jù)組裝成一個(gè)報(bào)文段再發(fā)送出去,同時(shí)繼續(xù)對(duì)隨后到達(dá)的數(shù)據(jù)進(jìn)行緩存。只有在收到對(duì)前一個(gè)報(bào)文段的確認(rèn)后才繼續(xù)發(fā)送下一個(gè)報(bào)文段。當(dāng)數(shù)據(jù)到達(dá)較快而網(wǎng)絡(luò)速率較慢時(shí),用這樣的方法可明顯地減少所用的網(wǎng)絡(luò)帶寬。Nagle算法還規(guī)定:當(dāng)?shù)竭_(dá)的數(shù)據(jù)已達(dá)到 發(fā)送窗口大小的一半或已達(dá)到報(bào)文段的最大長度時(shí),就立即發(fā)送一個(gè)報(bào)文段。
??? 另,糊涂窗口綜合證: TCP接收方的緩存已滿,而交互式的應(yīng)用進(jìn)程一次只從接收緩存中讀取1字節(jié)(這樣就使接收緩存空間僅騰出1字節(jié)),然后向發(fā)送方發(fā)送確認(rèn),并把窗口設(shè)置為1個(gè)字節(jié)(但發(fā)送的數(shù)據(jù)報(bào)為40字節(jié)的的話)。接收,發(fā)送方又發(fā)來1個(gè)字節(jié)的數(shù)據(jù)(發(fā)送方的IP數(shù)據(jù)報(bào)是41字節(jié))。接收方發(fā)回確認(rèn),仍然將窗口設(shè)置為1個(gè)字節(jié)。這樣,網(wǎng)絡(luò)的效率很低。要解決這個(gè)問題,可讓接收方等待一段時(shí)間,使得或者接收緩存已有足夠空間容納一個(gè)最長的報(bào)文段,或者等到接收方緩存已有一半空閑的空間。只要出現(xiàn)這兩種情況,接收方就發(fā)回確認(rèn)報(bào)文,并向發(fā)送方通知當(dāng)前的窗口大小。此外,發(fā)送方也不要發(fā)送太小的報(bào)文段,而是把數(shù)據(jù)報(bào)積累成足夠大的報(bào)文段,或達(dá)到接收方緩存的空間的一半大小。
?
TCP的擁塞控制
1.? 擁塞:即對(duì)資源的需求超過了可用的資源。若網(wǎng)絡(luò)中許多資源同時(shí)供應(yīng)不足,網(wǎng)絡(luò)的性能就要明顯變壞,整個(gè)網(wǎng)絡(luò)的吞吐量隨之負(fù)荷的增大而下降。
??? 擁塞控制:防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載。擁塞控制所要做的都有一個(gè)前提:網(wǎng)絡(luò)能夠承受現(xiàn)有的網(wǎng)絡(luò)負(fù)荷。擁塞控制是一個(gè)全局性的過程,涉及到所有的主機(jī)、路由器,以及與降低網(wǎng)絡(luò)傳輸性能有關(guān)的所有因素。
??? 流量控制:指點(diǎn)對(duì)點(diǎn)通信量的控制,是端到端正的問題。流量控制所要做的就是抑制發(fā)送端發(fā)送數(shù)據(jù)的速率,以便使接收端來得及接收。
??? 擁塞控制代價(jià):需要獲得網(wǎng)絡(luò)內(nèi)部流量分布的信息。在實(shí)施擁塞控制之前,還需要在結(jié)點(diǎn)之間交換信息和各種命令,以便選擇控制的策略和實(shí)施控制。這樣就產(chǎn)生了額外的開銷。擁塞控制還需要將一些資源分配給各個(gè)用戶單獨(dú)使用,使得網(wǎng)絡(luò)資源不能更好地實(shí)現(xiàn)共享。
2. 幾種擁塞控制方法
??? 慢開始( slow-start )、擁塞避免( congestion avoidance )、快重傳( fast retransmit )和快恢復(fù)( fast recovery )。
2.1 慢開始和擁塞避免
??? 發(fā)送方維持一個(gè)擁塞窗口 cwnd ( congestion window )的狀態(tài)變量。擁塞窗口的大小取決于網(wǎng)絡(luò)的擁塞程度,并且動(dòng)態(tài)地在變化。發(fā)送方讓自己的發(fā)送窗口等于擁塞。
??? 發(fā)送方控制擁塞窗口的原則是:只要網(wǎng)絡(luò)沒有出現(xiàn)擁塞,擁塞窗口就再增大一些,以便把更多的分組發(fā)送出去。但只要網(wǎng)絡(luò)出現(xiàn)擁塞,擁塞窗口就減小一些,以減少注入到網(wǎng)絡(luò)中的分組數(shù)。
??? 慢開始算法:當(dāng)主機(jī)開始發(fā)送數(shù)據(jù)時(shí),如果立即所大量數(shù)據(jù)字節(jié)注入到網(wǎng)絡(luò),那么就有可能引起網(wǎng)絡(luò)擁塞,因?yàn)楝F(xiàn)在并不清楚網(wǎng)絡(luò)的負(fù)荷情況。因此,較好的方法是先探測一下,即由小到大逐漸增大發(fā)送窗口,也就是說,由小到大逐漸增大擁塞窗口數(shù)值。通常在剛剛開始發(fā)送報(bào)文段時(shí),先把擁塞窗口 cwnd 設(shè)置為一個(gè)最大報(bào)文段MSS的數(shù)值。而在每收到一個(gè)對(duì)新的報(bào)文段的確認(rèn)后,把擁塞窗口增加至多一個(gè)MSS的數(shù)值。用這樣的方法逐步增大發(fā)送方的擁塞窗口 cwnd ,可以使分組注入到網(wǎng)絡(luò)的速率更加合理。
?
每經(jīng)過一個(gè)傳輸輪次,擁塞窗口 cwnd 就加倍。一個(gè)傳輸輪次所經(jīng)歷的時(shí)間其實(shí)就是往返時(shí)間RTT。不過“傳輸輪次”更加強(qiáng)調(diào):把擁塞窗口cwnd所允許發(fā)送的報(bào)文段都連續(xù)發(fā)送出去,并收到了對(duì)已發(fā)送的最后一個(gè)字節(jié)的確認(rèn)。
另,慢開始的“慢”并不是指cwnd的增長速率慢,而是指在TCP開始發(fā)送報(bào)文段時(shí)先設(shè)置cwnd=1,使得發(fā)送方在開始時(shí)只發(fā)送一個(gè)報(bào)文段(目的是試探一下網(wǎng)絡(luò)的擁塞情況),然后再逐漸增大cwnd。
??? 為了防止擁塞窗口cwnd增長過大引起網(wǎng)絡(luò)擁塞,還需要設(shè)置一個(gè)慢開始門限ssthresh狀態(tài)變量(如何設(shè)置ssthresh)。慢開始門限ssthresh的用法如下:
??? 當(dāng) cwnd < ssthresh 時(shí),使用上述的慢開始算法。
??? 當(dāng) cwnd > ssthresh 時(shí),停止使用慢開始算法而改用擁塞避免算法。
??? 當(dāng) cwnd = ssthresh 時(shí),既可使用慢開始算法,也可使用擁塞控制避免算法。
擁塞避免算法:讓擁塞窗口cwnd緩慢地增大,即每經(jīng)過一個(gè)往返時(shí)間RTT就把發(fā)送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口cwnd按線性規(guī)律緩慢增長,比慢開始算法的擁塞窗口增長速率緩慢得多。
??? 無論在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有收到確認(rèn)),就要把慢開始門限ssthresh設(shè)置為出現(xiàn)擁塞時(shí)的發(fā)送方窗口值的一半(但不能小于2)。然后把擁塞窗口cwnd重新設(shè)置為1,執(zhí)行慢開始算法。這樣做的目的就是要迅速減少主機(jī)發(fā)送到網(wǎng)絡(luò)中的分組數(shù),使得發(fā)生擁塞的路由器有足夠時(shí)間把隊(duì)列中積壓的分組處理完畢。
??? 如下圖,用具體數(shù)值說明了上述擁塞控制的過程。現(xiàn)在發(fā)送窗口的大小和擁塞窗口一樣大。
<1>. 當(dāng)TCP連接進(jìn)行初始化時(shí),把擁塞窗口cwnd置為1。前面已說過,為了便于理解,圖中的窗口單位不使用字節(jié)而使用報(bào)文段的個(gè)數(shù)。慢開始門限的初始值設(shè)置為16個(gè)報(bào)文段,即 cwnd = 16 。
<2>. 在執(zhí)行慢開始算法時(shí),擁塞窗口 cwnd 的初始值為1。以后發(fā)送方每收到一個(gè)對(duì)新報(bào)文段的確認(rèn)ACK,就把擁塞窗口值另1,然后開始下一輪的傳輸(圖中橫坐標(biāo)為傳輸輪次)。因此擁塞窗口cwnd隨著傳輸輪次按指數(shù)規(guī)律增長。當(dāng)擁塞窗口cwnd增長到慢開始門限值ssthresh時(shí)(即當(dāng)cwnd=16時(shí)),就改為執(zhí)行擁塞控制算法,擁塞窗口按線性規(guī)律增長。
<3>. 假定擁塞窗口的數(shù)值增長到24時(shí),網(wǎng)絡(luò)出現(xiàn)超時(shí)(這很可能就是網(wǎng)絡(luò)發(fā)生擁塞了)。更新后的ssthresh值變?yōu)?2(即變?yōu)槌霈F(xiàn)超時(shí)時(shí)的擁塞窗口數(shù)值24的一半),擁塞窗口再重新設(shè)置為1,并執(zhí)行慢開始算法。當(dāng)cwnd=ssthresh=12時(shí)改為執(zhí)行擁塞避免算法,擁塞窗口按線性規(guī)律增長,每經(jīng)過一個(gè)往返時(shí)間增加一個(gè)MSS的大小。
強(qiáng)調(diào):“擁塞避免”并非指完全能夠避免了擁塞。利用以上的措施要完全避免網(wǎng)絡(luò)擁塞還是不可能的。“擁塞避免”是說在擁塞避免階段將擁塞窗口控制為按線性規(guī)律增長,使網(wǎng)絡(luò)比較不容易出現(xiàn)擁塞。
?
2.2 快重傳和快恢復(fù)
TCP/IP協(xié)議族之運(yùn)輸層(TCP流量控制和擁塞控制 [2])
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/way_testlife/archive/2010/10/11/1848241.html
總結(jié)
以上是生活随笔為你收集整理的TCP/IP协议族之运输层(TCP流量控制和拥塞控制 [1])的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SVN:“SVN”不是内部命令,解决方法
- 下一篇: POJ 2696 计算表达式的值