Windows TCP 功能的描述

本文說明 Windows 中的 TCP 功能。

適用於:Windows 10 – 所有版本、Windows Server 2012 R2
原始 KB 編號: 224829

摘要

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

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

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

重要事項

下列章節、方法或工作包含可告訴您如何修改登錄的步驟。 然而,不當修改登錄可能會發生嚴重的問題。 因此,請務必謹慎地依照這些步驟執行。 為了有多一層保護,請先備份登錄再進行修改。 如此一來,您就可以在發生問題時還原登錄。 如需有關如何備份和還原登錄的詳細資訊,請按一下下列文章編號,檢視「Microsoft 知識庫」中的文章:
322756 如何在 Windows 中備份及還原登錄

TCP 視窗大小

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

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

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

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

注意事項

See the "Windows scaling" section.

針對乙太網路連線,視窗大小通常會設定為 17,520 個字節, (16K 四捨五入到最多 12 個 1460 位元組的區段) 。 建立與支援擴充 TCP 前端選項之電腦的連線時,視窗大小可能會減少,例如選擇性通知 () 和時間戳。 這兩個選項會將 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 也可以新增至參數索引鍵,以全域設定所有介面的視窗大小。

現在支援 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 的單一程式代碼
描述:通知其他主機允許選擇性認可。

種類:5
長度:不同
選項:TCP 的單一選項
描述:主機用來識別是否收到順序不一的封包。

Windows 調整

若要更有效率地使用高頻寬網路,可以使用較大的 TCP 視窗大小。 [TCP 視窗大小] 字段會控制數據流,並限製為 2 個字節,或視窗大小為 65,535 個字節。

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

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

若要計算真正的視窗大小,請將視窗大小乘以 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 (中的 Window 欄位[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

例如:

如果登錄中的視窗大小輸入為 269000000 (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 長度 = 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 位,這會限制可用的序號數目。 透過高容量網路和大型數據傳輸,您可以在封包周遊網路之前包裝序號。 如果每秒傳送一個 Giga 位元組的數據 (Gbps) 網路,則序號的換行時間可能只有 34 秒。 如果封包延遲,可能存在具有相同序號的不同封包。 為了避免重複序號混淆,TCP 時間戳會用來做為序號的延伸。 封包具有目前和進行中的時間戳。 舊封包具有較舊的時間戳,而且會被捨棄。

選擇性通知 (SACK)

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

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

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

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

種類 4 為 TCP Sack-Permitted 選項。 種類 5 是 TCP 的使用選項。 Length 是這個 TCP 選項的長度,以位元組為單位。

Tcp PERMITTED 允許:

Kind = 4 長度 = 2
1 個位元組 1 個位元組

Tcp 的單一選項:

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

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

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

注意事項

有效的二進位值為 0 或 1,預設值為 1。 此參數可控制是否啟用選擇性 ACK (-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) 會持續調整,以符合使用 Smoothed Round Trip Time (SRTT) 計算的連線特性,如 RFC 793 中所述。 指定區段的定時器會在每次重新傳輸該區段之後加倍。 使用此演算法時,TCP 會自行調整連線的正常延遲。

快速重新傳輸

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

根據預設,Windows 會在下列情況下重新傳送區段:

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

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

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

注意事項

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

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