tcp窗口


現在開始介紹我們的第一個主題 - TCP 接收窗口。
TCP 連接的吞吐量可以通過發送和接收應用程序、發送和接收 TCP 的實現以及 TCP 對等方之間的傳輸路徑來限制。在本專欄中,我將介紹 TCP 接收窗口及其對 TCP 吞吐量的影響、TCP 窗口縮放的使用以及 Windows Vista™ 中的“接收窗口自動調節”新功能(可優化 TCP 接收數據吞吐量)。

 

TCP 接收窗口
TCP 連接具有許多重要的特點。首先,它們是兩個應用層協議之間的邏輯點對點通信。TCP 不提供一對多的傳遞服務,它僅提供一對一的傳遞服務。
其次,TCP 連接是面向連接的。在數據可以傳輸之前,兩個應用層過程必須通過 TCP 連接建立過程正式協商一個 TCP 連接。同樣,TCP 連接在通過 TCP 連接終止過程協商之后正式關閉。
再次,在 TCP 連接中發送的可靠數據按順序排列,且期望得到接收端的肯定確認。如果沒有接收到肯定確認,則重傳這個段。接收端一端會放棄重復的段,並按照正確順序排列到達時失序的段。
最后,TCP 連接是全雙工的。對於每個 TCP 對等方,TCP 連接都由兩個邏輯管道組成:一個傳出管道和一個傳入管道。TCP 報頭包含傳出數據的序列號和傳入數據的確認 (ACK)。
此外,TCP 將通過傳入和傳出邏輯管道發送的數據視為連續的字節流。每個 TCP 報頭中的序列號和確認號都根據字節邊界定義。TCP 並不會考慮字節流中的記錄或消息邊界。應用層協議必須正確地分析傳入的字節流。
為了限制任一時刻可發送的數據量,並為接收端提供流量控制,TCP 對等方使用窗口實現這些目的。該窗口是接收端允許發送端發送的字節流的數據范圍。發送端只能發送位於窗口內的字節流中的字節。該窗口隨着發送端的出站字節流和接收端的入站字節流而滑動。
對於給定的邏輯管道(全雙工 TCP 連接的一個方向),發送端維護一個發送窗口,接收端維護一個接收窗口。當傳輸中沒有數據或 ACK 段時,邏輯管道的發送和接收窗口相互匹配。換句話說,發送端允許發送的出站字節流中的數據范圍與接收端能夠接收的入站字節流中的數據范圍相匹配。 圖 1說明了這種發送和接收關系。
圖 1  匹配發送和接收窗口 (單擊該圖像獲得較大視圖)
為了表示接收窗口的大小,TCP 報頭包含了一個 16 位的“窗口”字段。當接收端收到數據時,它把 ACK 發送回發送端以表明成功接收到這些字節。在每個 ACK 中,“窗口”字段表示接收窗口中剩余的字節數。當應用程序發送、確認和檢索數據后,發送窗口和接收窗口都會滑動到右側。接收窗口是用於控制可從發送端傳送給接收端的未確認數據數量的窗口。
由於接收窗口中可能會有應用程序未檢索到的數據以及已接收但尚未確認的數據,因此 TCP 接收窗口具有一些其他的結構,如 圖 2 所示。
圖 2  TCP 接收窗口中的數據類型 (單擊該圖像獲得較大視圖)
請注意最大接收窗口和當前接收窗口的區別。最大接收窗口的大小是固定的。當前接收窗口的大小是可變的,並對應於接收端允許發送端發送的剩余數據量。當前接收窗口大小是發送回發送端的 ACK 中通告的“窗口”字段值,等於最大接收窗口大小與已接收和確認但尚未被應用程序檢索的數據量之間的差值。

 

TCP 接收窗口和 TCP 吞吐量
為了優化 TCP 吞吐量(假設為合理的無差錯傳輸路徑),發送端應該發送足夠的數據包以填滿發送端和接收端之間的邏輯管道。邏輯管道的容量可由以下公式計算:
 
Capacity in bits = path bandwidth in bits per second * round-trip time (RTT) in seconds
容量稱為帶寬延遲乘積 (BDP)。管道可以用粗(高帶寬)和細(低帶寬)或者長(高 RTT)和短(低 RTT)來表示。粗而長的管道的 BDP 最高。使用高 BDP 傳輸路徑的示例包括衛星鏈接或帶有洲際光纜鏈接的企業廣域網 (WAN)。
增強高 BDP 傳輸的發送端性能
新的“接收窗口自動調節”功能增強了通過高 BDP 鏈接接收數據的性能,但是發送端的性能如何呢?
避免發送 TCP 對等方擁塞整個網絡的現有算法被稱為“慢啟動”和“擁塞避免”。在連接最初發送數據和還原丟失段時,這些算法可以增大發送窗口,即發送端可以發送的段數量。
對於每個接收到的確認段(Windows XP 和 Windows Server 2003 中的 TCP)或每個已經確認的段(Windows Vista 和 Windows Server“Longhorn”中的 TCP),“慢啟動”算法會以一個完整的 TCP 段增大發送窗口。對於每個已經確認的完整窗口的數據,“擁塞避免”算法以一個完整的 TCP 段增大發送窗口。
這些算法很好地適應較小的 BDP 和較小的接收窗口大小。然而,當面對一個具有較大接收窗口大小和較大 BDP 的連接時,例如在位於高速 WAN 鏈接(往返時間為 100 毫秒)上的兩個服務器之間復制數據,利用這些算法增大發送窗口的速度就不足以充分利用連接帶寬。
為了在上述情形下更好地利用 TCP 連接的帶寬,下一代 TCP/IP 堆棧包括了復合 TCP (CTCP)。CTCP 可以更快地增大發送窗口,適用於擁有較大的接收窗口大小和 BDP 的連接。CTCP 試圖通過監控延遲變化和損失來使這類連接的吞吐量最大化。此外,CTCP 確保其行為不會對其他 TCP 連接產生負面影響。
在 Microsoft 內部執行的測試中,對於 RTT 為 50 毫秒、傳輸速率為每秒 1 Gb 的連接,大型文件的備份時間幾乎縮短了一半。對於具有更大 BDP 的連接,性能的改善更為明顯。CTCP 和“接收窗口自動調節”配合使用,可以提高鏈接利用率,最終可以顯著提高具有較大 BDP 的連接的性能。
默認情況下,運行 Windows Server“Longhorn”的計算機上啟用 CTCP,而運行 Windows Vista 的計算機上則禁用 CTCP。可以使用“netsh interface tcp set global congestionprovider=ctcp”命令啟用 CTCP,還可以使用“netsh interface tcp set global congestionprovider=none”命令禁用 CTCP。
TCP 報頭中的“窗口”字段大小為 16 位,允許 TCP 對等方通告最大為 65,535 字節的接收窗口。您可以根據以下公式計算給定 TCP 窗口的近似吞吐量:
 
Throughput = TCP maximum receive windowsize / RTT
例如,對於 65,535 字節的接收窗口,在 RTT 為 100 毫秒的路徑上只能達到速度大約為每秒 5.24 兆字節 (Mbps) 的吞吐量,而不管傳輸路徑的實際帶寬是多少。對於目前的高 BDP 傳輸路徑,最初設計的 TCP 窗口大小即使達到最大值,仍然是吞吐量的瓶頸。

 

TCP 窗口縮放
為了提供可適應高速傳輸路徑的更大窗口尺寸,RFC 1323 ( ietf.org/rfc/rfc1323.txt) 定義了允許接收端通告大於 65,535 字節的窗口大小的窗口縮放。“TCP 窗口縮放”選項包括一個窗口縮放因子,該因子與 TCP 報頭中的 16 位窗口字段結合時,可以將接收窗口大小最大增加到 1GB。“TCP 窗口縮放”選項只用於在連接建立過程的同步 (SYN) 段中發送數據。TCP 對等方都可以為接收窗口大小指定不同的窗口縮放因子。TCP 窗口縮放允許發送端通過一個連接發送更多的數據,可以使 TCP 節點更好地利用一些具有高 BDP 的傳輸路徑類型。
盡管接收窗口大小對於 TCP 吞吐量而言非常重要,但確定最佳 TCP 吞吐量還有一個重要的因素,那就是應用程序檢索接收窗口中累積數據的速度(應用程序檢索速率)。如果應用程序不能檢索數據,接收窗口就可以開始填充,導致接收端通告了更小的當前窗口大小。在極個別的情況下,整個最大接收窗口都會填滿,導致接收端通告了 0 字節的窗口大小。在這種情況下,發送端必須停止發送數據,直到接收窗口已經清除為止。因此,要優化 TCP 吞吐量,必須將連接的 TCP 接收窗口設定為可同時反映該連接傳輸路徑的 BDP 和應用程序檢索速率的值。
即使您可以正確地確定 BDP 和應用程序檢索速率,它們仍會隨時間而變化。BDP 速率可以根據傳輸路徑中的阻塞情況而變化,而應用程序檢索速率會根據應用程序檢索數據所在的連接數量而變化。

 

Windows XP 中的接收窗口
對於 Windows XP(和 Windows Server ® 2003)中的 TCP/IP 堆棧,最大接收窗口的大小具有許多重要的屬性。首先,默認值基於發送界面的鏈接速度。實際值自動調整為 TCP 連接建立過程中協商的最大段大小 (MSS) 的偶數增量。
其次,最大接收窗口的大小可以手動配置。可將注冊表項 HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\TCPWindowSize 和 HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Interface\InterfaceGUID\TCPWindowSize 的值設置為最大 65,535 字節(不帶窗口縮放)或 1,073,741,823 字節(帶窗口縮放)。
再次,最大接收窗口的大小可以使用窗口縮放。可通過將注冊表項 HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Tcp1323Opts 的值設置為 1 或 3 來啟用窗口縮放。默認情況下,僅當接收的同步 (SYN) 段包含“窗口縮放”選項時,才在連接上使用窗口縮放。
最后,啟動連接時,可使用應用程序的“SO_RCVBUF Windows Sockets”選項,指定連接的最大接收窗口大小。使用窗口縮放時,應用程序所指定的窗口大小必須大於 65,535 字節。
盡管 Windows XP 支持可縮放窗口,但其中的最大接收窗口大小仍然會限制吞吐量,因為它是針對所有 TCP 連接(除非由應用程序指定)的一個固定的最大大小,它可以增加某些連接的吞吐量,同時減少其他連接的吞吐量。另外,TCP 連接的最大接收窗口大小固定,不隨應用程序檢索速率的變化或傳輸路徑中的阻塞而變化。

 

Windows Vista 中的接收窗口自動調節
為了優化 TCP 吞吐量,特別是具有高 BDP 的傳輸路徑,Windows Vista(和代碼名為“Longhorn”的 Windows Server 下一版本)中的下一代 TCP/IP 堆棧支持接收窗口自動調節功能。該功能通過測量 BDP 和應用程序檢索速率,以及調整當前的傳輸路徑和應用程序狀況的窗口大小,來確定最合適的接收窗口大小。
默認情況下,“接收窗口自動調節”會啟用 TCP 窗口縮放,它所允許的最大窗口大小為 16 MB。數據流通過連接時,下一代 TCP/IP 堆棧會監控連接,測量該連接當前的 BDP 和應用程序檢索速率,並調整接收窗口大小以優化吞吐量。下一代 TCP/IP 堆棧不再使用 TCPWindowSize 注冊表值。
“接收窗口自動調節”功能具有許多優點。它可以根據每個連接自動確定最佳的接收窗口大小。在 Windows XP 中,TCPWindowSize 注冊表值適用於所有的連接。應用程序無需再通過“Windows Socket”選項指定 TCP 窗口大小。並且 IT 管理員也無需再為特定的計算機手動配置 TCP 接收窗口的大小。
使用“接收窗口自動調節”功能后,基於 Windows Vista 的 TCP 對等方通常會比基於 Windows XP 的 TCP 對等方通告更大的接收窗口大小。這使得其他 TCP 對等方可以通過發送更多的 TCP 數據段來將管道填入基於 Windows Vista 的 TCP 對等方,而無需等待 ACK(服從 TCP 擁塞控制)。對於如網頁或電子郵件等典型的基於客戶端的網絡通信,Web 服務器或電子郵件服務器可以向客戶端計算機更快更多地發送 TCP 數據,從而全面提高網絡性能。連接的 BDP 和應用程序檢索速率越高,性能的提高就越明顯。
在數據傳輸中,將通常以較慢的速度發送的 TCP 數據包流快速發送,從而導致網絡利用率出現更大的高峰,這就是該方法對網絡造成的影響。基於 Windows XP 和 Windows Vista 的計算機在長而粗的管道上執行相同的數據傳輸時,傳輸的數據量相同。然而,基於 Windows Vista 的客戶端計算機的數據傳輸更快,因為其具有更大的接收窗口大小,並且服務器能夠填充從自身到客戶端的管道。
由於“接收窗口自動調節”會增加高 BDP 傳輸路徑的網絡利用率,因此對於達到或接近最大容量的傳輸路徑,限制使用服務質量 (QoS) 或應用程序發送速率可能會變得非常重要。為了滿足此潛在的需要,Windows Vista 支持基於組策略的 QoS 設置,可以利用該設置為基於 IP 地址或 TCP 端口的信息流發送速率定義限制速率。有關詳細信息,請參閱 基於策略的 QoS 資源
增加高損失網絡的 TCP 吞吐量
在高損失網絡中,頻繁的超時和重傳可能會大大降低 TCP 吞吐量。高損失網絡的一個例子就是無線網絡,如基於 IEEE 802.11、通用分組無線業務 (GPRS) 或通用移動通信系統 (UMTS) 的網絡,由於網絡狀況、信號衰減、電磁干擾和計算機的位置變化,可能會有較高的數據包丟失率。
下一代 TCP/IP 堆棧支持以下四種 RFC,可以優化高丟失率環境中的吞吐量:

RFC 2582:The NewReno Modification to TCP's Fast Recovery Algorithm(TCP 快速恢復算法 NewReno 修正)
RFC 2001 中定義的快速恢復算法基於 Reno 算法,由於快速重傳事件而重傳段時,Reno 算法可增加發送端能發送的數據量。Reno 算法適用於單個丟失的段,有多個丟失段時就不適用了。當數據窗口中的多個段丟失且發送端收到部分確認(僅對成功接收的那部分數據的確認)時,NewReno 算法通過更改快速恢復過程中發送端可以用來提高發送速率的方法,提供更大的吞吐量。

RFC 2883:An Extension to the Selective Acknowledgment (SACK) Option for TCP(TCP 選擇確認 (SACK) 選項擴展)
RFC 2018 中定義的 SACK,允許接收端通過使用 SACK TCP 選項指示最多四個接收數據的非鄰接塊。RFC 2883 定義用於確認重復的數據包的 SACK TCP 選項中的字段的額外使用。發送端可以通過此操作確定何時重傳了不必要的段並調整其行為,以防今后不必要的重傳。發送的重傳越少,整體吞吐量越合理。

RFC 3517:A Conservative Selective Acknowledgment-based Loss Recovery Algorithm for TCP(TCP 的基於保守選擇確認的丟失恢復算法)
Windows Server 2003 和 Windows XP 中的 TCP/IP 當前實現只使用 SACK 信息確定未到達目標的 TCP 段。RFC 3517 定義了收到重復確認后使用 SACK 信息執行丟失恢復的方法,以便在連接上啟用 SACK 時替代原來的快速恢復算法。下一代 TCP/IP 堆棧基於每個連接跟蹤 SACK 信息並監控傳入確認和重復確認,以便在目標未收到多個段時更快進行恢復。

RFC 4138:Forward RTO-Recovery (F-RTO):An Algorithm for Detecting Spurious Retransmission Timeouts with TCP and the Stream Control Transmission Protocol (SCTP)(使用 TCP 和流控制傳輸協議 (SCTP) 探測偽重傳超時設定的算法)
RTT 突然增加時,可能會出現 TCP 段的偽重傳現象,導致先前發送的段的重傳超時設定 (RTO) 逐漸到期,TCP 開始重傳它們。如果 RTT 增加正好發生在發送整個窗口的數據前,發送端可能會重傳整個窗口的數據。F-RTO 算法通過以下行為防止 TCP 段的偽重傳。
當多個段的 RTO 到期時,TCP 只重傳第一個段。收到第一個確認后,TCP 開始發送新段(如果通告的窗口大小允許)。如果下一個確認確認超時但未重傳的其他段,則 TCP 確定超時是偽超時,不重傳超時的其他段。
這樣的結果是,對於 RTT 突然和臨時增加的環境(例如,當無線客戶端從一個入口點漫游到另一個時),F-RTO 可防止不必要的段重傳並更快地恢復到正常發送速率。基於 SACK 的丟失恢復和 F-RTO 最適用於使用 GPRS 鏈接的連接。

 

http://technet.microsoft.com/zh-cn/magazine/2007.01.cableguy.aspx


免責聲明!

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



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