TCP成塊數據流

目前建立在TCP協議上的網絡協議特別多,有telnet,ssh,有ftp,有http等等。這些協議又可以根據數據吞吐量來大致分成兩大類:(1)交互數據類型,例如telnet,ssh,這種類型的協議在大多數情況下只是做小流量的數據交換,比如說按一下鍵盤,回顯一些文字等等。(2)數據成塊類型,例如ftp,這種類型的協議要求TCP能儘量的運載數據,把數據的吞吐量做到最大,並儘可能的提高效率。針對這兩種情況,TCP給出了兩種不同的策略來進行數據傳輸。

本章介紹TCP所使用的被稱爲窗口協議的另一種形式的流量控制方法。該協議允許發送方在停止並等待確認前可以連續發送多個分組。由於發送方不必每發一個分組就停下來等待確認,因此該協議可以加速數據的傳輸。

1.隔一個報文段確認策略

TCP處理一個接收的報文將產生一個經受時延的確定,此ACK並不立即返回,這時分兩種情況(隔一個報文或者定時器溢出):

(1)TCP處理下一個報文,然後返回一個ACK確定2個報文段(可以想象成捎帶ACK)。

(2)定時器溢出,返回ACK。如果溢出時,TCP接收緩衝區中還有數據沒有被應用層讀取完,那麼返回報文段的窗口值將爲初始窗口值減去緩衝區中的值。


2.滑動窗口協議

窗口移動:
(1)窗口左邊沿向右邊沿靠近爲窗口合攏
(2)窗口右邊沿向右邊移動爲窗口張開

(3)窗口右邊沿向左邊移動爲窗口收縮。RFC強烈建議不要使用這種方式

如果左邊沿到達右邊沿,則稱其爲一個0窗口,此時發送方不能夠發送任何數據。

來自接收方的一個報文段確認數據並把窗口向右邊滑動。這是因爲窗口的大小是相對於確認序號的。

窗口大小由進程控制,插口API允許進程設置發送和接收緩存的大小,接收緩存的大小是該連接上所能夠通告的最大窗口大小,發揮TCP傳輸性能。

TCP就是用這個窗口,慢慢的從數據的左邊移動到右邊,把處於窗口範圍內的數據發送出去(但不用發送所有,只是處於窗口內的數據可以發送。)。這就是窗口的意義。圖20-6解釋了這一點。窗口的大小是可以通過socket來制定的,4096並不是最理想的窗口大小,而16384則可以使吞吐量大大的增加。

滑動窗口是用來加速數據傳輸。TCP要保證“可靠”,就需要對一個數據包進行ack確認表示接收端收到(窗口張開)。有了滑動窗口,接收端就可以等收到許多包後只發一個ack包,確認之前已經收到過的多個數據包。有了滑動窗口,發送端在發送完一個數據包後不用等待它的ack,在滑動窗口大小內可以繼續發送其他數據包(窗口合攏)。

發送的數據TCP包都有一個序號。它是這麼計算的:最初發送SYN時,有一個初始序號,根據RFC的定義,各個操作系統的實現都是與系統時間相關的。之後,序號的值會不斷的增加,比如原來的序號是100,如果這個TCP包的數據有10個字節,那麼下次的TCP包序號會變成110。
滑動窗口用於加速傳輸,比如發了一個seq=100的包,理應收到這個包的確認ack=101後再繼續發下一個包,但有了滑動窗口,只要新包的seq與沒有得到確認的最小seq之差小於滑動窗口大小,就可以繼續發。

因爲窗口的左邊沿受另一端發送的確認序號的控制,因此不可能向左邊沿移動。如果接收到一個指示窗口左邊沿向左移動的ACK,則它被認爲是一個重複的ACK,並被丟棄。

下圖展示了發送窗口與接收窗口滑動:



下圖展示滑動窗口占滿,窗口不能向右滑動,暫時不能發送數據包。



3.PUSH標誌

發送方使用該標誌通知接收方將所收到的數據全部提交給接收進程。這裏的數據包括與PUSH一起傳送的數據以及接收方TCP已經爲接收進程收到的其它數據。

(1)發送方將發送緩衝區的數據立即發送給接收方。
(2)接收方將接收緩衝區的數據立即提交給接收進程。

如果待發送數據會清空發送緩衝區,該包將自動設置PUSH標誌。


4.慢啓動(擁塞窗口)

如果發送方和接收方之間存在多個路由器和速率較慢的鏈路時,一些中間的路由器必須緩存分組,並有可能耗盡存儲器的空間,這種連接方式會嚴重降低了TCP連接的吞吐量。

擁塞窗口(cwnd)原理:

1)發送方開始發送一個報文,然後等待ACK。

2)當收到該ACK時,擁塞窗口從1增加到2,即可以發送2個報文段。

2)發送方再發送2個報文段,然後等待ACK,當收到這兩個報文段的ACK時,擁塞窗口就增加爲4。這是一種指數增加的關係。

如此循環.....

在某些點上可能達到了互聯網的容量,於是中間路由器開始丟棄分組,這就通知發送方它的擁塞窗口開得過大。

慢啓動算法用於保證新分組進入網絡的速率與另一端返回確定的速率相等。
擁塞窗口是發送使用的流量控制,通告窗口是接收方使用的流量控制。


5.緊急方式

TCP提供了“緊急方式”,它使一端告訴另一端有些具有某種方式的“緊急數據”已經放置在普通的數據流中。另一端被通知這個緊急數據已被放置在普通數據流中,由接收方決定如何處理。

可以設置TCP首部中的兩個字段來發出這種從一端到另一端的緊急數據已經被放置在數據流中的通知。URG比特被置爲1,並且一個16bit的緊急指針放置爲一個正的偏移量,該偏移量必須與TCP首部中的序號字段相加,以便得出緊急數據的最後一個字節的序號。

緊急方式最常見的例子是Telnet和Rlogin,從服務器到客戶端使用緊急方式是因爲在這個方向上的數據流很可能要被客戶的TCP停止(即,客戶端通告了一個大小爲0的窗口)但是如果服務器進程進入緊急方式,儘管它不能夠發送任何數據,服務器TCP也會立即發送緊急指針和URG標誌。當客戶TCP接收到這個通知時就會通知客戶進程,於是客戶可以從服務器讀取其輸入、打開窗口並使數據流動。

發佈了10 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章