TCP數據流

1. 引言

若是按照分組數量計算,約有一半的TCP報文段包含成塊數據(如FTP、電子郵件等),另外一半則包含交互數據(如telnet和rlogin)。
若是按照字節計算,則成塊數據與交互數據的比例約爲90%和10%。這是由於成塊數據的報文段基本上都是滿長度(full-sized)的(一般爲512字節的用戶數據),而交互數據則小得多,研究代表telent和rlogin分組中一般約90%的用戶數據小於10字節。
所以TCP須要能處理交互數據和成塊數據,但使用的處理算法有所不一樣。算法

2. 交互數據流

2.1 經受時延ACK/數據捎帶ACK

一個Rlogin鏈接上鍵入一個交互命令時會產生4個報文段:
(1)來自客戶的交互按鍵
(2)來自服務器的按鍵確認
(3)來自服務器的按鍵回顯
(4)來自客戶的按鍵回顯確認
如圖:緩存

然而,咱們通常能夠將報文段(2)和(3)進行合併--按鍵確認與按鍵回顯一塊兒發送(經受時延的確認)
一般TCP在接收到數據時並不當即發送ACK;相反,它推遲發送,以便將ACK與須要沿該方向發送的數據一塊兒發送(有時稱這種現象爲數據捎帶ACK)
絕大多數實現採用的時延爲200ms,也就是說,TCP將以最大200ms的時延等待是否有數據一塊兒發送。服務器

2.2 Nagle算法

一個Rlogin鏈接上客戶通常每次發送一個字節到服務器,這就產生了一些41字節長的分組:20字節的IP首部、20字節的TCP首部和1字節的數據。在局域網上,這些小分組(tinygram)一般不會引發擁塞。
但在廣域網上,這些小分組則會增長擁塞出現的可能,一種簡單和好的方法就是採用Nagle算法。
Nagle算法要求一個TCP鏈接上最多隻能有一個未被確認的未完成的小分組,在該分組的確認到達以前不能發送其餘的小分組。相反,TCP收集這些少許的分組,並在確認到來時以一個分組的方式發出去。網絡

有時須要關閉Nagle算法:小消息(鼠標移動)必須無時延地發送,以便爲進行某種操做的交互用戶提供實時的反饋。Socket API用戶可使用TCP_NODELAY選項來關閉Nagle算法。性能

3. 成塊數據流

3.1 滑動窗口

如圖指針

將字節1~11進行標號,接收方通告的窗口稱爲提出的窗口(offered window),它覆蓋了從第4字節到第9字節的區域,代表接收法已經確認了包括第3字節在內的數據,且通告窗口大小爲6。blog

窗口大小與確認序號相對應的,發送方計算它的可用窗口,該窗口代表多少數據能夠當即被髮送。
當接收方確認數據後,這個滑動窗口向右移動。窗口邊沿的相對運動增長或減小了窗口的大小。有以下4種移動狀況:
(1)稱窗口左邊沿向右邊沿靠近爲窗口合攏,這種現象發生在數據被髮送和確認時
(2)當窗口右邊沿向右移動時將容許發送更多的數據,稱之爲窗口張開。這種現象發生在一段的接收進程讀取已經確認的數據並釋放了TCP的接收緩存時
(3)當右邊沿向左移動時,稱之爲窗口收縮。(不容許)
(4)窗口左邊沿向左移動。(不存在)進程

特別說明:
(1)發送方沒必要發送一個全窗口大小的數據。
(2)來自接收方的一個報文段確認數據並把窗口向右邊滑動。這是由於窗口的大小是相對於確認序號的。
(3)窗口大小能夠減少,可是窗口的右邊沿卻不可以向左移動,若是左邊沿到達右邊沿,則稱爲一個零窗口,此時發送方不可以發送任何數據。
(4)接收方在發送一個ACK前沒必要等待窗口被填滿。路由

3.2 窗口大小

由接收方提供的窗口的大小一般能夠由接收進程控制,這將影響TCP的性能。
Socket API容許進程設置發送和接收緩存的大小。接收緩存的大小是該鏈接上所可以通告的最大窗口大小。有一些應用程序通告修改Socket緩存大小來增長性能。io

3.3 PUSH標誌

發送方使用該標誌通告接收方將所收到的數據所有提交給接收進程。這裏的數據包括與PUSH一塊兒發送的數據以及接收方TCP已經爲接收進程收到的其餘數據。

3.4 慢啓動

若是發送方和接收方之間存在多個路由器和速率較慢的鏈路時,就有可能出現一些問題。一些中間路由器必須緩存分組,並有可能耗盡存儲器的空間。
TCP支持一種稱爲「慢啓動(Slow start)」算法。該算法經過觀察到新分組進入網絡的速率應該與另外一端返回確認的速率相同而進行工做。
慢啓動爲發送方的TCP增長了另外一個窗口:擁塞窗口(congestion window),記爲cwnd。當與另外一網絡主機創建TCP鏈接時,擁塞窗口被初始化爲1個報文段(即另外一端通告的報文段大小)。
每收到一個ACK,擁塞窗口就增長一個報文段(cwnd以字節爲單位,可是慢啓動的報文段大小爲單位進行增長),發送方取擁塞窗口與通告窗口中的最小值最爲發送上限。
擁塞窗口是發送方使用的流量控制,而通告窗口則是接收方使用的流量控制。
發送方開始時發送一個報文段,而後等待ACK。當收到該ACK時,擁塞窗口從1增長爲2,便可以發送兩個報文段。當收到這兩個報文段的ACK時,擁塞窗口就增長爲4。這是一種指數增長的關係。
當某些點上達到了互聯網的容量,因而中間路由器開始丟棄分組。這就通告發送方它的擁塞窗口開的過大。

3.5 緊急方式

TCP提供了「緊急方式」(urgent mode),它使一段能夠告訴另外一端有些具備某種方式的「緊急數據」已經放置在普通的數據流中。另外一端被通告這個緊急數據已被放置在普通數據流中,由接收方決定如何處理。能夠經過TCP首部中的兩個字段來發出這種從一端到另外一端的緊急數據已經被放置在數據流中的通告。URG比特被置爲1,而且一個16位的緊急指針被置爲一個正的偏移量,該偏移量必須與TCP首部中的序號字段相加,以便得出緊急數據的最後一個字節的序號。

相關文章
相關標籤/搜索