張家村碼頭的糧食堆積如山,每天都需要用船運(yùn)到鎮(zhèn)里,。
但是去鎮(zhèn)上有50公里,,只有水路可走。
一大早,,碼頭工人們就開始干活了,, 為了早點(diǎn)干完收工回家,一船接一船,,拼命地發(fā)送糧食,。
可是這水路不僅僅是張家村在運(yùn)糧食,白頭村還往外運(yùn)石頭,, 東平村還往外運(yùn)沙子,,大家都拼命地往外發(fā)貨物,再加上各式各樣,,絡(luò)繹不絕的商船,、客船,, 大家很快就發(fā)現(xiàn),船只太多,,水面出現(xiàn)擁堵,,工人們只好等待。
工人們想這也不是個(gè)事兒,,大家圍成一圈,,蹲在碼頭上一邊抽煙,一邊商量對(duì)策,。
水路很長(zhǎng),,怎么判斷水面是不是擁堵了呢?
新來的小張說道:“我有個(gè)辦法,,不要一下子發(fā)那么多船過去,, 我們來個(gè)慢啟動(dòng),首先運(yùn)輸一船糧食過去,,船到鎮(zhèn)上以后卸掉糧食馬上返回,,如果能在很短的時(shí)間內(nèi)返回,說明水面交通狀況還好,,可以繼續(xù)搬運(yùn)糧食,。
包工頭老李說:“不錯(cuò),這個(gè)船有檢測(cè)水面擁堵狀況的作用,。然后呢,?”
小張說: “接下來搬運(yùn)2船糧食過去,如果依舊能夠在預(yù)定的時(shí)間內(nèi)返回,,則繼續(xù)搬運(yùn)3船糧食,,每次加一船, 依次類推,?!?/p>
老王在碼頭上干了好幾年, 他立刻跳了起來:“拉到吧你,,這樣太慢了,!我提議,加快運(yùn)輸速度,,每次發(fā)送的船只數(shù)量是上一次的兩倍,。”
也就是說,,第一次發(fā)一條船,,如果在預(yù)定時(shí)間內(nèi)返回,第二次發(fā)2條船,,然后是4條船,,8條船!
老李說:“不行不行,,每次都是之前的兩倍,,增長(zhǎng)得太快了,大家如果都這么玩,,水路很快就阻塞了,。”
“我還沒說完,,” 老王補(bǔ)充,, “為了防止擁塞,我們?cè)O(shè)置一個(gè)閾值(其實(shí)就是TCP中的ssthresh),,當(dāng)一次發(fā)船數(shù)量達(dá)到這個(gè)數(shù),,我們就降低速度,不要翻倍,,每次只比上次多發(fā)一條船,。”
老王一邊說一邊拿了一根木棍在地上畫圖:
(點(diǎn)擊看大圖)
我們把前面的階段叫慢啟動(dòng)發(fā)船階段,,后面的階段叫擁塞避免發(fā)船階段,。
大家對(duì)老王的方案紛紛叫好,就是它了,!
只有小張慢悠悠地說:“隨著每次發(fā)送船只的數(shù)量越來越多,,水路早晚還是要阻塞的?!?/p>
“沒事,,”老王胸有成竹,“如果阻塞了,,我們就回到最初的狀態(tài),,從1條船,2條船,,4條船......開始,,但是,我們也要把閾值ssthresh調(diào)整一下,,把它變小,,嗯,假設(shè)上次阻塞時(shí)發(fā)船的數(shù)量是24,, 那就把閾值調(diào)整為它的一半,, 就是12。”
(點(diǎn)擊看大圖)
“不錯(cuò),,不錯(cuò),,當(dāng)水路頻繁阻塞時(shí),這個(gè)閾值就會(huì)下降得很快,,發(fā)到水面上的船也會(huì)大大減少,。” 包工頭老李總結(jié),,“我們要不按照這個(gè)方案試試,?”
小張嘴里嘟囔著:“試試就試試,不過你得和白頭村,,東平村他們協(xié)調(diào)好,,大家都得用這個(gè)方案才行,要不然我們就吃虧了,?!?/p>
“那是自然!這事我來辦,!”老李滿口答應(yīng),。
故事結(jié)束了嗎?其實(shí)沒有,,老王發(fā)明的其實(shí)叫做 TCP Tahoe算法,。TCP的擁塞控制還有兩個(gè)部分,即快速重傳和快速恢復(fù),,這里再簡(jiǎn)單介紹一下,。
快速重傳比較簡(jiǎn)單,用一個(gè)圖就可以表示:
在TCP中,,數(shù)據(jù)都是有序號(hào)的,,例如M1,M2,M3... 。
發(fā)送方發(fā)出了M1和M2, 接收方都收到了,。
但是M3報(bào)文丟失了,, 接收方?jīng)]有收到,隨后它收到了M4,M5,M6,, 按照快速重傳的算法,,接收方重復(fù)確認(rèn)M2,讓發(fā)送方知道,,M3沒有收到,。
當(dāng)發(fā)送方收到3個(gè)對(duì)M2的重復(fù)確認(rèn)的時(shí)候,它就意識(shí)到,,壞菜了,,M3丟了,, 這時(shí)候不必繼續(xù)等待M3設(shè)置的重傳計(jì)時(shí)器到期,立刻重傳M3,。
統(tǒng)計(jì)表明,,由于發(fā)送方盡早重傳未被確認(rèn)的報(bào)文段,可以使整個(gè)網(wǎng)絡(luò)吞吐量提高約20%,。
有了快速重傳,,可以改進(jìn)下故事中的擁塞避免模型了,。
(點(diǎn)擊看大圖)
當(dāng)發(fā)送端收到三個(gè)重復(fù)確認(rèn)的時(shí)候,,就執(zhí)行快速重傳算法,并且把閾值減少,。
但是這個(gè)時(shí)候它認(rèn)為網(wǎng)絡(luò)很可能沒有發(fā)生阻塞,, 不用執(zhí)行慢啟動(dòng)算法,而是直接從新閾值開始,,線性增大,。
這個(gè)算法稱為TCP Reno版,被很多TCP的實(shí)現(xiàn)所采用,。