精品欧美一区二区三区在线观看 _久久久久国色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)

欧洲福利电影| 日本h片在线| 美日韩一级片在线观看| 久久夜色精品国产亚洲aⅴ| 日本55丰满熟妇厨房伦| 国产拍在线视频| 国产精品你懂的| 动漫美女被爆操久久久| 久久久久99精品成人片我成大片| 日韩一区电影| 精品美女一区二区| 欧美日韩怡红院| 怡红院在线观看| 久久久99精品免费观看| 亚洲一区二区三| 亚洲精品成人在线视频| 亚洲精品国产首次亮相| 日韩精品丝袜在线| 亚洲免费在线播放视频| 亚洲黄色免费av| 尤物视频一区二区| 日本在线观看一区二区三区| 性欧美一区二区三区| 美日韩精品视频| 欧美激情精品久久久久久蜜臀 | 国产成人精品123区免费视频| 亚洲另类中文字| 日日噜噜噜噜夜夜爽亚洲精品| 亚洲国产综合网| 久久99蜜桃精品| 日韩av电影免费观看高清| 久久久久久久蜜桃| 亚洲精品成人影院| 日韩中文字幕国产| 中文字幕在线观看免费高清| 成人涩涩网站| 欧美日韩aaaaa| 宅男噜噜噜66国产免费观看| sese综合| 黄色成人在线播放| 人妻激情另类乱人伦人妻| 免费网站看v片在线a| 欧美激情一区在线| 任我爽在线视频精品一| 亚欧洲精品视频| 国产91对白在线观看九色| 91精品久久久久久久| 婷婷激情五月综合| 久久一区亚洲| 国产91在线播放| 国产99久久久| 久久成人精品| 国产va免费精品高清在线| 日韩精品一区二区av| 国产在线日韩| 欧美极品第一页| 久久精品免费在线| 亚洲国内欧美| 97高清免费视频| 日韩欧美不卡视频| 久久激情网站| 国产精品高潮视频| 中文字幕欧美人妻精品一区蜜臀| 日本欧美在线观看| 国产精品一区二区性色av| 国产美女www爽爽爽| 日本午夜精品视频在线观看| 国产剧情久久久久久| 中文字幕激情视频| 久久91精品久久久久久秒播| 91在线视频九色| 亚洲av无码乱码国产麻豆| 粉嫩久久99精品久久久久久夜 | 午夜精品久久久久久久爽| 丁香婷婷综合网| 精品欧美一区二区精品久久| 免费成人av电影| 国产精品久久久久久久久久免费看| 夜夜爽99久久国产综合精品女不卡 | 91精品国产乱码久久久张津瑜| 亚洲精品麻豆| 国产ts一区二区| 国产精品爽爽久久| 日本黄色片免费观看| 四虎电影院在线观看| 97久久久久久| 日本黄色录像视频| 一个色综合网| 国语自产精品视频在线看一大j8 | 国产福利视频在线播放| 91p九色成人| 欧美一区二区三区喷汁尤物| 99久久久无码国产精品性波多 | 亚洲精品午夜国产va久久成人| 午夜在线视频观看日韩17c| 国产精品久久久久久婷婷天堂| 国产精品综合在线| av不卡在线观看| 亚洲图片都市激情| 国产精品xx| 欧美日韩亚州综合| 成人性生活免费看| 91偷拍一区二区三区精品| 欧美激情国产精品| 中文字幕乱码无码人妻系列蜜桃| 国产成人精品亚洲777人妖| 久久偷窥视频| 亚洲无线看天堂av| 日本韩国一区二区三区| 日本女人性视频| 免费黄色成人| 欧美高清视频一区二区| 艳妇乳肉豪妇荡乳av无码福利 | 天堂va在线| 在线视频一区二区免费| 白丝校花扒腿让我c| 日韩欧美伦理| 日本sm极度另类视频| 午夜欧美性电影| 无码精品在线观看| 亚洲欧美偷拍三级| 日本www.色| 欧美尿孔扩张虐视频| 久久夜色撩人精品| 中文字幕在线观看1| 91丨九色丨尤物| 欧美一二三不卡| 欧美爱爱视频| 一二美女精品欧洲| 日韩成人在线免费视频| h1515四虎成人| 激情成人中文字幕| 日韩av福利在线观看| 欧美少妇xxxx| 麻豆一区二区三区| 蜜桃999成人看片在线观看| 色爱综合区网| 这里只有精品视频在线观看| 久久丫精品忘忧草西安产品| 欧洲精品一区二区三区久久| 欧美aaaaaaa| 欧美男男青年gay1069videost| 精品国产一区av| 亚洲人做受高潮| 欧美激情偷拍自拍| 国产精品久久久久久av福利软件| 亚洲美女综合网| 一区二区不卡在线观看| 日本人妖在线| 亚洲成a人在线观看| 日本少妇激三级做爰在线| 不卡在线一区二区| 国产精品极品尤物在线观看| 国产免费av在线| 欧美又粗又大又爽| 国产午夜精品久久久久久久久| 亚洲福利精品视频| 成人1区2区| 伊人久久男人天堂| 日韩精品一区不卡| 国产丝袜欧美中文另类| 黄色一级二级三级| 日韩国产欧美一区二区| 成人网在线观看| 国产不卡在线| 精品国产a毛片| 亚洲欧洲国产精品| 青娱乐91视频| 成人免费视频免费观看| 国产素人在线观看| 美女精品一区最新中文字幕一区二区三区| 69久久夜色精品国产69| 美女做暖暖视频免费在线观看全部网址91| 色伊人久久综合中文字幕| 高清国产在线观看| 国产一区二区伦理| 国产一区二区精品| 精品欧美一区二区三区久久久| av资源在线| 日韩激情片免费| 久久久久久久久久久影院| 国产午夜一区二区三区| 四虎成人在线播放| 国产精品老牛| 亚洲制服中文| 亚洲伊人久久大香线蕉av| 亚洲国产成人在线观看| 午夜私人影院久久久久| 黄色片网站免费| 国产麻豆午夜三级精品| 国产深夜男女无套内射| 久久美女精品| 久久国产主播精品| 亚洲精品一区二区在线播放∴| 久久久久亚洲精品| 国产精品免费在线免费| 特黄aaaaaaaaa真人毛片| 色一区在线观看| 五月天丁香激情| 久久久久久久久久久久久夜| 国产精品久久久久久久99| 99国产精品99久久久久久粉嫩| 亚洲国产精品综合| 国语一区二区三区| 91精品国产综合久久男男| 亚洲精品mv| 黑人精品一区二区三区| 日韩欧美主播在线| 国产精品久久久精品四季影院| 91农村精品一区二区在线| 国产福利精品一区二区三区| 国产欧美另类| 色一情一乱一乱一区91| 国产一卡不卡| 国模精品一区二区三区| 精品视频一区二区三区| 久久国际精品| 欧美日韩福利电影| av女优在线| 日韩电影中文 亚洲精品乱码 | 永久免费未满蜜桃| 紧缚捆绑精品一区二区| 国产aaaaa毛片| 国产一区91| 日本在线免费观看一区| 日本高清成人vr专区| 亚洲社区在线观看| 粉嫩小泬无遮挡久久久久久| 欧美日韩国产经典色站一区二区三区| 毛片毛片女人毛片毛片| 亚洲国产美女搞黄色| 玖玖爱这里只有精品| 久久久不卡网国产精品一区| 亚洲精品女人久久久| 粉嫩av亚洲一区二区图片| 一级日本黄色片| 激情综合一区二区三区| www.com操| 蜜臀av一区二区| 色免费在线视频| 日本免费在线视频不卡一不卡二 | 久久成人精品| 无码人妻h动漫| 丝袜亚洲另类欧美| 狠狠操精品视频| 日韩成人精品在线观看| 超碰影院在线观看| 日韩福利视频导航| 日本久久久久久久久久久久| 日韩精品乱码av一区二区| 欧洲熟妇精品视频| 男女男精品网站| 日韩成人精品视频在线观看| 极品少妇xxxx精品少妇| 91香蕉国产线在线观看| 国产成人免费xxxxxxxx| 久久性爱视频网站| 久久久精品黄色| 四季av中文字幕| 亚洲欧洲国产专区| 日本少妇高清视频| 亚洲成在线观看| 日韩精品一区二区av| 色婷婷国产精品| 国产精品乱码一区二区视频| 欧美日韩精品三区| 精品人妻一区二区三区日产乱码| 欧美sm美女调教| 欧美色视频免费| 中文字幕av一区中文字幕天堂| 精品视频在线一区二区| 久久久久久尹人网香蕉| 最新欧美色图| 92看片淫黄大片看国产片| 91精品国产自产精品男人的天堂| 免费国产在线精品一区二区三区| 欧美熟乱15p| 伊人再见免费在线观看高清版 | 国产精品普通话| 怡红院成人在线| 国产狼人综合免费视频| 日韩欧美久久| 久久国产欧美精品| 日本一区二区在线看| 男人草女人视频| 老鸭窝91久久精品色噜噜导演| 天天综合网日韩| 国产成人av网站| 男女做爰猛烈刺激| 香港三日本三级少妇66| 日韩视频国产视频| 五月天久久久久久| 日韩在线播放视频| 理论片午夜视频在线观看| 国产精品综合不卡av| av成人app永久免费| 日韩久久久久久久久久久久久| 欧美成人嫩草网站| 国产情侣av自拍| 国产不卡视频在线播放| 我想看黄色大片| 亚洲国产精品影院| 亚洲一线在线观看| 国产午夜精品麻豆| 成人黄色网址| 国产精品激情av电影在线观看| 成人午夜三级| 在线观看18视频网站| 日日夜夜免费精品| 久久久老熟女一区二区三区91| 国产精品久久久久久久裸模| 国产成人在线免费视频| 91精品国产91久久综合桃花| 国产小视频在线观看| 午夜精品一区二区三区av| 精品国产亚洲一区二区三区| 日韩国产精品一区二区| 99伊人成综合| 极品白嫩少妇无套内谢| 一色桃子久久精品亚洲| 丁香社区五月天| 国产午夜精品理论片a级探花| av毛片午夜不卡高**水| 亚洲综合社区网| 天天av综合| 色播五月激情五月| 国产清纯美女被跳蛋高潮一区二区久久w | 黄色av免费观看| 久久香蕉频线观| 四虎影视国产精品| 亚洲a∨一区二区三区| 久久一区欧美| 无码少妇精品一区二区免费动态| 日韩欧美国产一区二区| 手机在线观看毛片| 久久理论片午夜琪琪电影网| 99久久婷婷国产综合精品青牛牛 | 国产视频亚洲| 制服丝袜第一页在线观看| 亚洲高清免费视频| 蜜臀av午夜精品| 久久免费在线观看| 国产欧美啪啪| 日本国产在线播放| 91网站在线观看视频| 国产成人一级片| 亚洲免费人成在线视频观看| 日韩福利一区| 日本在线观看一区二区三区| 免费欧美在线视频| av在线免费播放网址| 91精品国产91热久久久做人人| av在线网址观看| 国产精品美女久久久久av福利| 国内精品久久久久久久97牛牛| 国产伦精品一区二区三区88av| 亚洲亚洲精品在线观看| 亚洲av毛片成人精品| 日本在线精品视频| 日韩在线理论| 超碰91在线播放| 亚洲成av人影院| 免费在线黄色影片| 国产欧美日韩精品在线观看| 久久久精品久久久久久96| 少妇熟女视频一区二区三区| 天天影视涩香欲综合网| 国产在线一在线二| 91精品久久久久| 亚洲激情社区| www.黄色在线| 欧美一级在线视频| 中文日产幕无线码一区二区| 亚洲精蜜桃久在线| 国产激情一区二区三区| av资源免费观看| 日韩中文字幕在线播放| 9l视频自拍蝌蚪9l视频成人| av网址在线观看免费| 亚洲欧洲成人自拍| 手机在线精品视频| 国产精品网红直播| 韩日成人在线| 成人做爰69片免网站| 欧美不卡一区二区三区| 欧美成人ⅴideosxxxxx| 三级在线免费观看| 久久久亚洲午夜电影| 国产哺乳奶水91在线播放| 欧美在线www| 欧美暴力喷水在线| 久久美女免费视频| 精品美女一区二区三区| 久久精品国产福利| 久久国产亚洲精品无码| 亚洲欧洲成人精品av97| 黄网站在线观看| 成人免费观看网站| 久久99国产精品麻豆| 丰满少妇xoxoxo视频|