Windows TCP 機能の説明

この記事では、Windows の TCP 機能について説明します。

適用対象: Windows 10 - すべてのエディション、Windows Server 2012 R2
元の KB 番号: 224829

概要

この記事では、Windows の次の TCP 機能について説明します。

  • TCP ウィンドウ サイズ
  • TCP オプションがサポートされるようになりました
  • Windows スケーリング - RFC 1323
  • タイムスタンプ - RFC 1323
  • ラップされたシーケンス番号 (PAWS) に対する保護
  • 選択的受信確認 (SACKS) - RFC 2018
  • TCP 再送信動作と高速再送信

TCP 機能は、レジストリ内のエントリを変更することで変更できます。

重要

次のセクション、メソッド、またはタスクには、レジストリを変更する方法を示す手順が含まれています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 レジストリを変更する際には十分に注意してください。 保護を強化するため、レジストリを変更する前にレジストリをバックアップします。 こうしておけば、問題が発生した場合にレジストリを復元できます。 レジストリのバックアップ方法および復元方法の詳細を参照するには、以下のサポート技術情報番号をクリックしてください。
322756 Windows でレジストリをバックアップおよび復元する方法

TCP ウィンドウ サイズ

TCP 受信ウィンドウ サイズは、接続中にバッファーできる受信データの量 (バイト単位) です。 送信側ホストは、受信ホストからの受信確認とウィンドウ更新を待機する必要がある前に、その量のデータのみを送信できます。 Windows TCP/IP スタックは、ほとんどの環境で自己調整するように設計されており、以前のバージョンよりも大きな既定のウィンドウ サイズを使用します。

ハードコーディングされた既定の受信ウィンドウ サイズを使用する代わりに、TCP は最大セグメント サイズ (MSS) の増分に調整します。 MSS は、接続のセットアップ中にネゴシエートされます。 受信ウィンドウを MSS の増分に均等に調整すると、一括データ転送中に使用されるフルサイズの TCP セグメントの割合が増加します。

受信ウィンドウのサイズは、次の方法で決定されます。

  1. リモート ホストに送信される最初の接続要求では、受信ウィンドウ サイズが 16K (16,384 バイト) にアドバタイズされます。
  2. 接続が確立されると、受信ウィンドウ サイズは MSS の偶数の増分に切り上げられます。
  3. ウィンドウ サイズは、ウィンドウ スケーリング オプション (RFC 1323) を使用しない限り、MSS の 4 倍の最大サイズ 64 K に調整されます。

注:

「Windows スケーリング」セクションを参照してください。

イーサネット接続の場合、通常、ウィンドウ サイズは 17,520 バイトに設定されます (16K は 12 個の 1460 バイト セグメントに切り上げられます)。 選択的受信確認 (SACKS) やタイムスタンプなどの拡張 TCP ヘッド オプションをサポートするコンピューターへの接続が確立されると、ウィンドウ サイズが小さくなります。 これら 2 つのオプションを使用すると、TCP ヘッダー サイズが 20 バイトを超えるまで増加するため、データの余地が少なくなります。

以前のバージョンのWindows NTでは、イーサネット接続のウィンドウ サイズは 8,760 バイト、つまり 6 つの 1460 バイト のセグメントでした。

受信ウィンドウ サイズを特定の値に設定するには、Windows のバージョンに固有のレジストリ サブキーに TcpWindowSize 値を追加します。 そのために、以下の手順に従ってください。

  1. [Start Run]\(実行の開始\>) を選択し、「」と入力Regeditし、[OK] を選択します

  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 16 進数です。

この値は既定では存在しません。 TcpWindowSize 値を追加すると、上記の既定のウィンドウ サイズ アルゴリズムがオーバーライドされます。

注:

TcpWindowSize を Parameters キーに追加して、すべてのインターフェイスのウィンドウ サイズをグローバルに設定することもできます。

TCP オプションがサポートされるようになりました

以前は、TCP オプションは主に最大セグメント サイズのネゴシエートに使用されていました。 Windows では、ウィンドウ スケーリング、タイム スタンプ、および選択的 ACK に TCP オプションが使用されます。

TCP オプションには、次の 2 種類があります。

  1. 特定のオプションの種類を示すために使用される 1 つのオクテット TCP オプション。
  2. オプションの種類、オプションの長さ、一連のオプション オクテットで構成される複数のオクテット TCP オプション。

次の一覧は、各 TCP オプションの種類、長さ、名前、および説明を示しています。

種類: 0
長さ: 1
Option: End of Option List
説明: 最後の TCP オプションにパディングが必要な場合に使用されます。

種類: 1
長さ: 1
オプション: 操作なし
説明: パディングが必要な場合に使用され、同じパケット内でより多くの TCP オプションが続きます。

種類: 2
長さ: 4
オプション: 最大セグメント サイズ
説明: ネットワーク経由で送信できる TCP セグメントの最大サイズを示します。

種類: 3
長さ: 3
オプション: ウィンドウ スケール オプション
説明: 64k を超えるウィンドウ サイズを使用するときに使用するスケーリング係数を識別します。

種類: 8
長さ: 10
オプション: タイム スタンプ オプション
説明: 送信されたパケットのラウンド トリップ時間 (RTT) の計算に役立ちます。

種類: 4
長さ: 2
オプション: TCP SACK 許可
説明: 選択的な攻撃が許可されていることを他のホストに通知します。

種類: 5
長さ: 異なります
オプション: TCP SACK オプション
説明: ホストは、順序が整ったパケットが受信されたかどうかを識別するために使用されます。

Windows スケーリング

高帯域幅ネットワークをより効率的に使用するために、より大きな TCP ウィンドウ サイズを使用できます。 TCP ウィンドウ サイズ フィールドは、データのフローを制御し、2 バイトまたは 65,535 バイトのウィンドウ サイズに制限されます。

サイズ フィールドを展開できないため、スケーリング係数が使用されます。 TCP ウィンドウ スケールは、最大ウィンドウ サイズを 65,535 バイトから 1 ギガバイトに増やすために使用されるオプションです。

ウィンドウ スケール オプションは、TCP の 3 方向ハンドシェイク中にのみ使用されます。 ウィンドウ スケール値は、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  

実際の 3 方向ハンドシェイクで使用されるウィンドウ サイズは、RFC 1323 セクション 2.2 に従ってスケーリングされるウィンドウ サイズではありません。

"SYN の Window フィールド (例: [SYN] や [SYN,ACK]) セグメント自体はスケーリングされません。

これは、3 方向ハンドシェイクの後に送信される最初のデータ パケットが実際のウィンドウ サイズであることを意味します。 スケーリング係数がある場合、初期ウィンドウ サイズは常に 65,535 バイトです。 次に、ウィンドウ サイズに、3 方向ハンドシェイクで識別されるスケーリング係数が乗算されます。 次の表は、さまざまなウィンドウ サイズのスケーリング係数の境界を表しています。

尺度 スケール値 初期ウィンドウ ウィンドウのスケーリング
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

例:

レジストリのウィンドウ サイズが 10 進数で 269000000 (269M) と入力された場合、3 方向ハンドシェイク中のスケーリング係数は 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 スタックでは、送信されたデータのウィンドウごとに 1 つのサンプルを使用して、ラウンドトリップ時間 (RTT) を計算しました。 受信確認が受信されるまで、パケットが送信されたときにタイマー (再送信タイマー) が設定されました。 たとえば、イーサネット ネットワーク上のウィンドウ サイズが 64,240 バイト (44 個の完全なセグメント) であった場合、ラウンドトリップ時間を再計算するために使用されたパケットは 44 パケットごとに 1 つだけです。 最大ウィンドウ サイズは 65,535 バイトで、このサンプリング レートで十分でした。 ウィンドウスケーリングと最大ウィンドウサイズ1ギガバイトを使用すると、このRTTサンプリングレートでは十分ではありません。

TCP Timestamp オプションを、スタックによって適切と見なされるセグメント (データと ACK) で使用して、次のような操作を実行できるようになりました。

  • RTT 計算
  • PAWS チェック

このデータを使用して、RTT は大きなウィンドウ サイズで正確に計算できます。 RTT は、再送信間隔を計算するために使用されます。 最適なスループットを実現するには、正確な RTT と再送信のタイムアウトが必要です。

TCP タイム スタンプが TCP セッションで使用されている場合、セッションの発信元は TCP 三方向ハンドシェイク (SYN パケット) の最初のパケットでオプションを送信します。 どちらの側でも、セッション中に TCP オプションを使用できます。

TCP Timestamps オプション (TSopt):

Kind = 8 Length = 10 TS 値 (Tsval) TS エコー応答 (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 ビットに制限されており、使用可能なシーケンス番号の数が制限されます。 大容量ネットワークと大規模なデータ転送により、パケットがネットワークを通過する前にシーケンス番号をラップできます。 1 ギガ バイト/秒 (Gbps) ネットワークでデータを送信する場合、シーケンス番号は 34 秒ほどで折り返される可能性があります。 パケットが遅延した場合、同じシーケンス番号を持つ別のパケットが存在する可能性があります。 重複するシーケンス番号の混同を避けるために、TCP タイムスタンプはシーケンス番号の拡張として使用されます。 パケットには、現在のタイム スタンプと進行中のタイム スタンプがあります。 古いパケットには古いタイム スタンプがあり、破棄されます。

選択的受信確認 (SACK)

Windows では、選択的受信確認 (SACK) と呼ばれるパフォーマンス機能のサポートが導入されています。 SACK は、大きな TCP ウィンドウ サイズを使用する接続に特に重要です。 SACK より前は、受信側は、受信された連続したデータ ストリームの最新のシーケンス番号、または受信ウィンドウの "左端" のみを確認できました。 SACK が有効になっている場合、受信側は引き続き ACK 番号を使用して受信ウィンドウの左端を確認しますが、受信データの他のブロックを個別に確認することもできます。 SACK では、次に示すように TCP ヘッダー オプションが使用されます。

SACK では、2 種類の TCP オプションが使用されます。

TCP Sack-Permitted オプションは、選択的 ACK を実行できることを示すために SYN パケット (TCP 接続確立中) でのみ使用されます。

2 番目の TCP オプション TCP Sack Option には、1 つ以上のデータ ブロックに対する受信確認が含まれています。 データ ブロックは、データ ブロックの先頭と末尾のシーケンス番号を使用して識別されます。 これは、データ ブロックの左端と右端とも呼ばれます。

種類 4 は TCP Sack-Permitted オプションです。 種類 5 は TCP Sack オプションです。 長さは、この 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 再送信

通常の再送信動作のレビューとして、TCP は、各送信セグメントがインターネット プロトコル (IP) に引き継がれたときに再送信タイマーを開始します。 タイマーが期限切れになる前に、特定のセグメント内のデータに対して受信確認が受信されていない場合、セグメントは再送信されます。

再送信タイムアウト (RTO) は、RFC 793 で説明されているように Smoothed Round Trip Time (SRTT) 計算を使用して、接続の特性に合わせて継続的に調整されます。 特定のセグメントのタイマーは、そのセグメントの再送信のたびに 2 倍になります。 このアルゴリズムを使用して、TCP はそれ自体を接続の通常の遅延にチューニングします。

高速再送信

TCP は、状況によっては再送信タイマーの有効期限が切れる前にデータを再送信します。 最も一般的な原因は、高速再送信と呼ばれる機能です。 高速再送信をサポートするレシーバーが、現在予想されているシーケンス番号を超えるシーケンス番号を持つデータを受信すると、一部のデータが削除された可能性があります。 このイベントを送信者に知らせるのに役立つよう、受信側はすぐに ACK を送信し、ACK 番号は予期していたシーケンス番号に設定されます。 この処理は、到着する追加の TCP セグメントごとに引き続き実行されます。 送信者が同じシーケンス番号を認識している ACL のストリームの受信を開始すると、セグメントが削除されている可能性があります。 送信者は、再送信タイマーの有効期限が切れるのを待たずに、受信側が予期しているセグメントを直ちに再送信します。 この最適化により、パケットが頻繁にドロップされる場合のパフォーマンスが大幅に向上します。

既定では、Windows は次の条件でセグメントを再送信します。

  • 同じシーケンス番号の 3 つの ACL (1 つの ACK と 2 つの重複) を受け取ります。
  • シーケンス番号は現在の番号に遅れをとります。

この動作は、レジストリ パラメーターを使用して TcpMaxDupAcks 制御できます。

次のレジストリ キーの TcpMaxDupAcks 値を編集して、高速再送信を開始するために必要な ACL の数を制御できます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. ツール バーの [実行開始>] を選択し、「」と入力Regeditしてレジストリ エディターを開始します。
  2. [レジストリ] エディターで上記のキーを見つけて選択し、[編集] メニューの [変更] を選択します。
  3. [ 値データ ] ボックスに目的の値を入力します。

注:

有効な範囲は 1 から 3 で、既定値は 2 です。

このパラメーターは、転送中にドロップされたセグメントを再送信するためにトリガーされる前 fast retransmit に、同じシーケンス数の送信データに対して受信する必要がある重複する ACL の数を決定します。