自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

大師帶你了解TCP基本功之滑動(dòng)窗口

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
將TCP與UDP這樣的簡(jiǎn)單傳輸協(xié)議區(qū)分開(kāi)來(lái)的是它傳輸數(shù)據(jù)的質(zhì)量。TCP對(duì)于發(fā)送數(shù)據(jù)進(jìn)行跟蹤,這種數(shù)據(jù)管理需要協(xié)議有可靠性、數(shù)據(jù)流控兩大關(guān)鍵功能。

將TCP與UDP這樣的簡(jiǎn)單傳輸協(xié)議區(qū)分開(kāi)來(lái)的是它傳輸數(shù)據(jù)的質(zhì)量。TCP對(duì)于發(fā)送數(shù)據(jù)進(jìn)行跟蹤,這種數(shù)據(jù)管理需要協(xié)議有以下兩大關(guān)鍵功能:

可靠性:保證數(shù)據(jù)確實(shí)到達(dá)目的地。如果未到達(dá),能夠發(fā)現(xiàn)并重傳。

數(shù)據(jù)流控:管理數(shù)據(jù)的發(fā)送速率,以使接收設(shè)備不致于過(guò)載。

要完成這些任務(wù),整個(gè)協(xié)議操作是圍繞滑動(dòng)窗口確認(rèn)機(jī)制來(lái)進(jìn)行的。因此,理解了滑動(dòng)窗口,也就是理解了TCP。

TCP面向流的滑動(dòng)窗口確認(rèn)機(jī)制:

TCP將獨(dú)立的字節(jié)數(shù)據(jù)當(dāng)作流來(lái)處理。一次發(fā)送一個(gè)字節(jié)并接收一次確認(rèn)顯然是不可行的。即使重疊傳輸(即不等待確認(rèn)就發(fā)送下一個(gè)數(shù)據(jù)),速度也還是會(huì)非常緩慢。

 

[[126296]]

 

TCP消息確認(rèn)機(jī)制如上圖所示,首先,每一條消息都有一個(gè)識(shí)別編號(hào),每一條消息都能夠被獨(dú)立地確認(rèn),因此同一時(shí)刻可以發(fā)送多條信息。設(shè)備B定期發(fā)送給A一條發(fā)送限制參數(shù),制約設(shè)備A一次能發(fā)送的消息***數(shù)量。設(shè)備B可以對(duì)該參數(shù)進(jìn)行調(diào)整,以控制設(shè)備A的數(shù)據(jù)流。

為了提高速度,TCP并沒(méi)有按照字節(jié)單個(gè)發(fā)送而是將數(shù)據(jù)流劃分為片段。片段內(nèi)所有字節(jié)都是一起發(fā)送和接收的,因此也是一起確認(rèn)的。確認(rèn)機(jī)制沒(méi)有采用message ID字段,而是使用的片段內(nèi)***一個(gè)字節(jié)的sequence number。因此一次可以處理不同的字節(jié)數(shù),這一數(shù)量即為片段內(nèi)的sequence number。

TCP數(shù)據(jù)流的概念劃分類(lèi)別

假設(shè)A和B之間新建立了一條TCP連接。設(shè)備A需要傳送一長(zhǎng)串?dāng)?shù)據(jù)流,但設(shè)備B無(wú)法一次全部接收,所以它限制設(shè)備A每次發(fā)送分段指定數(shù)量的字節(jié)數(shù),直到分段中已發(fā)送的字節(jié)數(shù)得到確認(rèn)。之后,設(shè)備A可以繼續(xù)發(fā)送更多字節(jié)。每一個(gè)設(shè)備都對(duì)發(fā)送,接收及確認(rèn)數(shù)據(jù)進(jìn)行追蹤。

如果我們?cè)谌我粫r(shí)間點(diǎn)對(duì)于這一過(guò)程做一個(gè)“快照”,那么我們可以將TCP buffer中的數(shù)據(jù)分為以下四類(lèi),并把它們看作一個(gè)時(shí)間軸:

1. 已發(fā)送已確認(rèn) 數(shù)據(jù)流中最早的字節(jié)已經(jīng)發(fā)送并得到確認(rèn)。這些數(shù)據(jù)是站在發(fā)送設(shè)備的角度來(lái)看的。如下圖所示,31個(gè)字節(jié)已經(jīng)發(fā)送并確認(rèn)。

2. 已發(fā)送但尚未確認(rèn) 已發(fā)送但尚未得到確認(rèn)的字節(jié)。發(fā)送方在確認(rèn)之前,不認(rèn)為這些數(shù)據(jù)已經(jīng)被處理。下圖所示14字節(jié)為第2類(lèi)。

3. 未發(fā)送而接收方已Ready 設(shè)備尚未將數(shù)據(jù)發(fā)出,但接收方根據(jù)最近一次關(guān)于發(fā)送方一次要發(fā)送多少字節(jié)確認(rèn)自己有足夠空間。發(fā)送方會(huì)立即嘗試發(fā)送。如圖,第3類(lèi)有6字節(jié)。

4. 未發(fā)送而接收方Not Ready 由于接收方not ready,還不允許將這部分?jǐn)?shù)據(jù)發(fā)出。

 

[[126297]]

 

接收方采用類(lèi)似的機(jī)制來(lái)區(qū)分已接收并已確認(rèn),尚未接受但準(zhǔn)備好接收,以及尚未接收并尚未準(zhǔn)備好接收的數(shù)據(jù)。實(shí)際上,收發(fā)雙方各自維護(hù)一套獨(dú)立的變量,來(lái)監(jiān)控發(fā)送和接收的數(shù)據(jù)流落在哪一類(lèi)。

Sequence Number設(shè)定與同步:

發(fā)送方和接收方必須就它們將要為數(shù)據(jù)流中的字節(jié)指定的sequence number達(dá)成一致。這一過(guò)程稱(chēng)為同步,在TCP連接建立時(shí)完成。為了簡(jiǎn)化假設(shè)***個(gè)字節(jié)sequence number是1,按照上圖示例,四類(lèi)字節(jié)如下:

1. 已發(fā)送已確認(rèn)字節(jié)1至31。

2. 已發(fā)送但尚未確認(rèn)字節(jié)32至45。

3. 未發(fā)送而接收方已Ready字節(jié)46至51。

4. 未發(fā)送而接收方Not Ready字節(jié)52至95。#p#

發(fā)送窗口與可用窗口:

整個(gè)過(guò)程關(guān)鍵的操作在于接收方允許發(fā)送方一次能容納的未確認(rèn)的字節(jié)數(shù)。這稱(chēng)為發(fā)送窗口,有時(shí)也稱(chēng)為窗口。該窗口決定了發(fā)送方允許傳送的字節(jié)數(shù),也是2類(lèi)和3類(lèi)的字節(jié)數(shù)之和。因此,***兩類(lèi)(接收方準(zhǔn)備好而尚未發(fā)送,接收方未準(zhǔn)備好)的分界線在于添加了從***個(gè)未確認(rèn)字節(jié)開(kāi)始的窗口。本例中,***個(gè)未確認(rèn)字節(jié)是32,整個(gè)窗口大小是20。

可用窗口的定義是:考慮到正在傳輸?shù)臄?shù)據(jù)量,發(fā)送方仍被允許發(fā)送的數(shù)據(jù)量。實(shí)際上等于第3類(lèi)的大小。左邊界就是窗口中的***個(gè)字節(jié)(字節(jié)32),右邊界是窗口中***一個(gè)字節(jié)(字節(jié)51)。概念的詳細(xì)解釋看下圖。

 

[[126298]]

 

可用窗口字節(jié)發(fā)送后TCP類(lèi)目與窗口大小的改變:

當(dāng)上圖中第三類(lèi)的6字節(jié)立即發(fā)送之后,這6字節(jié)從第3類(lèi)轉(zhuǎn)移到第2類(lèi)。字節(jié)變?yōu)槿缦拢?/p>

1. 已發(fā)送已確認(rèn)字節(jié)1至31。

2. 已發(fā)送但尚未確認(rèn)字節(jié)32至51。

3. 未發(fā)送而接收方已Ready字節(jié)為0。

4. 未發(fā)送而接收方Not Ready字節(jié)52至95。

 

[[126299]]

 

確認(rèn)處理以及窗口縮放:

過(guò)了一段時(shí)間,目標(biāo)設(shè)備向發(fā)送方傳回確認(rèn)信息。目標(biāo)設(shè)備不會(huì)特別列出它已經(jīng)確認(rèn)的字節(jié),因?yàn)檫@會(huì)導(dǎo)致效率低下。目標(biāo)設(shè)備會(huì)發(fā)送自上一次成功接收后的最長(zhǎng)字節(jié)數(shù)。

例如,假設(shè)已發(fā)送未確認(rèn)字節(jié)(32至45)分為4段傳輸:32-34,35-36,37-41,42-45。第1,2,4已經(jīng)到達(dá),而3段沒(méi)有收到。接收方只會(huì)發(fā)回32-36的確認(rèn)信息。接收方會(huì)保留42-45但不會(huì)確認(rèn),因?yàn)檫@會(huì)表示接收方已經(jīng)收到了37-41。這是很必要的,因?yàn)門(mén)CP的確認(rèn)機(jī)制是累計(jì)的,只使用一個(gè)數(shù)字來(lái)確認(rèn)數(shù)據(jù)。這一數(shù)字是自上一次成功接收后的最長(zhǎng)字節(jié)數(shù)。假設(shè)目標(biāo)設(shè)備同樣將窗口設(shè)為20字節(jié)。

當(dāng)發(fā)送設(shè)備接收到確認(rèn)信息,則會(huì)將一部分第2類(lèi)字節(jié)轉(zhuǎn)移到第1類(lèi),因?yàn)樗鼈円呀?jīng)得到了確認(rèn)。由于5個(gè)字節(jié)已被確認(rèn),窗口大小沒(méi)有改變,允許發(fā)送方多發(fā)5個(gè)字節(jié)。結(jié)果,窗口向右滑動(dòng)5個(gè)字節(jié)。同時(shí)5個(gè)字節(jié)從第二類(lèi)移動(dòng)到第1類(lèi),5個(gè)字節(jié)從第4類(lèi)移動(dòng)至第3類(lèi),為接下來(lái)的傳輸創(chuàng)建了新的可用窗口。因此,在接收到確認(rèn)信息以后,看起來(lái)如下圖所示。字節(jié)變?yōu)槿缦拢?/p>

1. 已發(fā)送已確認(rèn)字節(jié)1至36。

2. 已發(fā)送但尚未確認(rèn)字節(jié)37至51。

3. 未發(fā)送而接收方已Ready字節(jié)為52至56。

4. 未發(fā)送而接收方Not Ready字節(jié)57至95。

 

[[126300]]

 

每一次確認(rèn)接收以后,這一過(guò)程都會(huì)發(fā)生,從而讓窗口滑動(dòng)過(guò)整個(gè)數(shù)據(jù)流以供傳輸。

處理丟失確認(rèn)信息:

但是丟失的42-45如何處理呢?在接收到第3段(37-41)之前,接收設(shè)備不會(huì)發(fā)送確認(rèn)信息,也不會(huì)發(fā)送這一段之后字節(jié)的確認(rèn)信息。發(fā)送設(shè)備可以將新的字節(jié)添加到第3類(lèi)之后,即52-56。發(fā)送設(shè)備之后會(huì)停止發(fā)送,窗口停留在37-41。

TCP包括一個(gè)傳輸及重傳的計(jì)時(shí)機(jī)制。TCP會(huì)重傳丟失的片段。但有一個(gè)缺陷是:因?yàn)樗粫?huì)對(duì)每一個(gè)片段分別進(jìn)行確認(rèn),這可能會(huì)導(dǎo)致其他實(shí)際上已經(jīng)接收到的片段被重傳(比如42至45)。

責(zé)任編輯:林琳 來(lái)源: EMC中文支持論壇
相關(guān)推薦

2014-11-20 14:39:12

網(wǎng)絡(luò)傳輸

2022-03-31 15:17:04

JavaSocketServlet容器

2024-11-01 08:34:18

Spring配置@Bean

2010-09-26 08:56:10

Oracle

2009-10-10 16:57:33

布線工藝要求

2011-07-22 16:43:37

java

2023-08-11 07:44:40

TCP滑動(dòng)窗口數(shù)據(jù)

2017-04-12 10:40:34

公有云

2023-08-26 20:56:02

滑動(dòng)窗口協(xié)議

2021-07-14 08:24:23

TCPIP 通信協(xié)議

2017-02-27 21:30:29

數(shù)據(jù)中心光纖電纜

2020-11-20 14:16:20

Python開(kāi)發(fā)表格

2020-10-21 09:18:50

程序員前端Github

2020-12-07 10:38:13

Python開(kāi)發(fā)語(yǔ)言

2011-11-28 09:26:57

2023-06-28 11:58:00

2014-03-27 15:34:55

Android組件Activity

2013-11-18 10:04:31

TCP 滑動(dòng)窗口

2020-11-06 09:05:18

前端web開(kāi)發(fā)

2018-11-27 15:55:21

TCP通訊協(xié)議
點(diǎn)贊
收藏

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