當(dāng)前位置:首頁 > 公眾號(hào)精選 > 小林coding
[導(dǎo)讀]大家好,我是小林。之前圖解過TCP的滑動(dòng)窗口和流量控制的工作方式:圖解TCP重傳、滑動(dòng)窗口、流量控制、擁塞控制當(dāng)時(shí)花費(fèi)了好幾個(gè)星期肝了這篇文章,因?yàn)闉榱朔奖愦蠹依斫馑麅傻墓ぷ鞣绞?,以及一些異常場景的分析,畫了很多變化的圖。還沒看過的同學(xué),可以去看看,可以說把每一個(gè)階段的變化都解釋...

大家好,我是小林。之前圖解過 TCP 的滑動(dòng)窗口和流量控制的工作方式:圖解 TCP 重傳、滑動(dòng)窗口、流量控制、擁塞控制

當(dāng)時(shí)花費(fèi)了好幾個(gè)星期肝了這篇文章,因?yàn)闉榱朔奖愦蠹依斫馑麅傻墓ぷ鞣绞?,以及一些異常場景的分析,畫了很多變化的圖。

還沒看過的同學(xué),可以去看看,可以說把每一個(gè)階段的變化都解釋的很清楚了。

但是,不管怎么樣圖解,它始終不會(huì)動(dòng)呀,動(dòng)起來的話,大家學(xué)起來就會(huì)更加深刻了。

我最近剛好發(fā)現(xiàn)兩個(gè)網(wǎng)站。

可以以「動(dòng)圖」的方式來學(xué)習(xí) TCP 的滑動(dòng)窗口和流量控制工作方式。

滑動(dòng)窗口

滑動(dòng)窗口動(dòng)圖體驗(yàn)的網(wǎng)站地址:

https://www2.tkn.tu-berlin.de/teaching/rn/animations/gbn_sr/

下圖是我從網(wǎng)站錄制的一張動(dòng)圖:

每個(gè)長方塊代表一個(gè)數(shù)據(jù),上面的是發(fā)送方,下面的是接收方,長方塊的不同的顏色代表著不同的意義,而且發(fā)送發(fā)和接收方滑動(dòng)窗口的也是不同的。

先來說說,「發(fā)送方」的長方塊顏色:


  • 黃色:代表已發(fā)送并且已被確認(rèn)的數(shù)據(jù);

  • 藍(lán)色:代表已發(fā)送但未被確認(rèn)或者還未發(fā)送的數(shù)據(jù);

  • 灰色背景:代表滑動(dòng)窗口的大小,比如這個(gè)動(dòng)圖滑動(dòng)窗口大小是 5。

  • 紫色圈圈:代表超時(shí)重傳時(shí)間;

再來說說,「接收方」的長方塊顏色:


  • 深藍(lán)色:代表數(shù)據(jù)已經(jīng)被接收;

  • 白色:代表還未接收到的數(shù)據(jù);

  • 綠色:代表對發(fā)送方數(shù)據(jù)的ack確認(rèn)包;

這個(gè)網(wǎng)站,可以自行設(shè)置一些參數(shù)。

比如,可以設(shè)置滑動(dòng)窗口的大小、超時(shí)重傳時(shí)間、發(fā)送速率、確認(rèn)模式(選擇性確認(rèn)模式or普通確認(rèn)模式)等等。

我這里設(shè)置幾個(gè)參數(shù),給大家看看效果。

我把超時(shí)重傳時(shí)間時(shí)間縮短,并且確認(rèn)模式是普通確認(rèn)模式,動(dòng)圖效果如下:

可以看到,這種確認(rèn)模式在發(fā)生超時(shí)重傳的時(shí)候,會(huì)把發(fā)送窗口內(nèi)已發(fā)送的數(shù)據(jù)都會(huì)重傳一遍。

接著,我把確認(rèn)模式改成「選擇性確認(rèn)」。其動(dòng)圖效果如下:

可以看到,改用「選擇性確認(rèn)」的方式,只會(huì)重傳丟失的那一個(gè)數(shù)據(jù)。

流量控制

流量控制動(dòng)圖體驗(yàn)的網(wǎng)站地址:

https://www2.tkn.tu-berlin.de/teaching/rn/animations/flow/

這個(gè)網(wǎng)站的可以設(shè)置參數(shù)就比較少,理解起來也很容易。

我這里簡單介紹下這些參數(shù):

  • file size,發(fā)送的文件總大??;

  • buffer size,發(fā)送方和接收方的內(nèi)核緩沖區(qū)的大?。?/span>

  • propagation time,發(fā)送方和接收方之間的傳播時(shí)間。

下圖是我從網(wǎng)站錄制的一張動(dòng)圖:

可以看到,發(fā)送方和接收方共有兩個(gè)緩沖區(qū),一個(gè)是 buffer,指的是內(nèi)核緩沖區(qū),另外一個(gè)是 application,指的是應(yīng)用層的緩沖區(qū)。

對于發(fā)送發(fā)來說,當(dāng)要發(fā)送數(shù)據(jù)的時(shí)候,需要從 application 拷貝數(shù)據(jù)到 buffer,而對于接收方來說,當(dāng)接收到數(shù)據(jù)的時(shí)候,會(huì)先緩存到 buffer,然后再由應(yīng)用程序從 buffer 讀取數(shù)據(jù)。

當(dāng)接收方的 application 來不及從 buffer 讀取數(shù)據(jù),而導(dǎo)致 buffer 堆積滿了,這時(shí)接收方就會(huì)給發(fā)送方通報(bào)一個(gè)接收窗口為0的報(bào)文,表示我已經(jīng)不能再接收數(shù)據(jù)啦,比如下面這個(gè)情況。

大家可以去體驗(yàn)這兩個(gè)網(wǎng)站,我感覺做的還是挺不錯(cuò)到,對于學(xué)習(xí) TCP 滑動(dòng)窗口和流量控制會(huì)有很大的幫助。

當(dāng)然,在使用之前,最好自己要學(xué)一點(diǎn)理論知識(shí),看我之前的這篇就夠了:圖解 TCP 重傳、滑動(dòng)窗口、流量控制、擁塞控制

好了,這次就說到這啦,下次見~

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉