全部課程
發(fā)布時(shí)間: 2018-10-10 14:43:48
概念
滑動(dòng)窗口是兩臺(tái)主機(jī)間傳送數(shù)據(jù)時(shí)的緩沖區(qū)。每臺(tái)TCP /IP 主機(jī)支持兩個(gè)滑動(dòng)窗口,
一個(gè)用于接收數(shù)據(jù), 另一個(gè)用于發(fā)送數(shù)據(jù)。窗口尺寸表示計(jì)算機(jī)可能緩沖的數(shù)據(jù)量大小。
工作原理
1. 滑動(dòng)窗口工作過(guò)程
TCP 協(xié)議通過(guò)采用滑動(dòng)窗口的方式控制數(shù)據(jù)流的傳輸。在傳輸層中, 數(shù)據(jù)按照一定的
格式打成大小相同的包。每一個(gè)滑動(dòng)窗口中包含一定數(shù)目的數(shù)據(jù)包, 滑動(dòng)窗口的大小可以
進(jìn)行調(diào)整。每臺(tái)網(wǎng)絡(luò)上的主機(jī)維護(hù)一個(gè)發(fā)送窗口和一個(gè)接收窗口。發(fā)送方一次可發(fā)送相當(dāng)于滑動(dòng)窗口大小的數(shù)據(jù)包數(shù)目, 并在每個(gè)數(shù)據(jù)包前添加包頭信息, 然后等待接收方返回確認(rèn)信息。由于TCP 是面向連接的協(xié)議, 可以保證數(shù)據(jù)傳輸?shù)耐暾院蜏?zhǔn)確性, 當(dāng)傳輸過(guò)程中發(fā)生丟包時(shí), 接收方會(huì)要求發(fā)送方從斷點(diǎn)處重傳數(shù)據(jù)。
當(dāng)TCP 從應(yīng)用層中接收到數(shù)據(jù)時(shí), TCP 將一個(gè)帶序列號(hào)的報(bào)頭加入數(shù)據(jù)包并將其交給
IP, 由IP 將它發(fā)送到目標(biāo)主機(jī)。
當(dāng)每一個(gè)數(shù)據(jù)包傳送時(shí), 源主機(jī)設(shè)置重發(fā)計(jì)時(shí)器, 描述在重新發(fā)送數(shù)據(jù)包前將等待
ACK 的時(shí)間。在一般情況下, 當(dāng)?shù)谝淮伟l(fā)送失敗后, 重發(fā)計(jì)時(shí)器的重試時(shí)間將設(shè)置為前一
次的兩倍。在發(fā)送窗口中有每一個(gè)數(shù)據(jù)包的備份, 直到收到ACK。
當(dāng)數(shù)據(jù)包到達(dá)目的主機(jī)接收窗口, 它們按照序列號(hào)放置。當(dāng)目的主機(jī)接收到連續(xù)的數(shù)
據(jù)段時(shí), 就向源主機(jī)發(fā)送一個(gè)關(guān)于數(shù)據(jù)的認(rèn)可( ACK) 的應(yīng)答報(bào)文, 其中帶有當(dāng)前窗口尺寸。一旦源主機(jī)接收到數(shù)據(jù)包并認(rèn)可, 發(fā)送窗口將進(jìn)行滑動(dòng)。如果在重發(fā)計(jì)時(shí)器設(shè)定的時(shí)
間內(nèi), 源主機(jī)沒(méi)有接收到對(duì)現(xiàn)存數(shù)據(jù)的認(rèn)可, 數(shù)據(jù)將重新傳送。重發(fā)數(shù)據(jù)包將加重網(wǎng)絡(luò)和源主機(jī)的負(fù)擔(dān)。下面通過(guò)應(yīng)用實(shí)例來(lái)了解其作用吧。
滑動(dòng)窗口應(yīng)用實(shí)例
“ 三次握手”的例子描述了一個(gè)典型的TCP 傳輸過(guò)程。TCP 可使用稱為滑動(dòng)窗口的方法獲得更好的TCP 傳輸性能。在TCP“ 三次握手”的過(guò)程中, 兩臺(tái)主機(jī)交換傳輸窗口大小, 接收主機(jī)把它的接收窗口大小設(shè)置成和發(fā)送主機(jī)的傳輸窗口大小一致。窗口大小表明任何一次所能傳輸段的較大個(gè)數(shù)。窗口大小是通過(guò)TCP 協(xié)議的格式中“ 窗口”字段, 在傳輸給目標(biāo)主機(jī)的每一個(gè)報(bào)文中給出的。
發(fā)送主機(jī)通過(guò)創(chuàng)建一個(gè)發(fā)送窗口, 以設(shè)置它的較大傳輸規(guī)模。例如, 如果發(fā)送主機(jī)設(shè)置
發(fā)送窗口的大小是6, 如下圖1所示,
這意味著發(fā)送主機(jī)一次最多可連續(xù)發(fā)送6 個(gè)數(shù)據(jù)段, 此時(shí)必須得到目標(biāo)主機(jī)確認(rèn)后, 才能繼續(xù)發(fā)送后續(xù)的數(shù)據(jù)段。
圖1發(fā)送窗口為6 的數(shù)據(jù)段的傳送
( 1) 第一次連續(xù)發(fā)送6 個(gè)數(shù)據(jù)段后( 即1 至6 段) , 發(fā)送主機(jī)必須等待接收主機(jī)的確認(rèn)。
假如接收主機(jī)只收到段1, 2 和5, 則接收主機(jī)發(fā)回包含有序列號(hào)為3 的段進(jìn)行確認(rèn), 確認(rèn)的是1 和2 段。此時(shí), 發(fā)送主機(jī)的滑動(dòng)窗口向右滑過(guò)兩個(gè)確認(rèn)的段, 7 和8 段出現(xiàn)在滑動(dòng)窗口中。如圖2 所示。
圖2 發(fā)送窗口向右滑過(guò)兩個(gè)確認(rèn)的段
( 2 ) 發(fā)送主機(jī)又連續(xù)發(fā)送6 個(gè)數(shù)據(jù)段( 即3 至8 段) 。假定這6 段均被正確收到, 接收
主機(jī)發(fā)回包含有序列號(hào)為9 的段進(jìn)行確認(rèn), 即表示9 段前的數(shù)據(jù)段均已正確收到, 期待第9段的發(fā)送。此時(shí), 發(fā)送主機(jī)的滑動(dòng)窗口向右滑過(guò)6 個(gè)確認(rèn)的段, 9 至14 段出現(xiàn)在滑動(dòng)窗口中, 如圖3 所示。
圖3 發(fā)送窗口向右滑過(guò)6 個(gè)確認(rèn)的段
通過(guò)上例可以看出, 借助于滑動(dòng)窗口能夠提高TCP 數(shù)據(jù)的傳輸性能。因?yàn)門CP 無(wú)須對(duì)
每一數(shù)據(jù)段進(jìn)行確認(rèn), 只需要對(duì)發(fā)送一個(gè)窗口寬度的段確認(rèn)一次。
小結(jié)
滑動(dòng)窗口的大小對(duì)網(wǎng)絡(luò)性能有很大的影響。如果滑動(dòng)窗口過(guò)小, 則需要在網(wǎng)絡(luò)上頻繁
的傳輸確認(rèn)信息, 占用了大量的網(wǎng)絡(luò)帶寬; 如果滑動(dòng)窗口過(guò)大, 對(duì)于利用率較高、容易產(chǎn)生丟包現(xiàn)象的網(wǎng)絡(luò), 則需要多次發(fā)送重復(fù)的數(shù)據(jù), 這同樣耗費(fèi)了網(wǎng)絡(luò)帶寬。
決定滑動(dòng)窗口大小的因素, 包括網(wǎng)絡(luò)的帶寬、可靠性以及需要傳輸?shù)臄?shù)據(jù)量。
上一篇: {Docker}簡(jiǎn)介