次の方法で共有


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 の 4 倍に調整され、最大サイズは 64 K になります。

Note

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

イーサネット接続の場合、ウィンドウ サイズは通常 17,520 バイトに設定されます (16 K は 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. Edit メニューの Modify を選択します。

  6. [ Value data ボックスに目的のウィンドウ サイズを入力します。

    Note

    ウィンドウ サイズの有効な範囲は 0 0x3FFFC000 16 進数です。

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

Note

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

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

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

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

  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 ギガバイトに増やすために使用されるオプションです。

ウィンドウ スケール オプションは、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. ツール バーで Start>Run を選択し、「 Regedit 」と入力してレジストリ エディターを起動します。

  2. レジストリ エディターで Edit を選択し、 New をポイントし、 DWORD 値を選択します。

  3. [新しい値] ボックスに「 Tcp1323Opts」と入力し、Enter キーを押し、 Edit メニューの Modify を選択します。

    Note

    有効な範囲は 0、1、2、または 3 です。ここで、
    0 (RFC 1323 オプションを無効にする)
    1 (ウィンドウ スケールのみ有効)
    2 (タイムスタンプのみ有効)
    3 (両方のオプションが有効)

このレジストリ エントリは、RFC 1323 タイムスタンプとウィンドウ スケーリング オプションを制御します。 タイムスタンプとウィンドウのスケーリングは既定で有効になっていますが、フラグ ビットを使用して操作できます。 Bit 0 はウィンドウのスケーリングを制御します。 ビット 1 はタイムスタンプを制御します。

タイムスタンプ

以前は、TCP/IP スタックは、送信されたデータのウィンドウごとに 1 つのサンプルを使用してラウンドトリップ時間 (RTT) を計算しました。 受信確認が受信されるまで、パケットが送信されたときにタイマー (再送信タイマー) が設定されました。 たとえば、ウィンドウ サイズがイーサネット ネットワーク上で 64,240 バイト (44 個の完全なセグメント) であった場合、ラウンドトリップ時間の再計算には 44 パケットごとに 1 つだけが使用されました。 最大ウィンドウ サイズは 65,535 バイトで、このサンプリング レートで十分でした。 ウィンドウのスケーリングと最大ウィンドウ サイズの 1 ギガバイトを使用すると、この RTT サンプリング レートでは不十分です。

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

  • RTT 計算
  • PAWS チェック

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

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

TCP Timestamps オプション (TSopt):

Kind = 8 長さ = 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 を実行できることを示すために、(TCP 接続確立中に) SYN パケットでのみ使用されます。

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

Kind 4 は TCP Sack-Permitted オプションです。 種類 5 は TCP Sack オプションです。 長さは、この TCP オプションの長さ (バイト単位) です。

Tcp SACK 許可:

Kind = 4 長さ = 2
1 バイト 1 バイト

Tcp SACK オプション:

Kind = 5 長さ = 変数
1 バイト 最初のブロックの左端から最初のブロックの右端
...
N 番目のブロックの左端から N 番目のブロックの右端

SACK を有効 (既定) にすると、パケットまたは一連のパケットを破棄できます。 受信側は、受信されたデータと、データに "穴" がある可能性がある場所を送信者に通知します。 その後、送信者は、既に正常に受信されたデータ ブロックの再送信なしで、不足しているデータを選択的に再送信できます。 SACK は、SackOpts レジストリ パラメーターによって制御されます。

次のレジストリ キーの SackOpts 値を編集して、選択的受信確認の使用を制御できます。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. ツール バーで Start>Run を選択し、「 Regedit 」と入力してレジストリ エディターを起動します。
  2. レジストリ エディターで上記のキーを見つけて選択し、Edit メニューの Modify を選択します。
  3. Value data ボックスに目的の値を入力します。

Note

有効なバイナリ値は 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 セグメントごとに引き続き行われます。 送信者が同じシーケンス番号を認識している AKS のストリームの受信を開始すると、セグメントが削除された可能性があります。 送信側は、再送信タイマーの有効期限が切れるのを待たずに、受信側が予期しているセグメントを直ちに再送信します。 この最適化により、パケットが頻繁に破棄される場合のパフォーマンスが大幅に向上します。

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

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

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. ツール バーで Start>Run を選択し、「 Regedit 」と入力してレジストリ エディターを起動します。
  2. レジストリ エディターで上記のキーを見つけて選択し、Edit メニューの Modify を選択します。
  3. Value data ボックスに目的の値を入力します。

Note

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

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