轉(zhuǎn)帖|行業(yè)資訊|編輯:龔雪|2015-01-04 09:27:41.000|閱讀 656 次
概述:TCP是目前Internet上最為流行的傳輸控制協(xié)議,本文介紹了其工作原理。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
TCP是目前Internet上最為流行的傳輸控制協(xié)議,即便你是搞存儲(chǔ)的,我覺得多少也得知道點(diǎn)兒,因?yàn)樵贔ile-Level storage慢慢成為主角的今天,SMB、NFS、FTP等關(guān)鍵協(xié)議都依賴于TCP,就連block-level的iSCSI協(xié)議也是如此。窗口是TCP中一個(gè)極為重要的概念,它直接關(guān)系到TCP的一個(gè)關(guān)鍵功能-流量控制。今天我簡(jiǎn)單介紹下TCP發(fā)送窗口,從較為微觀的角度去理解TCP是如何限制發(fā)送端可發(fā)送的數(shù)據(jù)量的。
我們知道TCP header中有一個(gè)Window Size字段,它其實(shí)是指接收端的窗口,即接收窗口,用來告知發(fā)送端自己所能接收的數(shù)據(jù)量,從而達(dá)到一部分流控的目的。假設(shè)你現(xiàn)在有10MB的數(shù)據(jù)要通過TCP發(fā)送,或許你點(diǎn)個(gè)按鈕就開始發(fā)送了,然后就認(rèn)為TCP僅僅是簡(jiǎn)單的把數(shù)據(jù)從一端挪到另一端(宏觀上的確如此)。其實(shí)TCP在整個(gè)發(fā)送過程中,也在度量當(dāng)前的網(wǎng)絡(luò)狀態(tài),目的是為了維持一個(gè)健康穩(wěn)定的發(fā)送過程。因此,這10MB數(shù)據(jù)是在某些機(jī)制的控制下進(jìn)行傳輸?shù)模渲幸环N重要機(jī)制就是窗口機(jī)制。發(fā)送端的發(fā)送窗口是基于接收端的接收窗口來計(jì)算的,我們可以把這10MB數(shù)據(jù)分為如下四類來看(見圖):
已發(fā)送且已應(yīng)答(Sent/Acked)
Sent/Acked數(shù)據(jù)的第一個(gè)字節(jié)是ISN+1,ISN是指在TCP建立連接時(shí)由SYN分段所選擇的第一個(gè)編號(hào)。SYN Flag被當(dāng)作是一個(gè)字節(jié)的數(shù)據(jù),特地會(huì)被應(yīng)答一次。因此,TCP連接上發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)編號(hào)就是ISN+1,被應(yīng)答的數(shù)據(jù)的最后一個(gè)字節(jié)編號(hào)為【ACK編號(hào)-1】。例如,A發(fā)送1000個(gè)字節(jié)給B,假設(shè)ISN=1,則所要發(fā)送數(shù)據(jù)的第一個(gè)字節(jié)的編號(hào)為2,全部發(fā)送到B之后,B會(huì)應(yīng)答1002,意思是說前1001(包括ISN)個(gè)字節(jié)我都收到了,請(qǐng)給我第1002個(gè)字節(jié)。所以,被應(yīng)答的數(shù)據(jù)的最后一個(gè)字節(jié)的編號(hào)為1001。
已發(fā)送但尚未應(yīng)答(Send/UnAcked)
Send/UnAcked數(shù)據(jù)的狀態(tài)可能是正在傳輸?shù)倪^程中,或是被網(wǎng)絡(luò)丟棄了,或是已到達(dá)接收端但應(yīng)答尚未被發(fā)送(因?yàn)镈elayed-Ack),又或是應(yīng)答正在傳輸過程中。為了區(qū)分Sent/UnAcked數(shù)據(jù)和Unsent/Inside數(shù)據(jù),TCP維護(hù)一個(gè)叫做SND.NEXT的變量,它是下一個(gè)即將被發(fā)送的字節(jié)的編號(hào)。所以SND.NEXT的值將是下一個(gè)即將被發(fā)送的TCP分段的Sequence Number字段的值。Send/UnAcked數(shù)據(jù)的第一個(gè)字節(jié)是接收端上一次接受的應(yīng)答分段的Acknowledge Number字段的值。
未發(fā)送,但位于當(dāng)前發(fā)送窗口之內(nèi)(Unsent/Inside)
Unsent/Inside數(shù)據(jù)是接收端允許發(fā)送端發(fā)送的數(shù)據(jù),發(fā)送端可以發(fā)送窗口內(nèi)的所有數(shù)據(jù),無需等待應(yīng)答以及窗口更新。換句話說,如果發(fā)送端停止發(fā)送并等待應(yīng)答,那就說明已經(jīng)沒有Unsent/Inside的數(shù)據(jù)了。然而,如果遇到擁塞,發(fā)送端的流控機(jī)制,即slow start和congestion avoidance會(huì)阻止發(fā)送端發(fā)送所有位于接收窗口內(nèi)的數(shù)據(jù)。在這種情況下,這些機(jī)制會(huì)主宰等待應(yīng)答之前的可發(fā)送數(shù)據(jù)量。
未發(fā)送,但位于當(dāng)前發(fā)送窗口之外(Unsent/Outside)
Unsent/Outside數(shù)據(jù)是位于當(dāng)前發(fā)送窗口意外的數(shù)據(jù),代表將來要發(fā)送的數(shù)據(jù),但根據(jù)目前的接收窗口它們是不允許被發(fā)送的。接收端會(huì)丟棄無法保存在接收緩存區(qū)中的數(shù)據(jù),并用當(dāng)前的應(yīng)答編號(hào)來應(yīng)答發(fā)送端。
發(fā)送窗口的移動(dòng)
發(fā)送窗口有一個(gè)左側(cè)邊緣和一個(gè)右邊邊緣。當(dāng)收到一個(gè)帶有更高Ack number的應(yīng)答時(shí),發(fā)送窗口的左側(cè)邊緣就會(huì)向右移動(dòng)(close)。當(dāng)收到的應(yīng)答的Ack number+Window>之前的Ack number+Window時(shí),發(fā)送窗口的右側(cè)邊緣會(huì)向右移動(dòng)(open)。另外,發(fā)送窗口僅close但不open也是有可能的。比如發(fā)送端收到一個(gè)應(yīng)答,它的Ack number增加了,但是窗口變小了,最終Ack number+Window并沒有變化。這種情況發(fā)生在接收端收到了數(shù)據(jù),但還沒有把數(shù)據(jù)給應(yīng)用層,因此Ack number會(huì)增加,但是窗口大小會(huì)減少同樣多的值。
更多新體驗(yàn),歡迎試用TCP安全信息開發(fā)控件。另外還有5折限時(shí)搶購和免費(fèi)領(lǐng)iPhone 6、iPad air等好禮!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn