共用方式為


Windows TCP 功能的描述

本文說明 Windows 中的 TCP 功能。

原始 KB 編號: 224829

摘要

本文說明 Windows 中的下列 TCP 功能:

  • TCP 視窗大小
  • 目前支援 TCP 選項
  • Windows 調整 - RFC 1323
  • 時間戳 - RFC 1323
  • 保護包裝序號 (PAWS)
  • 選擇性通知 (SACKS) - RFC 2018
  • TCP 重新傳輸行為和快速重新傳輸

變更登錄中的專案,即可變更 TCP 功能。

重要

下列各節、方法或工作包含可告訴您如何修改登錄的步驟。 不過,如果您不當修改登錄,可能會發生嚴重問題。 因此,請務必小心執行下列步驟。 為增加保護起見,請先備份登錄,再進行修改。 然後,如果發生問題,您就可以還原登錄。 如需有關如何備份和還原登錄的詳細資訊,請按一下以下文章編號來檢視 Microsoft 知識庫 文章:
322756 如何在 Windows 中備份和還原登錄

TCP 視窗大小

TCP 接收視窗大小是可在連接期間緩衝的接收數據量(以位元組為單位)。 傳送主機只能傳送該數量的數據,才能等候接收主機的通知和視窗更新。 Windows TCP/IP 堆棧的設計目的是在大部分環境中自行調整,並使用比舊版更大的默認視窗大小。

TCP 不需要使用硬式編碼的預設接收視窗大小,而是會調整為最大區段大小 (MSS) 的增量。 MSS 會在連線設定期間交涉。 將接收窗口調整為 MSS 的偶數遞增,會增加大量數據傳輸期間所使用的完整 TCP 區段百分比。

接收視窗大小會以下列方式決定:

  1. 傳送至遠端主機的第一個連線要求會公告接收視窗大小為 16K(16,384 個字節)。
  2. 建立連接時,接收視窗大小會四捨五入為 MSS 的偶數遞增。
  3. 除非使用視窗縮放選項(RFC 1323),否則視窗大小會調整為 MSS 的四倍,大小上限為 64 K。

注意

請參閱一節。

對於乙太網路連線,視窗大小通常會設定為 17,520 個字節(16K 四捨五入至十二個 1460 位元組的區段)。 建立連線到支援擴充 TCP 前端選項的電腦時,視窗大小可能會減少,例如選擇性通知 (SACKS) 和時間戳。 這兩個選項會將 TCP 標頭大小增加為 20 個以上的位元元組,這會導致數據空間較少。

在舊版的 Windows NT 中,乙太網路連線的視窗大小為 8,760 個字節,或六個 1460 位元組區段。

若要將接收視窗大小設定為特定值,請將 TcpWindowSize 值新增至 Windows 版本特定的登錄子機碼。 若要如此做,請執行下列步驟:

  1. 選取 [啟動>執行],輸入 Regedit,然後選取 [確定]。

  2. 展開 Windows 版本專屬的登錄子機碼:

    • 針對 Windows 2000,展開下列子機碼: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • 針對 Windows Server 2003,展開下列子機碼: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. 在 [ 編輯 ] 功能表上,指向 [ 新增],然後選取 [DWORD 值]。

  4. 在 [新增值] 方塊中輸入 TcpWindowSize ,然後按 Enter 鍵

  5. 選取 [編輯] 功能表上的 [修改]。

  6. 在 [值數據] 方塊中輸入所需的視窗大小。

    注意

    視窗大小的有效範圍是0-0x3FFFC000十六進位。

此值預設不存在。 當您新增 TcpWindowSize 值時,它會覆寫上述的預設視窗大小演算法。

注意

TcpWindowSize 也可以新增至 Parameters 索引鍵,以全域設定所有介面的視窗大小。

目前支援 TCP 選項

先前,TCP 選項主要用於交涉最大區段大小。 在 Windows 中,TCP 選項用於視窗縮放、時間戳和選擇性 ACK。

TCP 選項有兩種類型:

  1. 單一八位 TCP 選項,用來表示特定選項種類。
  2. 多個八位 TCP 選項,其中包含選項種類、選項長度和一系列選項八位。

下列清單顯示每個 TCP 選項種類、長度、名稱和描述。

種類:0
長度:1
選項:選項清單結尾
描述:在最後一個 TCP 選項需要填補時使用。

種類:1
長度:1
選項:無作業
描述:在需要填補時使用,且更多 TCP 選項會遵循相同的封包。

種類:2
長度:4
選項:區段大小上限
描述:指出可透過網路傳送之 TCP 區段的大小上限。

種類:3
長度:3
選項:視窗縮放選項
描述:識別使用大於 64k 的視窗大小時要使用的縮放比例。

種類:8
長度:10
選項:時間戳選項
描述:用來協助計算所傳輸封包的來回時間(RTT)。

種類:4
長度:2
選項:允許 TCP SACK
描述:通知其他主機允許選擇性Ack。

種類:5
長度:變化
選項:TCP SACK 選項
描述:主機用來識別是否已收到順序錯誤的封包。

Windows 調整

為了更有效率地使用高頻寬網路,可以使用較大的 TCP 視窗大小。 TCP 視窗大小欄位會控制數據流,且限制為 2 個字節,或視窗大小為 65,535 個字節。

由於無法展開大小欄位,因此會使用縮放比例。 TCP 視窗縮放是用來將視窗大小上限從 65,535 位元組增加到 1 GB 的選項。

視窗縮放選項只會在 TCP 三向交握期間使用。 視窗小數字數值代表要向左移 16 位視窗大小欄位的位數。 視窗小數字數值可以從 0 設定為 14(無移位)。

若要計算 true 視窗大小,請將視窗大小乘以 2^S,其中 S 是尺規值。

例如:

如果視窗大小是65,535個字節,且視窗縮放比例為3。
True 視窗大小 = 65535*2^3

True 視窗大小 = 524280

下列網路監視器追蹤顯示如何使用視窗縮放選項:

TCP: ....S., len:0, seq:725163-725163, ack:0, win:65535, src:1217 dst:139(NBT Session)  
TCP: Source Port = 0x04C1  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 725163 (0xB10AB)  
TCP: Acknowledgement Number = 0 (0x0)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x02 : ....S.  
TCP: Window = 65535 (0xFFFF)  
TCP: Checksum = 0x8565  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
+ TCP: Maximum Segment Size Option  
TCP: Option Nop = 1 (0x1)  
TCP: Window Scale Option  
TCP: Option Type = Window Scale  
TCP: Option Length = 3 (0x3)  
TCP: Window Scale = 3 (0x3)  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: SACK Permitted Option  

實際三向交握中使用的視窗大小不是調整的視窗大小,每個 RFC 1323 區段 2.2:

「SYN 中的 [視窗] 欄位(例如 [SYN] 或 [SYN,ACK]) 區段本身永遠不會調整。

這表示在三向交握之後傳送的第一個數據封包是實際的視窗大小。 如果有縮放比例,則一律會使用65,535個字節的初始視窗大小。 然後視窗大小會乘以三向交握所識別的縮放比例。 下表代表各種視窗大小的縮放比例界限。

擴充係數 縮放值 初始視窗 窗口調整
0 1 65535 或更少 65535 或更少
1 2 65535 131,070
2 4 65535 262,140
3 8 65535 524,280
4 16 65535 1,048,560
5 32 65535 2,097,120
6 64 65535 4,194,240
7 128 65535 8,388,480
8 256 65535 16,776,960
9 512 65535 33,553,920
10 1024 65535 67,107,840
11 2048 65535 134,215,680
12 4096 65535 268,431,360
13 8192 65535 536,862,720
14 16384 65535 1,073,725,440

例如:

如果登錄中的視窗大小以十進位輸入為 269000000000(269M),則三向交握期間的縮放比例為 13。 縮放比例為12隻允許視窗大小高達268,431,360個字節(268M)。

這個範例中的初始視窗大小會計算如下:
具有窗口縮放比例為 13 的 65,535 個字節。
True 視窗大小 = 65535*2^13
True 視窗大小 = 536,862,720

當視窗大小的值加入登錄中,且其大小大於預設值時,Windows 會嘗試使用容納新視窗大小的縮放值。

您可以在下列登入機碼中新增 Tcp1323Opts 值,以控制調整視窗和時間戳:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. 在工具列上,選取 [啟動>執行],然後輸入 Regedit 以啟動註冊表編輯器。

  2. 在註冊表編輯器中,選取 [編輯],指向 [ 新增],然後選取 [DWORD 值]。

  3. 在 [新增值] 方塊中,輸入 Tcp1323Opts、按 ENTER,然後在 [編輯 ] 功能表上,選取 [ 修改]。

    注意

    有效範圍是 0、1、2 或 3,其中:
    0 (停用 RFC 1323 選項)
    1 (只啟用視窗縮放比例)
    2 (僅啟用時間戳)
    3 (兩個選項都已啟用)

此登錄專案會控制 RFC 1323 時間戳和視窗縮放選項。 時間戳和視窗調整預設為啟用,但可以使用旗標位來操作。 位 0 控制視窗縮放。 位 1 控制時間戳。

時間戳記

先前,TCP/IP 堆疊會使用每個傳送的數據視窗一個範例來計算來回行程時間 (RTT)。 在傳送封包之前,會設定定時器(重新傳輸定時器),直到收到通知為止。 例如,如果乙太網路網路上的視窗大小為64,240個字節(44個完整區段),則每44個封包中只有一個用來重新計算來回時間。 最大視窗大小為 65,535 個字節,此取樣率就已足夠。 使用窗口調整,以及 1 GB 的視窗大小上限,此 RTT 取樣率就不足。

TCP 時間戳選項現在可以用於堆疊所考慮適合的區段(數據和 ACK),以執行下列作業:

  • RTT 計算
  • PAWS 檢查

使用此數據,RTT 可以使用大型視窗大小精確計算。 RTT 用來計算重新傳輸間隔。 最佳輸送量需要精確的 RTT 和重新傳輸逾時。

當 TCP 工作階段中使用 TCP 時間戳時,會話的建立者會在 TCP 三向交握(SYN 封包)的第一個封包中傳送選項。 任一端都可以在會話期間使用 TCP 選項。

TCP 時間戳選項 (TSopt):

Kind = 8 Length = 10 TS 值 (Tsval) TS Echo Reply (Tsecr)
1 個位元組 1 個位元組 4 個位元組 4 個位元組

展開 [TCP 選項] 欄位,即可在網路監視器追蹤中檢視時間戳選項欄位,如下所示:

TCP: Timestamps Option  
TCP: Option Type = Timestamps  
TCP: Option Length = 10 (0xA)  
TCP: Timestamp = 2525186 (0x268802)  
TCP: Reply Timestamp = 1823192 (0x1BD1D8)

保護包裝序號 (PAWS)

[TCP 序號] 字段限制為32位,這會限制可用的序號數目。 使用高容量網路和大型數據傳輸,可以在封包周遊網路之前包裝序號。 如果在每秒一 GB 的網路上傳送數據,則序號可能會以 34 秒的速度換行。 如果封包延遲,不同的封包可能會有相同的序號。 為了避免重複的序號混淆,TCP 時間戳會當做序號的延伸模組使用。 封包具有目前和進行中的時間戳。 舊封包具有較舊的時間戳,並遭到捨棄。

選擇性通知 (SDK)

Windows 引進了稱為「選擇性通知」或 SACK 的效能功能支援。 SACK 對於使用大型 TCP 視窗大小的連線特別重要。 在 SACK 之前,接收者只能確認已接收之連續數據流的最新序號,或接收視窗的「左邊緣」。 啟用 SACK 后,接收者會繼續使用 ACK 號碼來確認接收視窗的左邊緣,但也可以個別認可其他已接收數據區塊。 SACK 使用 TCP 標頭選項,如下所示。

SACK 使用兩種類型的 TCP 選項。

TCP Sack-Allowed 選項只會用於 SYN 封包中(在 TCP 連線建立期間),以指出它可以執行選擇性 ACK。

第二個 TCP 選項 TCP Sack 選項包含一或多個數據區塊的通知。 數據區塊是在數據區塊開頭和結尾使用序號來識別。 它也稱為數據區塊的左邊緣和右邊緣。

種類 4 是 TCP 允許的選項。 種類 5 是 TCP Sack 選項。 Length 是這個 TCP 選項的位元組長度。

允許 Tcp SACK:

Kind = 4 Length = 2
1 個位元組 1 個位元組

Tcp SACK 選項:

Kind = 5 Length = Variable
1 個位元組 第一個區塊的左邊緣到第一個區塊的右邊緣
...
第 N 個區塊的左邊緣到第 N 個區塊的右邊緣

啟用 SACK 時,可以卸除封包或一系列封包。 接收者會通知傳送者已接收哪些數據,以及數據中可能有「漏洞」的位置。 然後,傳送者可以選擇性地重新傳輸遺失的數據,而不需要重新傳輸已成功接收的數據區塊。 SACK 是由 SackOpts 登錄參數所控制。

您可以編輯下列登入機碼中的 SackOpts 值,以控制選擇性通知的使用:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. 在工具列上,選取 [啟動>執行],然後輸入 Regedit 以啟動註冊表編輯器。
  2. 在註冊表編輯器中找出並選取上述機碼,然後在 [編輯] 功能表上選取 [修改]。
  3. 在 [值數據] 方塊中輸入所需的值。

注意

有效的二進位值為 0 或 1,預設值為 1。 此參數會控制是否啟用選擇性 ACK (SACK - RFC 2018) 支援。

下列網路監視器追蹤說明主機會認可序號54857341的所有數據,以及序號 54858789-54861685 中的數據。 遺漏的數據是從54857341到54858788。

TCP: .A...., len:0, seq:925104-925104, ack:54857341, win:32722, src:1242 dst:139  
TCP: Source Port = 0x04DA  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 925104 (0xE1DB0)  
TCP: Acknowledgement Number = 54857341 (0x3450E7D)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x10 : .A....  
TCP: Window = 32722 (0x7FD2)  
TCP: Checksum = 0x4A72  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
TCP: SACK Option  
TCP: Option Type = 0x05  
TCP: Option Length = 10 (0xA)  
TCP: Left Edge of Block = 54858789 (0x3451425)  
TCP: Right Edge of Block = 54861685 (0x3451F75)

TCP 重新傳輸行為和快速重新傳輸

TCP 重新傳輸

為了檢閱一般重新傳輸行為,當每個輸出區段都交給因特網通訊協定 (IP) 時,TCP 會啟動重新傳輸定時器。 如果在定時器到期之前未收到指定區段中數據的認可,則會重新傳輸區段。

重新傳輸逾時 (RTO) 會持續調整,以符合使用 RFC 793 中所述平滑往返時間 (SRTT) 計算的連接特性。 指定區段的定時器會在該區段的每個重新傳輸之後加倍。 使用此演算法,TCP 會自行調整為連線的正常延遲。

快速重新傳輸

TCP 會在重新傳輸定時器在某些情況下到期之前重新傳輸數據。 最常見的原因是稱為快速重新傳輸的功能。 當支援快速重新傳輸的接收者接收具有超出目前預期序號的數據時,某些數據可能會遭到捨棄。 為了協助通知此事件的傳送者,接收者會立即傳送 ACK,並將 ACK 號碼設定為預期的序號。 它將繼續針對抵達的每個額外 TCP 區段執行此動作。 當傳送者開始接收認可相同序號的 ACK 數據流時,區段可能已經卸除。 傳送者會立即重新傳送接收者預期的區段,而不會等待重新傳輸定時器到期。 此優化可大幅改善經常卸除封包時的效能。

根據預設,Windows 會根據下列條件重新傳送區段:

  • 它會接收三個相同序號的 ACK:一個 ACK 和兩個重複項。
  • 序號會延隔目前的序號。

此行為可透過 TcpMaxDupAcks 登錄參數來控制。

您可以編輯下列登入機碼中的 TcpMaxDupAcks 值,以控制啟動快速重新傳輸所需的 ACK 數目:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. 在工具列上,選取 [啟動>執行],然後輸入 Regedit 以啟動註冊表編輯器。
  2. 在註冊表編輯器中找出並選取上述機碼,然後在 [編輯] 功能表上選取 [修改]。
  3. 在 [值數據] 方塊中輸入所需的值。

注意

有效範圍是 1-3,預設值為 2。

此參數會決定在觸發之前 fast retransmit ,必須針對相同已傳送數據序號接收的重複 ACK 數目,以重新傳送傳輸中已卸除的區段。