現在開始介紹我們的第一個主題 - 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)。
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 資源。