《TCP/IP詳解卷1:協議》第19章 TCP的交互數據流-讀書筆記


章節回顧:

《TCP/IP詳解卷1:協議》第1章 概述-讀書筆記

《TCP/IP詳解卷1:協議》第2章 鏈路層-讀書筆記

《TCP/IP詳解卷1:協議》第3章 IP:網際協議(1)-讀書筆記

《TCP/IP詳解卷1:協議》第3章 IP:網際協議(2)-讀書筆記

《TCP/IP詳解卷1:協議》第4章 ARP:地址解析協議-讀書筆記

《TCP/IP詳解卷1:協議》第5章 RARP:逆地址解析協議-讀書筆記

《TCP/IP詳解卷1:協議》第6章 ICMP:Internet控制報文協議-讀書筆記

《TCP/IP詳解卷1:協議》第11章 UDP:用戶數據報協議-讀書筆記

《TCP/IP詳解卷1:協議》第17、18章 TCP:傳輸控制協議(1)-讀書筆記

《TCP/IP詳解卷1:協議》第17、18章 TCP:傳輸控制協議(2)-讀書筆記

《TCP/IP詳解卷1:協議》第19章 TCP的交互數據流-讀書筆記


1、引言

有關TCP通信量的研究發現:按分組數量計算,約有一半的TCP報文段包含成塊數據(如FTP、電子郵件和Usenet新聞),另一半則包含交互數據(如Telnet和Rlogin)。按字節計算,成塊數據與交互數據的比例約為90%和10%。

成塊數據的報文段基本上都是滿長度的(通常為512字節的用戶數據),交互數據則小得多(Telnet和Rlogin分組中約90%左右的用戶數據小於10個字節)

TCP需要同時處理這兩類數據,但使用的處理算法不同。


2、交互式輸入

說明:本書是以遠程登錄Rlogin協議模擬交互輸入的,我沒有進行相關實驗,下面我會給出作者所做的實驗截圖。

如圖19-1所示,Rlogin協議需要遠程系統回顯客戶輸入的字符,每按一個字符就會產生一個分組,而不是每次一行作為一個分組。

一般可以將報文段2和3合並(圖中兩個紅框)

當我們鍵入5個字符date\n時的數據流,如圖19-2所示:

說明:

(1)第1行:客戶發送字符d到服務器;第2行:該字符的確認及回顯;第3行:回顯字符的確認。

(2)與字符a有關的是第4~6行,與字符t有關的是第7~9行,與字符e有關的是第10~12行。

(3)13~15行與上面稍有不同。客戶發送到服務器的是一個字符(換行符),而回顯的是兩個字符(圖中14行紅線處),這兩個字符為:回車和換行字符,作用是將光標移動到左邊並換到下一行。

(4)第16行:來自服務器date命令的輸出。這30個字節(圖中紅線處)由28個字符與最后的回車+換行組成。第17、18行:服務器發往客戶7個字符(第18行),它們是在服務器主機上的客戶提示符:svr4%。第19行:確認了這7個字符。


3、經受時延的確認

圖19-3表示了圖19-2中數據交換的時間。

通常TCP在接收到數據時並不立即發送ACK;它會推遲發送,以便將ACK與需要沿該方向發送的數據一起發送,有時稱這種現象為數據捎帶ACK

說明:絕大多數實現采用的時延為200ms,即TCP將以最大200ms的時延等待是否有數據一起發送。

下面我假設你會看這張圖中標記的時間差,會計算實際時間(累加)。說明如下

觀察bsdi接收到數據和發送ACK之間的時間差:123.5、65.6、109.0、132.2、42.0、140.3和195.8 ms,似乎是隨機的。觀察bsdi發送ACK的實際時間(從0開始計算)為:139.9、539.3、940.1、1339.9、1739.9、1940.1和2140.1 ms,這些時間差是200ms的整數倍。

注意:因為TCP使用了一個200ms的定時器,以相對於內核引導的200ms固定時間溢出。由於將要確認的數據是隨機到達的,TCP在內核的200ms定時器的下一次溢出時得到通知。


4、Nagle算法

Rlogin連接時,一般每次發送一個字節到服務器,這就產生了一些41字節長的分組:20字節的IP首部、20字節的TCP首部和1個字節的數據。

在局域網上,這些小分組(被稱為微小分組tinygram)通常不會引起麻煩,因為局域網一般不會出現擁塞。在廣域網上,這些小分組則會增加擁塞出現的可能。一種簡單有效的方法就是采用RFC 896建議的Nagle算法。

算法說明:

算法要求一個TCP連接上最多只能有一個未被確認的未完成的小分組,在該分組的確認到達之前不能發送其他的小分組。相反,TCP收集這些少量的分組,並在確認到來時以一個分組的方式發出去。

算法優點:

算法的優越之處在於它是自適應的:確認到達得越快,數據也就發送得越快。在希望減少微小分組數目的低速廣域網上,則會發送更少的分組。

從圖19-3中看到,在以太網上一個字節被發送、確認和回顯的平均往返時間約為16ms。為了產生比這個速度更快的數據,我們每秒鍵入的字符必須多於60個。說明在局域網環境下兩個主機之間發送數據時很少使用這個算法。

當往返時間(RTT)增加時,如通過一個廣域網,情況發生了變化。如圖19-4:

從左到右待發數據的長度是不同的,分別為:1、1、2、1、2、2、3、1和3個字節。這是因為客戶只有收到前一個數據的確認后才發送已經收集的數據。通過使用Nagle算法,為發送16個字節的數據客戶只需要使用9個報文段,而不再是16個

關閉Nagle算法

有時我們也需要關閉Nagle算法。例如,X窗口系統服務器,小消息(鼠標移動)必須無時延地發送,以便為進行某種操作的交互用戶提供實時的反饋。


5、窗口大小通告

觀察圖19-4,可以看到slip通告窗口大小為4096字節,vangogh通告其窗口大小為8192字節。但報文段5通告的窗口大小為4095個字節,意味着TCP緩沖區中仍然有一個字節等待應用程序(Rlogin客戶)讀取。

說明:

(1)通常服務器通告窗口大小為8192個字節,這是因為服務器在讀取並回顯接收到的數據之前,其TCP沒有數據發送。當服務器已經讀取了來自客戶的輸入后,來自服務器的數據將被發送。

(2)在ACK到來時,客戶的TCP總是有數據需要發送。這是因為它在等待ACK的過程中緩存接收到的字符。當客戶TCP發送緩存的數據時,Rlogin客戶沒有機會讀取來自服務器的數據,因此,客戶通告的窗口大小總是小於4096。


小結:

交互數據總是以小於最大報文段長度的分組發送。對於這些小的報文段,接收方使用經受時延的確認方法來判斷確認是否可被推遲發送,以便與回送數據一起發送。這樣通常會減少報文段的數目。在較慢的廣域網環境中,通常使用Nagle算法來減少這些小報文段的數目。這個算法限制發送者任何時候只能有一個發送的小報文段未被確認。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM