TCP 機能Windows説明

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

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

概要

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

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

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

重要

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

TCP ウィンドウのサイズ

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

ハードコードされた既定の受信ウィンドウ サイズを使用する代わりに、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 バイト のセグメントでした。

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

  1. [実行 > 開始] を選択し、 Regedit と入力し 、[OK] を選択します

  2. 次のバージョンのレジストリ サブキーを展開Windows。

    • 2000 Windows、次のサブキーを展開します。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
オプション: オプション 一覧の末尾
説明: 最後の TCP オプションにパディングが必要な場合に使用します。

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

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

種類: 3
長さ: 3
オプション: ウィンドウ スケール オプション
説明: 64k より大きいウィンドウ サイズを使用する場合に使用する拡大縮小率を識別します。

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

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

種類: 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 ウェイ ハンドシェイクで識別される拡大縮小係数を乗算します。 次の表は、さまざまなウィンドウ サイズの拡大縮小係数の境界を表しています。

スケール ファクター Scale Value 初期ウィンドウ ウィンドウの拡大/縮小
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. [新しい値] ボックスに「Enter」と入力し、[編集] メニューの [変更 Tcp1323Opts ] を 選択します

    注意

    有効な範囲は 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 タイムスタンプ オプションを、スタックが適切と見なすセグメント (データと ACK) で使用して、次のような操作を実行できます。

  • RTT の計算
  • PAWS チェック

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

TCP セッションで TCP タイム スタンプを使用すると、セッションの発信元は TCP 3 ウェイ ハンドシェイク (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 ビットに制限され、使用できるシーケンス番号の数が制限されます。 大容量ネットワークと大規模なデータ転送を使用すると、パケットがネットワークを通過する前にシーケンス番号をラップできます。 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 Option には、1 つ以上のデータ ブロックに対する確認応答が含まれています。 データ ブロックは、データ ブロックの最初と最後のシーケンス番号を使用して識別されます。 また、データ ブロックの左右の端とも呼ばれる。

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

Tcp SACK 許可:

Kind = 4 長さ = 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 で説明されているスムージングラウンドトリップタイム (SRTT) 計算を使用して接続の特性に合わせて継続的に調整されます。 特定のセグメントのタイマーは、そのセグメントの再送信の後に 2 倍にされます。 このアルゴリズムを使用して、TCP は自身を接続の通常の遅延に合図します。

高速再送信

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

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

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

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

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

注意

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

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