精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

TCP 滑動(dòng)窗口原理解析

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
計(jì)算機(jī)之間使用 TCP 協(xié)議進(jìn)行傳輸數(shù)據(jù)時(shí),每次連接都需要經(jīng)過 3 個(gè)階段:創(chuàng)建連接、數(shù)據(jù)傳送和釋放連接,即傳輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接、然后傳輸數(shù)據(jù)、最后斷開連接,它保證兩臺(tái)計(jì)算機(jī)之間比較可靠的數(shù)據(jù)傳輸。

一、摘要

前些日子,在分享網(wǎng)絡(luò)編程知識(shí)文章的時(shí)候,有個(gè)網(wǎng)友私信給我留言了一條“能不能寫一篇關(guān)于 TCP 滑動(dòng)窗口原理的文章”。

當(dāng)時(shí)沒有立即回復(fù),經(jīng)過查詢多方資料,發(fā)現(xiàn)這個(gè) TCP 真的非常非常的復(fù)雜,就像一個(gè)清澈的小溝,你以為很淺,結(jié)果一腳踩下去,感覺深不可測(cè)。

雖然之前也總結(jié)過一些關(guān)于網(wǎng)絡(luò)編程相關(guān)的技術(shù)知識(shí),對(duì)于 TCP 協(xié)議棧也做過一些介紹,但是大體上都描述的比較簡(jiǎn)單,沒有深入去了解,本篇在很大程度上彌補(bǔ)了我對(duì)計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)的空白。

話不多說,直接上干貨!

二、TCP 數(shù)據(jù)傳輸

在之前的文章中我們了解到,TCP 協(xié)議能保證網(wǎng)絡(luò)上的計(jì)算機(jī)之間可靠無(wú)差錯(cuò)的數(shù)據(jù)傳輸,比如上傳文件、下載文件、瀏覽網(wǎng)頁(yè)等都得益于它,實(shí)際的應(yīng)用場(chǎng)景非常廣泛。

與 TCP 協(xié)議一并稱霸天下的還有 UDP 協(xié)議,不過 UDP 協(xié)議雖然傳輸效率更高,但是并不保證數(shù)據(jù)傳輸正確性,相比 TCP 要稍遜一些。

事實(shí)上,TCP 協(xié)議經(jīng)過多年的發(fā)展,已經(jīng)成為實(shí)現(xiàn)數(shù)據(jù)可靠傳輸?shù)臉?biāo)準(zhǔn)協(xié)議,所謂可靠,就是確保數(shù)據(jù)準(zhǔn)確的、不重復(fù)、無(wú)延遲的到達(dá)目的地,那 TCP 協(xié)議是如何實(shí)現(xiàn)這些特點(diǎn)的呢?

其實(shí)要實(shí)現(xiàn)數(shù)據(jù)可靠傳輸,并不簡(jiǎn)單,因?yàn)橐紤]異常的情況比較多,例如數(shù)據(jù)丟失、數(shù)據(jù)順序混亂、網(wǎng)絡(luò)擁堵等,如果不能解決這些問題,也就無(wú)從談起可靠傳輸。

總的來(lái)說,TCP 協(xié)議是通過序列號(hào)、確認(rèn)應(yīng)答、重發(fā)控制、連接管理以及窗口控制等機(jī)制實(shí)現(xiàn)數(shù)據(jù)穩(wěn)定可靠性的傳輸。

以下是 TCP 協(xié)議的報(bào)文格式。

圖片圖片

TCP 報(bào)文段包括協(xié)議首部和數(shù)據(jù)兩部分,協(xié)議首部的固定部分是 20 個(gè)字節(jié),頭部是固定部分,后面是選項(xiàng)部分。

下面是報(bào)文段首部各個(gè)字段的含義:

  • 源端口號(hào)以及目的端口號(hào):各占 2 個(gè)字節(jié),端口是傳輸層和應(yīng)用層的服務(wù)接口,用于尋找發(fā)送端和接收端的進(jìn)程,一般來(lái)講,通過端口號(hào)和IP地址,可以唯一確定一個(gè) TCP 連接,在網(wǎng)絡(luò)編程中,通常被稱為一個(gè) socket 接口。
  • 序號(hào):Seq 序號(hào),占 4 個(gè)字節(jié)。用來(lái)標(biāo)識(shí)從 TCP 發(fā)送端向 TCP 接收端發(fā)送的數(shù)據(jù)字節(jié)流序號(hào),發(fā)起方發(fā)送數(shù)據(jù)時(shí)對(duì)此進(jìn)行標(biāo)記。
  • 確認(rèn)序號(hào):Ack 序號(hào),占 4 個(gè)字節(jié),包含接受端所期望收到的下一個(gè)序號(hào)。只有 ACK 標(biāo)記位為 1 時(shí),確認(rèn)序號(hào)字段才有效,因此,確認(rèn)序號(hào)應(yīng)該是上次已經(jīng)成功收到數(shù)據(jù)字節(jié)序號(hào)加 1,即 Ack = Seq + 1。
  • 數(shù)據(jù)偏移:占 4 個(gè)字節(jié),用于指出 TCP 首部長(zhǎng)度。
  • 保留字段:占 6 位,暫時(shí)可忽略,值全為 0。
  • 六位標(biāo)志位:值內(nèi)容含義如下

URG(緊急):為1時(shí)表明緊急指針字段有效

ACK(確認(rèn)):為1時(shí)表明確認(rèn)號(hào)字段有效

PSH(推送):為1時(shí)接收方應(yīng)盡快將這個(gè)報(bào)文段交給應(yīng)用層

RST(復(fù)位):為1時(shí)表明TCP連接出現(xiàn)故障必須重建連接

SYN(同步):在連接建立時(shí)用來(lái)同步序號(hào)

FIN(終止):為1時(shí)表明發(fā)送端數(shù)據(jù)發(fā)送完畢要求釋放連接

  • 窗口:占 2 個(gè)字節(jié),用于流量控制和擁塞控制,表示當(dāng)前接收緩沖區(qū)的大小。
  • 校驗(yàn)和:占 2 個(gè)字節(jié),范圍包括首部和數(shù)據(jù)兩部分
  • 緊急指針:指出了緊急數(shù)據(jù)的末尾在報(bào)文段中的位置,和 URG 搭配使用
  • 選項(xiàng)和填充:是可選的,默認(rèn)情況是不選。

計(jì)算機(jī)之間使用 TCP 協(xié)議進(jìn)行傳輸數(shù)據(jù)時(shí),每次連接都需要經(jīng)過 3 個(gè)階段:創(chuàng)建連接、數(shù)據(jù)傳送和釋放連接,即傳輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接、然后傳輸數(shù)據(jù)、最后斷開連接,它保證兩臺(tái)計(jì)算機(jī)之間比較可靠的數(shù)據(jù)傳輸。

2.1、創(chuàng)建連接

當(dāng)兩個(gè)設(shè)備之間準(zhǔn)備傳輸數(shù)據(jù)之前,TCP 會(huì)建立連接,創(chuàng)建連接的階段需要三次握手,過程如下:

圖片圖片

詳細(xì)過程如下:

  • 第一次握手:客戶端向服務(wù)器端發(fā)出連接請(qǐng)求,等待服務(wù)器確認(rèn)
  • 第二次握手:服務(wù)器端收到請(qǐng)求后,向客戶端回送一個(gè)確認(rèn),通知客戶端收到了連接請(qǐng)求
  • 第三次握手:客戶端再次向服務(wù)器端發(fā)送確認(rèn)信息,確認(rèn)連接

完成以上 3 次握手之后,可靠性連接建立完成,就可以進(jìn)行數(shù)據(jù)傳輸了。

2.2、釋放連接

當(dāng)數(shù)據(jù)傳輸完畢之后,TCP 會(huì)釋放連接,連接的釋放需要四次揮手,過程如下:

圖片圖片

  • 第一次揮手:客戶端向服務(wù)器端發(fā)出請(qǐng)求切斷連接,等待服務(wù)器確認(rèn)
  • 第二次揮手:服務(wù)器端收到請(qǐng)求后,向客戶端回送一個(gè)確認(rèn)信息,并同意關(guān)閉請(qǐng)求
  • 第三次揮手:服務(wù)器端再次向客戶端發(fā)出請(qǐng)求切斷連接,等待客戶端確認(rèn)
  • 第四次揮手:客戶端收到請(qǐng)求后,向服務(wù)器端回送一個(gè)確認(rèn)信息,并同意關(guān)閉請(qǐng)求

完成以上 4 次揮手之后,連接釋放完成。

2.3、數(shù)據(jù)傳輸過程

通過以上的介紹,我們可以描繪出一個(gè)簡(jiǎn)易版的 TCP 數(shù)據(jù)傳輸過程,如下圖所示。

圖片圖片

通過序列號(hào)與確認(rèn)應(yīng)答機(jī)制,是 TCP 實(shí)現(xiàn)數(shù)據(jù)可靠傳輸?shù)姆绞街唬彩亲顬橹匾幕?/p>

但是在復(fù)雜的網(wǎng)絡(luò)環(huán)境下,并不一定能如上圖所描述的那樣順利的進(jìn)行數(shù)據(jù)傳輸,例如數(shù)據(jù)包丟失,針對(duì)這種問題,TCP 使用了重傳機(jī)制來(lái)解決。

三、重傳機(jī)制介紹

當(dāng)網(wǎng)絡(luò)不穩(wěn)定的時(shí)候,很容易出現(xiàn)數(shù)據(jù)包丟失,TCP 采用了哪些重傳手段來(lái)解決數(shù)據(jù)包丟失問題呢?

常見的重傳方式有以下幾種:

  • 超時(shí)重傳
  • 快速重傳
  • SACK
  • D-SACK

3.1、超時(shí)重傳

超時(shí)重傳,顧名思義,就是在發(fā)送數(shù)據(jù)時(shí),設(shè)定一個(gè)定時(shí)器,當(dāng)超過指定的時(shí)間后,沒有收到對(duì)方的 ACK 確認(rèn)應(yīng)答報(bào)文,就會(huì)重發(fā)數(shù)據(jù)。

TCP 會(huì)在以下兩種情況發(fā)生超時(shí)重傳:

  • 發(fā)送的數(shù)據(jù)包丟失
  • 確認(rèn)應(yīng)答丟失

其中比較關(guān)鍵的就是超時(shí)重傳時(shí)間如何來(lái)設(shè)定的問題。

我們先來(lái)看看正常的數(shù)據(jù)傳輸過程。

圖片圖片

其中 RTT 指的是數(shù)據(jù)從網(wǎng)絡(luò)一端傳送到另一端所需的時(shí)間,也就是數(shù)據(jù)包發(fā)送出去的往返時(shí)間。

超時(shí)重傳時(shí)間,我們以 RTO (Retransmission Timeout 超時(shí)重傳時(shí)間)來(lái)表示。

當(dāng)超時(shí)重傳時(shí)間設(shè)定過大,會(huì)出現(xiàn)什么情況呢?如下圖所示

圖片圖片

當(dāng)超時(shí)重傳時(shí)間設(shè)定過小,又會(huì)出現(xiàn)什么情況呢?如下圖所示

圖片圖片

一路分析下來(lái),可以得出如下結(jié)論:

  • 當(dāng)超時(shí)重發(fā)時(shí)間 RTO 設(shè)置較大時(shí),會(huì)出現(xiàn)數(shù)據(jù)傳輸效率差的現(xiàn)象,比如數(shù)據(jù)包丟失之后,需要等很長(zhǎng)時(shí)間才重發(fā),性能差;
  • 當(dāng)超時(shí)重發(fā)時(shí)間 RTO 設(shè)置較小時(shí),可能會(huì)出現(xiàn)并沒有丟失包就重發(fā),多次重發(fā)會(huì)造成網(wǎng)絡(luò)擁堵,導(dǎo)致出現(xiàn)更多的超時(shí),更多的超時(shí)意味著更多的重發(fā);

因此可以得出一個(gè)結(jié)論,超時(shí)重發(fā)時(shí)間既不能設(shè)置過大,也不能設(shè)置過小,必須精準(zhǔn)的計(jì)算。

以 Linux 操作系統(tǒng)為例,RTO 的計(jì)算過程如下!

  • 首先對(duì) TCP 數(shù)據(jù)傳輸所需的往返時(shí)間,也就是 RTT 值進(jìn)行采樣,然后進(jìn)行加權(quán)平均,算出一個(gè)平滑 RTT 的值,同時(shí)這個(gè)值隨著網(wǎng)絡(luò)狀態(tài)會(huì)不斷的變化。
  • 除了采樣 RTT 值,還要記錄 RTT 的波動(dòng)變化,避免 RTT 的變化較大,難以發(fā)現(xiàn)

圖片圖片

其中SRTT是計(jì)算平滑的RTT ,DevRTR是計(jì)算平滑的RTT與最新RTT的差距,在 Linux 下,通常α = 0.125,β = 0.25,μ = 1,? = 4。

實(shí)際算出來(lái)的超時(shí)重傳時(shí)間RTO的值應(yīng)該略大于報(bào)文往返RTT的值。

如果超時(shí)重發(fā)的數(shù)據(jù),再次超時(shí)的時(shí)候,又需要重傳的時(shí)候,TCP 的策略是超時(shí)間隔加倍。

也就是說,每當(dāng)遇到一次超時(shí)重傳的時(shí)候,會(huì)將下一次超時(shí)時(shí)間間隔設(shè)為先前值的兩倍,多次超時(shí)說明網(wǎng)絡(luò)環(huán)境差,不宜頻繁反復(fù)重發(fā)。

3.2、快速重傳

超時(shí)重傳雖然能解決數(shù)據(jù)丟包的問題,但是超時(shí)重發(fā)時(shí)間有時(shí)候可能會(huì)較長(zhǎng),有沒有一種更快的重傳方式呢?

快速重傳就是來(lái)補(bǔ)充超時(shí)重傳機(jī)制中時(shí)間過長(zhǎng)的問題。

簡(jiǎn)單的說,快速重傳不像超時(shí)重傳那樣通過時(shí)間來(lái)驅(qū)動(dòng)重發(fā),而是通過次數(shù)來(lái)驅(qū)動(dòng)重發(fā)。

當(dāng)收到報(bào)文重復(fù)的 ACK 數(shù)量,到達(dá)一定的閥值(一般為3),TCP 會(huì)在定時(shí)器過期之前,檢查丟失的報(bào)文段并重傳丟失的報(bào)文段。

大致的工作方式,可以用如下圖來(lái)描述!

圖片圖片

在上圖,發(fā)送方向接受方發(fā)出了 1、2、3、4、5 份數(shù)據(jù),大致執(zhí)行的過程如下:

  • 第一份 Seq1 先送到了,接受方就 Ack 回 2,表示 seq 1 已經(jīng)收到,準(zhǔn)備接受下一個(gè)序列號(hào)為 2 的包
  • Seq2 因?yàn)槟承┰驔]收到,Seq3 到達(dá)了,因?yàn)?Seq2 缺失,還是 Ack 回 2
  • 后面的 Seq4 和 Seq5 都到了,因?yàn)?Seq2 沒有收到,還是 Ack 回 2
  • 發(fā)送端收到了三個(gè) Ack = 2 的確認(rèn),知道了 Seq2 還沒有收到,就會(huì)在定時(shí)器過期之前,重傳丟失的 Seq2
  • 最后接收方收到了 Seq2,此時(shí)因?yàn)?Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。

因此,快速重傳的工作方式是當(dāng)收到相同的 ACK 報(bào)文數(shù)量到達(dá)一個(gè)閥值,默認(rèn)是 3,會(huì)在定時(shí)器過期之前,重傳丟失的報(bào)文段。

快速重傳機(jī)制彌補(bǔ)了超時(shí)重傳機(jī)制中時(shí)間過長(zhǎng)的問題,但是它依然面臨著另外一個(gè)問題,那就是重傳的時(shí)候,是重傳之前的一個(gè)還是重傳所有的包?

例如上面的例子,是重傳 Seq2 呢?還是重傳 Seq2、Seq3、Seq4、Seq5 呢?

根據(jù) TCP 不同的實(shí)現(xiàn),以上兩種情況都有可能。

3.3、SACK 方法

為了解決不知道該重傳哪些 TCP 報(bào)文,天才師們想出來(lái)了SACK方法,英文全稱:Selective Acknowledgment,也被稱為選擇性確認(rèn)。

具體實(shí)現(xiàn)就是需要在 TCP 頭部選項(xiàng)字段里加一個(gè) SACK 的東西,接受方可以將緩存的數(shù)據(jù)地圖發(fā)送給發(fā)送方,這樣發(fā)送方就可以知道哪些數(shù)據(jù)收到了,哪些數(shù)據(jù)沒收到,知道了這些信息,就可以只重傳丟失的數(shù)據(jù)。

如下圖,當(dāng)發(fā)送方收到了三次同樣的 ACK 確認(rèn)報(bào)文,于是就會(huì)觸發(fā)快速重發(fā)機(jī)制,通過 SACK 信息發(fā)現(xiàn)只有200~299這段數(shù)據(jù)丟失,會(huì)將丟失的片段進(jìn)行重發(fā),以便提升數(shù)據(jù)傳輸可靠性效率。

圖片圖片

需要主要的是,如果要支持 SACK 機(jī)制,必須發(fā)送方和接受方都要支持。在 Linux 操作系統(tǒng)中,開發(fā)者可以通過net.ipv4.tcp_sack參數(shù)打開這個(gè)功能(Linux 2.4 后默認(rèn)打開)。

3.4、Duplicate SACK 方法

最后再來(lái)講講 Duplicate SACK 方法,又稱D-SACK,這個(gè)方法實(shí)現(xiàn)主要是使用  SACK和ACK來(lái)告訴發(fā)送方有哪些數(shù)據(jù)被重復(fù)接收了,以防止 TCP 反復(fù)的重發(fā)。

我們用個(gè)案例來(lái)介紹D-SACK的作用,例如 ACK 丟包的場(chǎng)景,如下圖!

圖片圖片

過程分析:

  • 發(fā)送方向成功向接受方發(fā)送了兩個(gè)數(shù)據(jù)包,但是接受方發(fā)給發(fā)送方兩個(gè) ACK 確認(rèn)應(yīng)答都丟失了,發(fā)送方檢查超時(shí)后,重傳第一個(gè)數(shù)據(jù)包(100 ~ 199)
  • 接收方發(fā)現(xiàn)數(shù)據(jù)是重復(fù)收到的,于是回了一個(gè)ACK 300和 SACK 100~199,告訴發(fā)送方100~299的數(shù)據(jù)早已被接收了,因?yàn)?ACK 都到300了,因此這個(gè) SACK 可以稱為D-SACK。
  • 當(dāng)發(fā)送方知道數(shù)據(jù)沒有丟,是接收方的 ACK 確認(rèn)報(bào)文丟了,就不會(huì)繼續(xù)重發(fā)數(shù)據(jù)包了

使用D-SACK方法的好處,可以讓發(fā)送方知道,是發(fā)出去的包丟了還是接收方回應(yīng)的 ACK 包丟了,然后來(lái)決定是否需要繼續(xù)重發(fā)包。

在 Linux 操作系統(tǒng)下,可以通過net.ipv4.tcp_dsack參數(shù)來(lái)開啟/關(guān)閉這個(gè)功能(Linux 2.4 后默認(rèn)打開)。

四、滑動(dòng)窗口介紹

在上文中,我們有介紹到 TCP 協(xié)議的數(shù)據(jù)傳輸機(jī)制,當(dāng)兩臺(tái)計(jì)算機(jī)之間建立連接之后,就可以進(jìn)行傳輸數(shù)據(jù)了,TCP 每發(fā)送一個(gè)數(shù)據(jù),都要進(jìn)行一次確認(rèn)應(yīng)答,當(dāng)上一個(gè)數(shù)據(jù)包收到了應(yīng)答了, 再發(fā)送下一個(gè),從而保證數(shù)據(jù)的可靠傳輸。

圖片圖片

這種傳輸方式,雖然可靠但是缺點(diǎn)也比較明顯,傳輸數(shù)據(jù)的效率非常的低下,好比你現(xiàn)在跟某個(gè)人打電話,你說了一句話,只有等到對(duì)方回復(fù)了你,你才能說下一句,這顯然不現(xiàn)實(shí)。

為解決這個(gè)問題,TCP 引入了滑動(dòng)窗口,可以一次性向窗口中發(fā)送多個(gè)數(shù)據(jù)包并不需要依次等待接受方的確認(rèn)應(yīng)答,即使在往返時(shí)間較長(zhǎng)的情況下,它也不會(huì)降低數(shù)據(jù)傳輸效率。

那什么是滑動(dòng)窗口呢?我們以高速路的收費(fèi)站為例,做一個(gè)類比介紹。

上過高速的同學(xué)應(yīng)該都知道,在高速路上有一個(gè)入口收費(fèi)站和一個(gè)出口收費(fèi)站。TCP 也是一樣的,除了入口有發(fā)送方滑動(dòng)窗口,出口處也設(shè)立有接收方滑動(dòng)窗口。

圖片圖片

對(duì)于發(fā)送方滑動(dòng)窗口,我們可以把數(shù)據(jù)包看成車輛,分類它們的狀態(tài):

  • 還未進(jìn)入入口收費(fèi)站的車輛:對(duì)應(yīng)的是上圖Not Sent,Recipient Not Ready to Receive部分,這些屬于發(fā)送端未發(fā)送,同時(shí)接收端也未準(zhǔn)備接收的數(shù)據(jù)
  • 已進(jìn)入收費(fèi)站但未進(jìn)入高速路的車輛:對(duì)應(yīng)的是上圖Not Sent,Recipient Ready to Receive部分,這些屬于發(fā)送端未發(fā)送,但已經(jīng)告知接收方的數(shù)據(jù),其實(shí)已經(jīng)在窗口中(發(fā)送端緩存)了,等待發(fā)送。
  • 在高速公路上行駛的車輛:對(duì)應(yīng)的是上圖Send But Not Yet Acknowledged部分,這些屬于發(fā)送端已發(fā)送出去,等到接收方接受的數(shù)據(jù),屬于窗口內(nèi)的數(shù)據(jù)。
  • 到達(dá)出口收費(fèi)站的車輛:對(duì)應(yīng)的是上圖Sent and Acknowledged部分,這些屬于已經(jīng)發(fā)送成功并已經(jīng)被接受的數(shù)據(jù),這些數(shù)據(jù)已經(jīng)離開窗口了。

同樣,對(duì)于接受方滑動(dòng)窗口,我們也可以把數(shù)據(jù)包看成車輛,分類它們的狀態(tài):

  • 還未到達(dá)出口收費(fèi)站的車輛:狀態(tài)為Not Received,表示還沒有被接收的數(shù)據(jù)。
  • 到達(dá)出口收費(fèi)站但未完成繳費(fèi)的車輛:狀態(tài)為Received Not ACK,表示已經(jīng)被接受但是還沒有回復(fù) ACK
  • 繳完費(fèi)并離開出口收費(fèi)站的車輛:狀態(tài)為Received and ACK,表示已經(jīng)被接受并回復(fù)了 ACK

通過以上的描述,相信大家對(duì)滑動(dòng)窗口已經(jīng)有了初步的認(rèn)識(shí),在整個(gè)數(shù)據(jù)傳輸過程中,光線傳輸類似于高速公路,滑動(dòng)窗口類似于收費(fèi)站,通過收費(fèi)站可以做到對(duì)車輛進(jìn)行適當(dāng)?shù)牧髁靠刂疲苑乐垢咚俟烦霈F(xiàn)擁堵,滑動(dòng)窗口也有同樣的作用。

4.1、發(fā)送方的滑動(dòng)窗口

下圖就是發(fā)送方的滑動(dòng)窗口樣例圖,根據(jù)處理的情況分成四個(gè)部分,其中深藍(lán)色方框是發(fā)送窗口,紫色方框是可用窗口。

圖片圖片

含義解釋:

  • #1表示已發(fā)送并收到 ACK 確認(rèn)的數(shù)據(jù):1~31 字節(jié)
  • #2表示已發(fā)送但未收到 ACK 確認(rèn)的數(shù)據(jù):32~45 字節(jié)
  • #3表示未發(fā)送但總大小在接收方處理范圍內(nèi):46~51字節(jié)
  • #4表示未發(fā)送但總大小超過接收方處理范圍:52 字節(jié)以后

當(dāng)發(fā)送方把數(shù)據(jù)全部都一下發(fā)送出去后,可用窗口的大小就為 0 了,表明可用窗口耗盡,在沒收到接受方 ACK 確認(rèn)之前是無(wú)法繼續(xù)發(fā)送數(shù)據(jù)的。

圖片圖片

當(dāng)收到之前發(fā)送的數(shù)據(jù)32~36字節(jié)的 ACK 確認(rèn)應(yīng)答后,如果發(fā)送窗口的大小沒有變化,則滑動(dòng)窗口往右邊移動(dòng) 5 個(gè)字節(jié),因?yàn)橛?5 個(gè)字節(jié)的數(shù)據(jù)被應(yīng)答確認(rèn),接下來(lái)52~56字節(jié)又變成了可用窗口,那么后續(xù)也就可以發(fā)送52~56這 5 個(gè)字節(jié)的數(shù)據(jù)了。

圖片圖片

程序是如何精準(zhǔn)的控制發(fā)送方的窗口數(shù)據(jù)呢?

TCP 滑動(dòng)窗口方案使用三個(gè)指針來(lái)跟蹤在四個(gè)傳輸類別中的每一個(gè)類別中的字節(jié)。其中兩個(gè)指針是絕對(duì)指針(指特定的序列號(hào)),一個(gè)是相對(duì)指針(需要做偏移)。

圖片圖片

含義解釋:

  • SND.WND:表示發(fā)送窗口的大小(大小是由接收方指定的)
  • SND.UNA:是一個(gè)絕對(duì)指針,它指向的是已發(fā)送但未收到確認(rèn)的第一個(gè)字節(jié)的序列號(hào),也就是#2的第一個(gè)字節(jié)
  • SND.NXT:也是一個(gè)絕對(duì)指針,它指向未發(fā)送但可發(fā)送范圍的第一個(gè)字節(jié)的序列號(hào),也就是#3的第一個(gè)字節(jié)
  • 可用窗口大小:是一個(gè)相對(duì)指針,通過SND.WND - (SND.NXT - SND.UNA)公式計(jì)算得來(lái)

4.2、接受方的滑動(dòng)窗口

接下來(lái)我們看看接收方的滑動(dòng)窗口,接收窗口相對(duì)簡(jiǎn)單一些,根據(jù)處理的情況劃分成三個(gè)部分。

圖片圖片

含義解釋:

  • #1和#2表示已成功接收并確認(rèn)的數(shù)據(jù),等待應(yīng)用進(jìn)程讀取
  • #3表示未收到數(shù)據(jù)但可以接收的數(shù)據(jù)
  • #4表示未收到數(shù)據(jù)并不可以接收的數(shù)據(jù)

其中三個(gè)接收部分,使用兩個(gè)指針進(jìn)行劃分:

  • RCV.WND:表示接收窗口的大小,它會(huì)通告給發(fā)送方
  • RCV.NXT:是一個(gè)絕對(duì)指針,它指向期望從發(fā)送方發(fā)送來(lái)的下一個(gè)數(shù)據(jù)字節(jié)的序列號(hào),也就是#3的第一個(gè)字節(jié)
  • 可接受數(shù)據(jù)的最大值位置:它可以通過RCV.NXT + RCV.WND計(jì)算得出,也就是#4的第一個(gè)字節(jié)

五、小結(jié)

相比傳統(tǒng)的發(fā)送一個(gè)包,然后等待確認(rèn)應(yīng)答再發(fā)送包的數(shù)據(jù)傳輸模型,滑動(dòng)窗口這種一次性批量發(fā)包然后等待確認(rèn)應(yīng)答的傳輸方式,可以顯著的提升數(shù)據(jù)傳輸效率,整個(gè)傳輸過程可以用如下圖來(lái)描述。

圖片圖片

上圖中的 ACK 600 確認(rèn)應(yīng)答報(bào)文丟失,也不會(huì)影響數(shù)據(jù)傳輸,因?yàn)榭梢酝ㄟ^下一個(gè)確認(rèn)應(yīng)答進(jìn)行確認(rèn),只要發(fā)送方收到了 ACK 700 確認(rèn)應(yīng)答,就表示 700 之前的所有數(shù)據(jù)接收方都收到了,這種確認(rèn)應(yīng)答模式叫累計(jì)確認(rèn)或者累計(jì)應(yīng)答。

在上文中,我們提到滑動(dòng)窗口有一個(gè)很關(guān)鍵字的參數(shù),就是窗口大小。

通常,窗口的大小是由接收方來(lái)決定的,接收端告訴發(fā)送端自己還有多少緩沖區(qū)可以接收數(shù)據(jù),防止發(fā)送的數(shù)據(jù)量過大接受方處理不過來(lái),會(huì)觸發(fā)發(fā)送方重發(fā)機(jī)制,從而導(dǎo)致網(wǎng)絡(luò)流量的無(wú)端的浪費(fèi)。

通過控制窗口大小,可以避免發(fā)送方的數(shù)據(jù)超過接收方的可用窗口,也就是大家常說的流量控制。

除此之外,計(jì)算機(jī)網(wǎng)絡(luò)都處在一個(gè)共享的環(huán)境,難免會(huì)出現(xiàn)網(wǎng)絡(luò)擁堵的現(xiàn)象。當(dāng)網(wǎng)絡(luò)出現(xiàn)擁堵時(shí),流量控制的手段非常有限。

如果網(wǎng)絡(luò)出現(xiàn)擁堵時(shí),發(fā)送方繼續(xù)發(fā)送大量數(shù)據(jù)包,可能會(huì)導(dǎo)致數(shù)據(jù)包時(shí)延、丟失等,這時(shí) TCP 就會(huì)重傳數(shù)據(jù),重傳就會(huì)導(dǎo)致網(wǎng)絡(luò)的負(fù)擔(dān)更重,于是會(huì)導(dǎo)致更大的延遲以及更多的丟包,此時(shí)可能會(huì)進(jìn)入惡性循環(huán)….

因此,TCP 不能忽略網(wǎng)絡(luò)上發(fā)生的事,當(dāng)網(wǎng)絡(luò)發(fā)生擁塞時(shí),TCP 需要降低發(fā)送的數(shù)據(jù)量,避免發(fā)送方的數(shù)據(jù)填滿整個(gè)網(wǎng)絡(luò),我們把這一行為稱為擁塞控制。

關(guān)于流量控制和擁塞控制的實(shí)現(xiàn),鑒于文章篇幅過長(zhǎng),我們會(huì)在下篇文章中進(jìn)行詳解。

本文整理了一些優(yōu)秀網(wǎng)友分享的知識(shí),在此特別感謝作者小林coding的圖解 tcp 滑動(dòng)窗口文章分享,給予了很大的知識(shí)幫助,同時(shí)結(jié)合自己的理解比較全面的探討了 TCP 滑動(dòng)窗口的原理,希望對(duì)大家有所幫助。

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2023-11-10 16:28:02

TCP窗口

2023-02-28 09:07:18

ChatGPTAI

2021-07-05 07:51:43

JVM底層Python

2021-07-12 09:45:36

NameServer 核心Conusmer

2021-01-12 14:46:34

Kubernetes開發(fā)存儲(chǔ)

2019-12-06 10:59:20

JavaScript運(yùn)行引擎

2015-01-15 09:21:24

TCP窗口

2013-11-18 10:04:31

TCP 滑動(dòng)窗口

2020-05-21 13:25:43

Spring組件架構(gòu)

2021-12-01 18:36:35

屬性

2024-06-27 08:26:10

LooperAndroid內(nèi)存

2015-07-01 13:34:22

Kubernetes應(yīng)用部署模型

2010-07-06 10:07:10

jQueryJSON

2021-06-16 15:18:03

鴻蒙HarmonyOS應(yīng)用

2015-08-19 10:36:24

Zigbee技術(shù)無(wú)線通信

2023-11-16 09:01:37

Hadoop數(shù)據(jù)庫(kù)

2015-08-18 09:40:32

OpenStack Neutron虛擬網(wǎng)絡(luò)

2018-07-05 14:25:01

TCP握手原理

2024-10-12 10:29:11

計(jì)算機(jī)圖形

2024-08-27 12:32:32

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美日韩国产成人| 在线不卡一区二区| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 亚洲欧洲av一区二区| 亚洲无吗一区二区三区| 影音先锋中文在线视频| 成人av资源站| 国产精品成人一区| 九九热精彩视频| 猛男gaygay欧美视频| 欧美日韩国产美| 欧美综合在线播放| 1pondo在线播放免费| 大胆亚洲人体视频| 国产ts人妖一区二区三区 | 四虎国产精品免费观看| 精品日韩一区二区| 又色又爽又高潮免费视频国产| 黄色精品在线观看| 国产亚洲一本大道中文在线| 99精品在线直播| 中文字幕+乱码+中文乱码www| 欧美日韩三区| 俺去了亚洲欧美日韩| 亚洲专区区免费| 亚洲视频国产精品| 欧美视频一区在线观看| 欧美精品自拍视频| 在线观看免费视频你懂的| 国产拍欧美日韩视频二区| 好看的日韩精品视频在线| 国产精品系列视频| 日本不卡免费在线视频| 国产91av在线| 亚洲免费激情视频| 国内精品久久久久久久影视蜜臀| 主播福利视频一区| 日韩一级av毛片| 国产精品一区二区中文字幕| 91精品国产91热久久久做人人 | 日本三级网站在线观看| 亚洲综合色站| 久久久国产精品视频| 国产一区二区三区四区在线| 国产探花一区二区| 日韩精品在线播放| 精品夜夜澡人妻无码av| 久久综合五月婷婷| 欧美精品一区二区三区在线| 性鲍视频在线观看| 国产精品久久久久久久久久辛辛 | 三级av在线| 不卡的av电影在线观看| 国产精品污www一区二区三区| 99视频国产精品免费观看a| 麻豆精品久久久| 国产精品香蕉在线观看| 国产成人自拍偷拍| 免费在线看成人av| 国产精品网址在线| 国产精品久久久久久免费免熟| 久久成人免费日本黄色| 国产欧美日韩视频| 国产女主播福利| 国产成人超碰人人澡人人澡| 国产伦精品一区二区三区免费视频 | 成人免费一区二区三区牛牛| 亚洲国产精品一区二区www| 国产一线二线三线女| 国产伦久视频在线观看| 狠狠躁18三区二区一区| 激情五月婷婷久久| 亚洲人成网站在线在线观看| 日韩亚洲电影在线| 国产美女视频免费观看下载软件| 色先锋久久影院av| 中文字幕欧美日韩精品| 日本爱爱小视频| 亚洲黄色大片| 国产精品成人av在线| 一级特黄特色的免费大片视频| 国产一区二区视频在线| 国产精品久久久久免费| 久热av在线| 亚洲欧美一区二区在线观看| 韩日视频在线观看| 一区在线影院| 日韩欧美国产麻豆| 色婷婷在线影院| 91精品国偷自产在线电影 | 日韩电影大片中文字幕| 少妇无套高潮一二三区| 亚洲精品国产成人影院| 97视频网站入口| 一级做a爱片久久毛片| 成人黄页毛片网站| 一级做a爰片久久| 国内高清免费在线视频| 欧美影视一区在线| 女同性αv亚洲女同志| 免费av一区二区三区四区| y97精品国产97久久久久久| 久久高清免费视频| 美女在线视频一区| 国内成+人亚洲| 久做在线视频免费观看| 欧美性猛交xxxxx水多| 色噜噜狠狠一区二区三区狼国成人| av动漫精品一区二区| 这里只有精品在线播放| 国产无遮挡裸体免费视频| 美女脱光内衣内裤视频久久影院| 国产伦精品一区二区三区视频孕妇| 蜜桃成人在线视频| 亚洲狠狠爱一区二区三区| 天天操天天爱天天爽| 精品国内亚洲2022精品成人| 日韩视频免费看| 五月天婷婷久久| 国产精品一级黄| 性欧美videosex高清少妇| а√天堂中文资源在线bt| 日韩一级片网站| 欧美一区二区三区粗大| 国产精品综合色区在线观看| 99精品国产一区二区| 巨大荫蒂视频欧美另类大| 在线亚洲一区观看| 99久久人妻无码中文字幕系列| 在线成人激情| 成人午夜在线影院| 在线观看麻豆| 欧洲亚洲精品在线| 一区二区黄色片| 国产精品最新自拍| 精品蜜桃一区二区三区| 成年网站在线视频网站| 欧美一区二区三区免费观看视频| 成人小视频免费看| 玖玖在线精品| 日韩精品欧美一区二区三区| 日韩电影av| 精品亚洲精品福利线在观看| 97免费在线观看视频| 成人综合在线网站| 国产免费一区二区视频| 亚洲精品午夜| 色综合久久悠悠| 精品久久久免费视频| 亚洲男人电影天堂| 91插插插影院| 欧美大片专区| 成人一区二区在线| 四虎av在线| 精品久久久久久久一区二区蜜臀| 激情五月婷婷在线| 国产精品99久久久久久有的能看| 国产精品12p| 精品一区二区三区在线观看视频| 精品国偷自产在线视频| 国产特黄一级片| 一区二区免费看| 艳妇乳肉亭妇荡乳av| 亚洲一区二区网站| 日韩高清av| 五月天色综合| 色综合视频一区中文字幕| 少妇一级淫片免费看| 欧美日韩国产一区二区三区| 国产免费看av| 麻豆精品一区二区综合av| 超碰免费在线公开| 91精品啪在线观看国产手机 | 国产无码精品一区二区| 99国产麻豆精品| 热久久精品免费视频| 成人情趣视频网站| 亚洲最大福利视频网| av电影免费在线看| 亚洲香蕉成人av网站在线观看| 一级片在线免费观看视频| 亚洲自拍偷拍图区| 精品无码在线视频| 青青草伊人久久| 亚洲v国产v| 91蜜桃臀久久一区二区| 日本aⅴ大伊香蕉精品视频| 日本三级在线播放完整版| 欧美精品一区二区久久婷婷| 最近免费中文字幕大全免费版视频| 亚洲国产高清不卡| 少妇伦子伦精品无吗| 老司机精品久久| 日韩一二区视频| 国产剧情一区| 国产精品二区三区四区| 日本不卡一二三| 欧美激情视频一区二区三区不卡| 九九九伊在人线综合| 日韩一区二区在线看| 三级视频在线观看| 亚洲男女一区二区三区| 男人操女人动态图| 高清国产一区二区| 五月婷婷丁香色| 99精品福利视频| 看一级黄色录像| 国产成人精品一区二区免费看京| 91亚洲精品一区二区| se01亚洲视频| 韩日欧美一区二区| 国产婷婷视频在线| 怡红院精品视频| 青春有你2免费观看完整版在线播放高清| 欧美私模裸体表演在线观看| 国产精品999在线观看| 亚洲欧美日韩中文播放| 亚洲午夜久久久久久久国产| 成熟亚洲日本毛茸茸凸凹| 欧美第一页浮力影院| 亚洲永久视频| 欧美不卡在线播放| 中国成人一区| 日本成人性视频| 欧美一站二站| 欧美日韩亚洲免费| 精品国内亚洲2022精品成人| 99久久99久久| 精品国产三区在线| 国产在线视频一区| 91tv亚洲精品香蕉国产一区| 日本人成精品视频在线| 草草视频在线| 97香蕉超级碰碰久久免费的优势| 色图在线观看| 欧美大片va欧美在线播放| 久操免费在线| 久久精品电影网| 老司机在线看片网av| 在线丨暗呦小u女国产精品| 久久天堂电影| 亚洲人精品午夜在线观看| 免费人成在线观看网站| 亚洲精品不卡在线| 日韩一区av| 亚洲欧洲第一视频| 二人午夜免费观看在线视频| 亚洲天堂2020| www黄在线观看| 中文字幕亚洲无线码a| 97人人在线| 久久久精品视频成人| 精产国品自在线www| 久热爱精品视频线路一| av毛片在线免费| 欧美高清视频一区二区| 超碰在线最新网址| 91精品国产色综合久久不卡98口 | 欧美丰满少妇人妻精品| 91视频com| 色噜噜日韩精品欧美一区二区| 2014亚洲片线观看视频免费| 国产sm调教视频| 国产精品久久二区二区| 日韩视频中文字幕在线观看| 亚洲精品免费在线观看| 懂色av懂色av粉嫩av| 亚洲一区在线观看免费观看电影高清 | 少妇久久久久久被弄高潮| 一区在线观看免费| 日韩在线中文字幕视频| 亚洲一卡二卡三卡四卡| 日本熟妇毛耸耸xxxxxx| 日韩欧美第一页| 中文字幕av在线免费观看| 91精品婷婷国产综合久久| 亚洲国产精品欧美久久| 亚洲精品按摩视频| 91在线品视觉盛宴免费| 久久99精品视频一区97| 成人线上视频| 91美女片黄在线观| 欧美18免费视频| 五月婷婷综合色| 午夜精品999| 国产精品99久久免费黑人人妻| 九九国产精品视频| 97人妻精品一区二区三区免费 | 精品一区二区日本| 日韩激情图片| 国产二区视频在线| 免费av成人在线| 国产xxxx视频| 中文字幕av免费专区久久| 国产一级中文字幕| 欧美三级日韩三级| 色婷婷av一区二区三区之e本道| 国产亚洲精品久久久久久777| 香蕉久久aⅴ一区二区三区| 日本道色综合久久影院| 激情久久免费视频| 热舞福利精品大尺度视频| 欧美日本亚洲韩国国产| 黄色片视频在线| 99久久免费视频.com| 亚洲色图综合区| 色欧美日韩亚洲| 人妻无码中文字幕| www.欧美三级电影.com| 亚洲国产福利| 国产精品一区二区三区精品| 99九九热只有国产精品| 美女av免费在线观看| 高清在线不卡av| 成人自拍小视频| 欧美亚洲动漫精品| 三级av在线播放| 国模极品一区二区三区| 国产日本亚洲| 这里只有精品66| 免费久久精品视频| 88久久精品无码一区二区毛片| 亚洲综合一二区| 99国产成人精品| 日韩有码在线播放| av免费在线一区| 欧美日韩在线播放一区二区| 亚洲国产黄色| 韩国三级在线看| 一区二区三区久久久| 国产精品视频一二区| www.色综合| 亚洲18在线| 一区二区国产日产| 久久国产生活片100| 中文天堂资源在线| 欧美天天综合网| 波多野结衣在线网站| 国产精国产精品| 欧美精品尤物在线观看| 女人另类性混交zo| 国产亚洲精品aa| 欧美成人精品网站| 一个色综合导航| 成人亚洲免费| 自拍偷拍亚洲色图欧美| 精品一区二区在线播放| 性生交大片免费全黄| 91超碰这里只有精品国产| 国产在线1区| 91丨九色丨国产| 激情久久婷婷| 91精品国产自产| 色婷婷香蕉在线一区二区| 岛国视频免费在线观看| 国产精品入口免费视频一| 日本一区二区在线看| 九九精品久久久| 亚洲欧美视频一区| 丰满人妻一区二区三区四区53| 久久青草精品视频免费观看| 日韩a级大片| 国产日韩成人内射视频| 国产精品污网站| 国产模特av私拍大尺度| 久久久久国产一区二区三区| 精品三级av在线导航| 情侣黄网站免费看| 国产精品乱人伦中文| 精品人妻一区二区三区三区四区| 欧美激情精品久久久久久免费印度| 国产亚洲成av人片在线观黄桃| 国产成人无码精品久久久性色| 久久久久久久电影| 夜夜爽8888| 久久久久久久久久久人体| 台湾色综合娱乐中文网| 亚洲精品综合在线观看| 亚洲一区二区影院| 国内在线免费高清视频| 91日本视频在线| 国产日韩高清一区二区三区在线| 在线视频第一页| 日韩欧美一级二级| 在线黄色的网站| 日韩最新中文字幕| 9人人澡人人爽人人精品| 亚洲天天综合网| 国内精品久久久久久中文字幕| 国产欧美一区二区精品久久久| 日本黄色的视频| 精品久久久视频| 久久五月精品| 欧美日韩一区二区视频在线| 国产又黄又大久久| 久久99国产综合精品免费| 久久激情视频免费观看| 色婷婷精品视频| 亚洲妇女无套内射精| 欧美性欧美巨大黑白大战|