TCP可靠傳輸,流量控制,擁塞控制,TCP的精華盡在于此
目錄
- 抓包過程以及TCP包首部
- 可靠傳輸
- 窗口概念引出接收窗口 rwnd 和發(fā)送窗口 cwnd
- 流量控制舉例來說明具體TCP流量控制過程
- 擁塞控制慢開始和擁塞避免算法快重傳和快恢復(fù)算法
- 流量控制和擁塞控制的區(qū)別
抓包過程以及TCP包首部
使用了 Wireshark 進(jìn)行抓包,用兩個(gè)最常用的 curl 和 ping 命令來演示抓包情況,開啟抓包。
- ## 先訪問我自己的網(wǎng)站首頁
- curl https://zengzhiqin.kuaizhan.com
- ## 再查看我自己網(wǎng)站的地址
- ping https://zengzhiqin.kuaizhan.com
Wireshark根據(jù) ping 命令得到的地址進(jìn)行條件過濾,得到上面兩個(gè)命令所得到的包,主要有 TCP(https基于tcp協(xié)議)協(xié)議和 ICMP(ping命令是基于 ICMP 協(xié)議)協(xié)議的包,如下圖所示:

抓包分析

TCP首部數(shù)據(jù)一一對(duì)應(yīng)

TCP頭部
可靠傳輸
TCP 實(shí)現(xiàn)可靠傳輸?shù)乃姆N實(shí)現(xiàn)方法:
- 校驗(yàn)
- 序號(hào)
- 確認(rèn)
- 重傳
第1,2兩種機(jī)制,在我公眾號(hào)另外一篇有詳細(xì)講解,這里我主要講述第3,4種。
可靠傳輸目的: 就是要讓發(fā)送方發(fā)送的所有數(shù)據(jù),接收方都能完整,按序收到。
正如宮本武藏的口頭禪“排好隊(duì),一個(gè)一個(gè)來”一樣,使用最笨的方法來解決最難的問題,既然你要可靠那么就一個(gè)一個(gè)確認(rèn),只要你沒告訴我你收到了,那么我就一直重發(fā)。
可靠傳輸?shù)墓ぷ髟恚和V沟却齾f(xié)議

可靠與不可靠解決方式
我分為了四張圖,豎線代表的是時(shí)間軸,RTT代表數(shù)據(jù)包發(fā)過去然后確認(rèn)包發(fā)回來的往返時(shí)間,分別是”無差錯(cuò)你好我好大家好的情況下“,”發(fā)送超時(shí)或者失敗“情況下,”確認(rèn)超時(shí)“和”確認(rèn)丟失“的情況下來分析的。通過這種確認(rèn)重傳機(jī)制,TCP就可以實(shí)現(xiàn)可靠傳輸,也就是第3,4點(diǎn)的實(shí)現(xiàn)方式。需要知道的一點(diǎn)是,重傳這個(gè)動(dòng)作是發(fā)送方自發(fā)行為,并不需要接收方通知它進(jìn)行重傳。
窗口概念引出
上面的方法,確實(shí)不錯(cuò)哈,用了最簡單的方法解決了可靠傳輸這個(gè)問題,可是網(wǎng)絡(luò)時(shí)時(shí)刻刻那么忙,我等你一來一回的確認(rèn)宮本武藏一個(gè)大招跳出去估計(jì)是一節(jié)一節(jié)的落地了,黃花菜都涼了。
上述停止等待協(xié)議最大的問題是信道利用率太低了。

停止等待傳輸
RTT時(shí)間是由網(wǎng)絡(luò)狀況決定拯救不了,T2一般也是固定的,由公式可看出,想要提高信道利用率只能從 T1 下手。

流水線傳輸
發(fā)送方可以連續(xù)發(fā)送多個(gè)包,不用每次都停下來等待確認(rèn)再繼續(xù)發(fā),將上面這些的連續(xù)發(fā)送的包用一個(gè)窗口來包含起來即TCP窗口的由來,如下圖:

滑動(dòng)窗口
既然你發(fā)送方為了不一個(gè)一個(gè)包發(fā)可以有窗口技術(shù),那么我接收方肯定也不甘落后得學(xué)起來啊,即不進(jìn)行一個(gè)一個(gè)確認(rèn),轉(zhuǎn)而累積確認(rèn)。

接收方累積確認(rèn)方式
接收窗口 rwnd 和發(fā)送窗口 cwnd
此處涉及到二個(gè)窗口:
接收窗口receiver window(即rwnd),是接收方根據(jù)自己的承受能力設(shè)置的接收緩存值大小,反映了接收方的接收能力,來做流量控制。
擁塞窗口congestion window(即cwnd),是發(fā)送方根據(jù)網(wǎng)絡(luò)擁塞程度設(shè)置的網(wǎng)絡(luò)窗口值,發(fā)送窗口=min(rwnd,cwnd)即是接收窗口和擁塞窗口的最小值,來做擁塞控制。
窗口數(shù)據(jù)結(jié)構(gòu)如下:

窗口數(shù)據(jù)結(jié)構(gòu)
其實(shí)看似這么高深的東西,一步步想過來竟是如此簡單,感嘆一句”啊,聰明的人類“(調(diào)皮一下哈哈哈)。
流量控制
上面說到了通過窗口可以增大信道的利用率,然后就是窗口的大小怎么設(shè)置,設(shè)置多大,窗口還可以用來做什么?
發(fā)送方如果發(fā)的過快,那么接收方就會(huì)來不及接受,就會(huì)丟包,這肯定不行啊,萬一別人給我發(fā)了很多紅包丟一個(gè)我都不想噠~

分段傳輸
流量控制目的:讓發(fā)送方根據(jù)網(wǎng)絡(luò)狀況動(dòng)態(tài)的調(diào)整發(fā)送頻率,好讓接收方來得及接收。
TCP利用滑動(dòng)窗口機(jī)制實(shí)現(xiàn)流量控制。發(fā)送方的發(fā)送窗口是動(dòng)態(tài)變化的,取決于接收方返回的報(bào)文段的窗口大小,可能是數(shù)據(jù)報(bào)文段也可能是確認(rèn)報(bào)文,因?yàn)門CP包首部都有窗口信息,還是這張圖再看一下窗口數(shù)據(jù):

舉例來說明具體TCP流量控制過程
A主機(jī)向B主機(jī)發(fā)送數(shù)據(jù),建立連接的時(shí)候 B 告訴 A:”大哥,我的rwnd=400byte“,假設(shè)每個(gè)報(bào)文段都是100byte,初始序號(hào)是1,三次流量控制溝通過程如下:

舉例來說明具體TCP流量控制過程
這張圖,最后 rwnd=0 了,這種情況持續(xù)到接收端騰出了新的接收緩存之后 B會(huì)主動(dòng)給 A發(fā)送他的新的 rwnd,0窗口通知的時(shí)候 A 就會(huì)一直等待接收方新的 rwnd 通知,為了防止新的 rwnd 丟失了,之前的文章很多都分析過這種情況,為了解決包超時(shí)收不到確認(rèn)設(shè)置了等待一段時(shí)間就重傳,四次揮手過程設(shè)置了最后需要等待 2MSL 時(shí)間發(fā)送端才關(guān)閉,這些時(shí)間都是通過設(shè)置計(jì)時(shí)器來計(jì)時(shí),都是為了解決包丟失了造成死鎖。同樣這里為了解決新的 rwnd 丟失了造成 A 死鎖發(fā)送端只要收到了0窗口通知就會(huì)啟動(dòng)計(jì)時(shí)器,若時(shí)間到了就會(huì)重新發(fā)送一個(gè)0窗口探測(cè)報(bào)文,接收方再回復(fù)現(xiàn)在的接收窗口。
瘋狂試探
擁塞控制
我家小區(qū)網(wǎng)絡(luò)最好的時(shí)候是晚上3-6點(diǎn),上午10-12點(diǎn),下午3-5點(diǎn),這些時(shí)間段我玩王者最暢快,晚上8-11點(diǎn)網(wǎng)絡(luò)高峰時(shí)段每次卡一下回過神我就站在了泉水(真的好開心)。
試想一下原本網(wǎng)絡(luò)就不好,然后你還一次性向網(wǎng)絡(luò)倒那么多數(shù)據(jù)包,大家都別過去了都超時(shí),然后超時(shí)時(shí)間到了又都重發(fā),惡性循環(huán)下去使得原本就不富裕的網(wǎng)絡(luò)更加雪上加霜,因此 TCP 你要自己學(xué)聰明,進(jìn)行擁塞控制。 擁塞控制的目的就是防止過多的數(shù)據(jù)注入到網(wǎng)絡(luò)中,網(wǎng)絡(luò)堵塞使得包一直到不了接收端。

擁塞控制起到的作用
擁塞控制算法有四種:
- 慢開始
- 擁塞避免
- 快重傳
- 快恢復(fù)
慢開始和擁塞避免算法

慢開始和擁塞避免算法
一個(gè)傳輸輪次指的是發(fā)送了一批報(bào)文段并且收到了確認(rèn)的時(shí)間 RTT。
慢開始是指數(shù)增長,一直試探網(wǎng)絡(luò)狀況如果健康就一直指數(shù)增長。到了ssthresh值的時(shí)候,這是慢開始輪限值,開始線性增長,一直增長到網(wǎng)絡(luò)擁塞的話,跳崖式降低一夜回到解放前,從1開始,將新的ssthresh值調(diào)低為原來擁塞時(shí)候的一半又開始指數(shù)增長,就這樣動(dòng)態(tài)的變化。
快重傳和快恢復(fù)算法

快重傳和快恢復(fù)算法
從圖可以看到這個(gè)算法前面和慢開始擁塞避免算法是一致的,主要是調(diào)整了跳崖式降低發(fā)送速率這個(gè)地方,這樣從0開始效率太低了,如果是男女朋友間在發(fā)送微信豈不是被折磨的心癢癢。
擁塞窗口cwnd每次指數(shù)增長一次都是在收到了確認(rèn)報(bào)文的情況下增長的,比如A發(fā)送1,23,4,5,6這些報(bào)文段,2丟失了,1345都收到了那么每次345收到都會(huì)給A發(fā)送確認(rèn)1收到了的確認(rèn)報(bào)文讓他發(fā)2(這個(gè)地方上一篇有提到),這種算法就是在2的超時(shí)計(jì)時(shí)器到期之前收到了三個(gè)確認(rèn)之后就馬上重傳2,接收方都催著要了哥,后面三個(gè)確認(rèn)包都到了說明網(wǎng)絡(luò)厚愛好的嘛就是你迷路了,因此進(jìn)行快速重傳還是將新的ssthresh值調(diào)低為原來擁塞時(shí)候的一半又開始指數(shù)增長,現(xiàn)在一般是用這種,上面那種方法猶豫效率太低了被淘汰了。
流量控制和擁塞控制的區(qū)別
流量控制是點(diǎn)到點(diǎn)的問題,一對(duì)一,如果接收方的數(shù)據(jù)來不及接收那么就能直接找到發(fā)送方這個(gè)罪魁禍?zhǔn)祝饕且驗(yàn)榻邮辗絹聿患敖邮馨l(fā)送方的數(shù)據(jù);
擁塞控制是多對(duì)一,一個(gè)接收方 面對(duì)多個(gè)發(fā)送方出現(xiàn)了網(wǎng)絡(luò)擁堵,接收方找不到具體的發(fā)送方,主要是因?yàn)榫W(wǎng)絡(luò)發(fā)生了堵塞發(fā)送方數(shù)據(jù)遲遲到不了接收方。
簡單理解,擁塞控制是路上堵車,流量控制是停車場(chǎng)停車車位不夠。
這篇內(nèi)容陸陸續(xù)續(xù)寫了好幾天了,感覺概念性的東西很多,我已經(jīng)盡量再用聊天式的輕松語氣來寫了。北京今天下雨了,五道口兩旁的樹木長得郁郁蔥蔥,抬頭看見樹葉將天空撕成了碎片,耳機(jī)里一直在循環(huán)毛不易低沉性感聲線唱著的”一路山程“,我就這樣撐著傘走在這個(gè)都市的心臟上,一路憧憬著未來。