计算机网络 tcp 阻塞,读书笔记:计算机网络第7章:阻塞控制
這是我在Coursera上的學(xué)習(xí)筆記。課程名稱為《Computer Networks》,出自University of Washington。
由于計算機網(wǎng)絡(luò)才誕生不久,目前正在以高速在發(fā)展,所以有些舊的教材可能都已經(jīng)跟不上時代了。這門課程在2013年左右錄制,知識相對還是比較新的。覆蓋了計算機網(wǎng)絡(luò)中的各個協(xié)議層,從物理層到應(yīng)用層都講得非常仔細(xì)。學(xué)完這門課程之后對計算機網(wǎng)絡(luò)會有比較深刻的了解。
概述
課程位置
關(guān)于傳輸層和網(wǎng)絡(luò)層的上半部分
話題
阻塞就類似于顯示生活中的堵車
阻塞CONGESTION的本質(zhì)
路由器或者交換機都有輸入輸出的緩沖
在一個路由器或者交換機中,如果有很多端口持續(xù)地向同一個端口發(fā)送數(shù)據(jù),緩沖區(qū)就會被填滿,從而導(dǎo)致大量丟包。這就是阻塞。
阻塞造成的影響
見圖
當(dāng)阻塞發(fā)生的時候,發(fā)送速度會明顯減小。網(wǎng)絡(luò)延遲會明顯增大
帶寬分配
就是給發(fā)送者分配合理的帶寬。這是是一項很重要的任務(wù)。
好的分配應(yīng)該是高效的,公平的。高效意味著沒有阻塞發(fā)生。公平意味者每個發(fā)送者都能享受到帶寬。
關(guān)鍵問題:高效的方案需要網(wǎng)絡(luò)層和傳輸層共同參與。因為網(wǎng)絡(luò)層能夠察覺到擁塞,而只有傳輸層才能控制流量
為什么帶寬分配很難呢
發(fā)送方的負(fù)載一直在變化
接收方的承受能力在不同的網(wǎng)絡(luò)也是不同的
網(wǎng)絡(luò)是分布式的,沒有人知道整個網(wǎng)絡(luò)的狀態(tài)
解決方案
發(fā)送方根據(jù)自己察覺到的情況自動作出相應(yīng)調(diào)整
設(shè)計調(diào)整策略,從而使得網(wǎng)絡(luò)的使用率最高效最公平
調(diào)整是一直在進(jìn)行的動作,因為負(fù)載每時每刻都在變化
話題
阻塞的本質(zhì)
公平分配帶寬
AIMD控制法則
TCP阻塞控制歷史
ACK時鐘
TCP慢啟動
TCP快速重傳
ECN阻塞規(guī)避
帶寬公平分配
話題
什么是公平的帶寬分配
回憶
好的帶寬分配意味著公平和高效
實際應(yīng)用中,高效比公平更重要
高效和公平的比較
高效和公平不能兼得
舉例。假設(shè)現(xiàn)在有這樣的網(wǎng)絡(luò)流量:A->B ? ?B->C ? ?A->B->C
先考慮公平。A->B 1/2,B->C 1/2,A-C 1/2,這種情況下網(wǎng)絡(luò)使用率只能達(dá)到 1.5
再考慮高效。A->B 1,B->C 1,A->C 0。這種情況下網(wǎng)絡(luò)使用率達(dá)到2
什么才算公平
公平的目的是避免某些節(jié)點沒有分配到資源,導(dǎo)致“饑餓”
所以每個數(shù)據(jù)流分配相同的帶寬是最公平的
每個數(shù)據(jù)流分配相同的帶寬
網(wǎng)速的瓶頸在于最慢的鏈路
瓶頸的存在意味著有些鏈路速度快,有些鏈路速度慢。這種情況下平均分配帶寬是不可能的。
max-min公平分配
增加一個流量的同時一定會減少另一個流量
網(wǎng)絡(luò)流量就像水流
步驟
每個數(shù)據(jù)流的速度都以0起步
逐漸增加數(shù)據(jù)流的速度直到某個數(shù)據(jù)流的速度達(dá)到了瓶頸
保持達(dá)到瓶頸的速度
返回第二步,繼續(xù)操作剩下的數(shù)據(jù)流
AIMD算法Additive Increase Multiplicative Decrease
話題
AIMD是一種帶寬分配模型
回憶
我們想要給發(fā)送者分配帶寬,需要既高效又公平
我們應(yīng)該怎樣分配帶寬呢?有多種方法
帶寬分配模型
帶寬分配模型分為多種
開循環(huán):在帶寬被使用前就已經(jīng)事先分配好了。
閉循環(huán):在帶寬使用的時候逐漸調(diào)整
主機支持或網(wǎng)絡(luò)支持
基于window或基于速度
TCP是閉循環(huán),主機支持,基于window
本章主要將閉循環(huán)、主機支持、基于window的帶寬分配模型
網(wǎng)絡(luò)層會返回信息告訴發(fā)送者是否有網(wǎng)絡(luò)阻塞
傳輸層負(fù)責(zé)調(diào)整發(fā)送者的發(fā)送速度
AIMD 線性提速、指數(shù)降速
當(dāng)網(wǎng)絡(luò)暢通時,傳輸速度緩慢上升(線性提速);當(dāng)網(wǎng)絡(luò)遇到阻塞時,傳輸速度急速下降(指數(shù)降速)
AIMD執(zhí)行的最終結(jié)果就是越來越趨向于即公平又高效的平衡點
AIMD屬性
收斂于即高效又公平的平衡點
需要從網(wǎng)絡(luò)獲取反饋
反饋信號
信號有多種,包括:丟包、數(shù)據(jù)包延遲、路由器指示(阻塞信號)
TCP阻塞控制歷史
話題
TCP阻塞控制的歷史
1980阻塞塌方
早期TCP使用固定大小的滑動窗口(比如一次發(fā)送8個數(shù)據(jù)包)
但是當(dāng)ARPANET成長的時候會發(fā)生很多奇怪的事情
由于網(wǎng)絡(luò)組件中的消息隊列太長,重發(fā)的數(shù)據(jù)包充斥著整個網(wǎng)絡(luò),造成有效傳輸速度減少了很多
Van Jacobson
發(fā)明了阻塞控制的方法
還有traceroute tcpdump pathchar, IP header compression, multicast tools
TCP tahoe/reno
在不改變路由器的情況下,避免網(wǎng)絡(luò)阻塞
主要的辦法是滑動超時時間,引入阻塞窗口的概念,類似滑動窗口
TCP tahoe/reno使用網(wǎng)絡(luò)反饋的丟包信號來調(diào)整阻塞窗口
我們將研究TCP的以下行為:ACK始終、自適應(yīng)超時、慢開始、快速重傳、快速恢復(fù)
TCP發(fā)展歷史
1974 TCP論文
1975 三次握手協(xié)議
1981 TCP 和 IP
1983 TCP/IP
1986 第一次發(fā)現(xiàn)網(wǎng)絡(luò)阻塞
1988 TCP Tahoe
1990 TCP Reno
1993 TCP Vegas
1994 ECN
1995 TCP New Reno
1996 TCP SACK
2004 FAST TCP
2004 TCP BIC
2006 TCP CUBIC
2007 Compound TCP
2008 TCP LEDBAT
最近幾年出現(xiàn)了很多阻塞控制的方法,但是課程內(nèi)容只講解傳統(tǒng)的阻塞控制方法
ACK時鐘
話題
滑動窗口使用了內(nèi)置的時鐘
滑動窗口的 ACK 時鐘
根據(jù)滑動窗口協(xié)議,只有當(dāng)發(fā)送方接收到ACK后,才會發(fā)送新的數(shù)據(jù)包
請思考一種情況,發(fā)送方在剛開始時數(shù)據(jù)包發(fā)送很快,比如5包/秒。但是由于中途遇到低速網(wǎng)絡(luò),對方接收數(shù)據(jù)的時候變成了1包/秒。那么ACK信號的速度也是1個/秒。這樣,發(fā)送方接收ACK的速度也是1秒1個。根據(jù)滑動窗口協(xié)議,接收到ACK后才能發(fā)送新的數(shù)據(jù)。所以發(fā)送方的發(fā)送速度從原來的5包/秒變成了1包/秒。這就是ACK時鐘。
它能讓發(fā)送者保持最高效的發(fā)送速率,同時縮短了沿途路由器的消息隊列,從而減少了丟包率和網(wǎng)絡(luò)延遲。
TCP和ACK時鐘
TCP通過滑動窗口使用了ACK時鐘
滑動窗口控制了網(wǎng)絡(luò)中流通的數(shù)據(jù)包數(shù)量(也稱為阻塞窗口)
TCP一次發(fā)送很少的數(shù)據(jù)包,來保持網(wǎng)絡(luò)流量的平滑
TCP慢啟動
話題
TCP如何實現(xiàn)AIMD
回憶
我們想要通過AIMD實現(xiàn)TCP的帶寬分配
發(fā)送方使用阻塞窗口來設(shè)置傳輸速度
發(fā)送方根據(jù)丟包情況調(diào)整傳輸速度
需要TCP適應(yīng)大幅度的速度變化
TCP啟動問題
我們想要快速接近最合適的速率。但是在剛開始的時候很難剛好適應(yīng)
啟動速度太快會導(dǎo)致丟包,啟動速度太慢會花費很長的時間才能達(dá)到剛好適應(yīng)
慢啟動方案
啟動速度呈指數(shù)上升
隨著速度的提升,最終會由于網(wǎng)絡(luò)阻塞發(fā)生丟包。之后,將指數(shù)提速切換成線性提速。這就是慢啟動
慢啟動時,也就是指數(shù)提速時,每收到1個ACK,就增加1個滑動窗口。這樣傳輸速度就能呈現(xiàn)指數(shù)上升了
線性提速時,每滑動窗口個ACK之后增加1個滑動窗口
TCP tahoe
第一階段是慢啟動階段,滑動窗口cwnd=1。每個ACK之后cwnd增加1
第二階段是線性增長階段,每接到一個ACK,滑動窗口cwnd增加1/cwnd。大概每個RTT之后增加一個cwnd
之后是切換threshold,初始threshold為無窮大。當(dāng)cwnd > ssthresh時,切換到線性增長模式。當(dāng)發(fā)生丟包之后設(shè)置ssthresh為cwnd/2。超時之后使用慢啟動
timeout misfortunes
為什么要在超時之后才使用慢啟動呢
超時給ACK時鐘足夠的時間來發(fā)揮作用
我們需要在丟包超時前就檢測到丟包,這樣才能更好地執(zhí)行AIMD
TCP快速重發(fā)、快速恢復(fù)
話題
TCP如何實現(xiàn)AIMD
回憶
我們想要TCP通過AIMD法則來實現(xiàn)合理的網(wǎng)速分配
發(fā)送方通過阻塞窗口(滑動窗口)來設(shè)置速度
發(fā)送放使用慢啟動來實現(xiàn)ACK時鐘
在超時之后發(fā)送方將滑動窗口設(shè)為1,然后重新開始慢啟動
通過ACK推斷丟包情況
TCP使用累加型的ACK
重復(fù)的數(shù)據(jù)給我們提示哪些數(shù)據(jù)沒被對方收到。出現(xiàn)重復(fù)ACK是因為ACK時鐘
快速重發(fā)
將三個重復(fù)的ACK視為丟包,此時立即重發(fā)。三個重復(fù)的ACK來自ACK時鐘
快速重發(fā)可以快速修復(fù)丟失的數(shù)據(jù)包,特別是還沒超時的時候就能檢測到丟包并迅速修復(fù)
但是在等ACK變化的時候有一段時間是沒有傳輸數(shù)據(jù)的
所以我們?nèi)匀恍枰笖?shù)減速的方法
根據(jù)ACK推斷哪些包是沒有丟的
每個新的重復(fù)的ACK意味著有數(shù)據(jù)已經(jīng)被對方收到了
快速恢復(fù)
在快速重傳之后,有一段時間是浪費掉的。所以,在快速重傳之后,需要進(jìn)行“指數(shù)減速”。并且在之后的一小段時間內(nèi)需要將重復(fù)的ACK視為正常的ACK。并且在這段時間內(nèi),ACK需要仍然沒有遞增,此時還是要繼續(xù)發(fā)送后續(xù)的數(shù)據(jù)包。這就是快速恢復(fù)。
在ACK需要增加之后就退出快速恢復(fù)。
快速重發(fā)可以修復(fù)一小段丟包,使得ACK時鐘持續(xù)運行
我們需要重新認(rèn)識AIMD,在丟包之后不會發(fā)生超時或者TCP慢啟動。而是減少滑動窗口后繼續(xù)發(fā)送數(shù)據(jù)
TCP Reno實現(xiàn)了慢啟動、快速重發(fā)、快速恢復(fù),指數(shù)減速是指將滑動窗口減速到原來的一半
TCP Reno, NewReno, SACK
Reno一次只能恢復(fù)一個丟包,多次丟包最終會超時然后重發(fā)
NewReno加強了ACK推斷的過程,一次能修復(fù)多個丟包并且不會發(fā)生超時重發(fā)
SACK是一個更好的方法,接收方可以發(fā)送一個范圍的ACK,這樣發(fā)送方就不需要猜測哪些數(shù)據(jù)包丟失了
阻塞信號
話題
路由器如何幫助主機避免阻塞
阻塞控制與避免阻塞
傳統(tǒng)的TCP到最后會讓網(wǎng)絡(luò)進(jìn)入阻塞狀態(tài)然后恢復(fù)
所以我們需要好的方法來避免阻塞,而不是進(jìn)行阻塞控制,碰到阻塞后重發(fā)
反饋信號
延遲和路由器信號可以讓我們避免阻塞
丟包、數(shù)據(jù)包延遲、路由器信號丟可以幫助我們避免阻塞
ECN 顯式阻塞信號
當(dāng)路由器檢測到網(wǎng)絡(luò)阻塞時,它會在受影響的數(shù)據(jù)包的IP頭中增加標(biāo)記。在數(shù)據(jù)包到達(dá)接收方之后,接收方會將數(shù)據(jù)包丟掉。這樣接收方就能知道網(wǎng)絡(luò)已經(jīng)發(fā)生阻塞了。然后接受方向發(fā)送方發(fā)送阻塞信號。
優(yōu)點
路由器向主機發(fā)送清楚的信息
阻塞能提早檢測到,避免了丟包的發(fā)生
不需要發(fā)送額外的數(shù)據(jù)包
缺點
路由器和主機需要升級才能支持ECN
我個人的觀點
為什么發(fā)生阻塞的時候信號要先傳遞給接收方呢?然后再由接收放傳遞給發(fā)送方。這樣不是浪費了很多時間嗎?我覺得可以在發(fā)生阻塞的時候?qū)⑿盘栔苯訌穆酚善靼l(fā)送到發(fā)送方,可以通過ICMP協(xié)議發(fā)送阻塞信號。這樣發(fā)送方就能更早地檢測到網(wǎng)絡(luò)阻塞了。
ACK序號=數(shù)據(jù)包序號+payload長度。所以對方發(fā)送seq=10,length=5的數(shù)據(jù)包時,接收方應(yīng)該回應(yīng)ack seq=15,而不是14
?
原文:http://blog.csdn.net/caipeichao2/article/details/26283067
總結(jié)
以上是生活随笔為你收集整理的计算机网络 tcp 阻塞,读书笔记:计算机网络第7章:阻塞控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。