現在オフラインです。再接続するためにインターネットの接続を待っています

Windows 2000 および Windows Server 2003 の TCP 機能について

Windows Server 2003 のサポートは 2015 年 7 月 14 日で終了しています

Windows Server 2003 のサポートは 2015 年 7 月 14 日で終了しています。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

この記事は、以前は次の ID で公開されていました: JP224829
重要 : この資料には、レジストリの編集方法が記載されています。万一に備えて、編集の前には必ずレジストリをバックアップし、レジストリの復元方法を理解しておいてください。バックアップ、復元、および編集方法の詳細を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
256986 Microsoft Windows レジストリの説明
概要
この資料では、Microsoft Windows 2000 および Microsoft Windows Server 2003 の、以下の TCP 機能について説明します。
  • TCP ウィンドウ サイズ
  • 現在サポートされている TCP オプション
  • ウィンドウ スケーリング - RFC 1323
  • タイムスタンプ - RFC 1323
  • PAWS (Protection Against Wrapped Sequence) 番号
  • SACK (Selective Acknowledgments) - RFC 2018
  • TCP の再送動作と Fast Retransmit
TCP 機能はレジストリ内のエントリを変更することで変更できます。
詳細
警告 : レジストリ エディタまたは別の方法を使用してレジストリを誤って変更すると、深刻な問題が発生することがあります。最悪の場合、オペレーティング システムの再インストールが必要になることがあります。マイクロソフトは、レジストリの変更により発生した問題に関しては、一切責任を負わないものとします。レジストリの変更は、自己の責任において行ってください。

TCP ウィンドウ サイズ

TCP 受信ウィンドウ サイズは、接続中に一度にバッファに格納できる受信データの量 (バイト数) です。送信側ホストは、受信側ホストからの確認応答とウィンドウ更新を受信するまでは、受信ウィンドウ サイズで決められた量のデータしか送信できません。Windows の TCP/IP スタックは、ほとんどの環境で自動的に調整されるように設計されており、以前のバージョンよりもデフォルトのウィンドウ サイズが大きくなっています。

TCP では、受信ウィンドウのサイズとして、プログラムにハード コードされたデフォルトの値を使用するのではなく、接続の確立時に送信側と受信側で取り決める最大セグメント サイズ (MSS) の倍数になるように調整します。受信ウィンドウの値を MSS の倍数に調整することにより、大量のデータを転送する場合に、MSS のサイズの TCP セグメントが使用される割合が高くなります。

受信ウィンドウ サイズは、次の方法で決定されます。
  1. リモート ホストに最初に送信される接続要求では、受信ウィンドウ サイズが 16 KB (16,384 バイト) と通知されます。
  2. 接続が確立されると、受信ウィンドウのサイズは、MSS の倍数値になるように切り上げられます。
  3. ウィンドウ サイズは、MSS の 4 倍に調整されます。ウィンドウ スケーリング オプション (RFC 1323) が有効でない限り、最大サイズは 64 KB です。
: 「ウィンドウ スケーリング」を参照してください。

イーサネット接続の場合、ウィンドウ サイズは通常 17,520 バイト (16 KB を 1,460 バイトのセグメント 12 個分に切り上げた値) に設定されます。SACK (Selective Acknowledgments) やタイムスタンプなどの拡張 TCP ヘッダー オプションがサポートされているコンピュータへの接続を確立した場合、ウィンドウ サイズが小さくなる場合があります。この 2 つのオプションでは、TCP ヘッダーのサイズが 20 バイトより大きくなり、データ用の領域が少なくなるためです。

Windows NT の以前のバージョンでは、イーサネット接続の場合のウィンドウ サイズは 8,760 バイト (1,460 バイトのセグメント 6 個分) でした。

受信ウィンドウ サイズを特定の値に設定するには、Windows のバージョンに応じたレジストリ サブキーに TcpWindowSize 値を追加します。これを行うには、次の手順を実行します。
  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。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. "新しい値 #1" と表示されているボックスに TcpWindowSize と入力して Enter キーを押します。
  5. [編集] メニューの [変更] をクリックします。
  6. [値のデータ] ボックスにウィンドウ サイズを入力します。

    : ウィンドウ サイズの有効な値の範囲は、0 ~ 0x3FFFC000 (16 進数) です。
この値は、デフォルトでは存在しません。TcpWindowSize 値を追加すると、上で説明したデフォルトのウィンドウ サイズのアルゴリズムより優先されます。

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

現在サポートされている TCP オプション

以前は、TCP オプションは主に送信側と受信側で最大セグメント サイズを調整するために使用されていました。Windows では、TCP オプションはウィンドウ スケーリング、タイムスタンプ、および SACK 用に使用されます。

TCP オプションには、次の 2 種類があります。
  1. シングル オクテット TCP オプション (特定のオプションの種類を示すために使用されます。)
  2. マルチ オクテット TCP オプション (オプションの種類、オプションの長さ、および一連のオプション オクテットから構成されます。)
以下の一覧は、各 TCP オプションの種類、長さ、名前、および内容を示したものです。
種類 : 0
長さ : 1
オプション名 : End of Option List
内容 : 最後の TCP オプションにパディングが必要な場合に使用されます。

種類 : 1
長さ : 1
オプション名 : No Operation
内容 : パディングが必要で、かつ同じパケット内にさらに TCP オプションが続く場合に使用されます。

種類 : 2
長さ : 4
オプション名 : Maximum Segment Size
内容 : ネットワークを経由して送信可能な TCP セグメントの最大サイズを示します。

種類 : 3
長さ : 3
オプション名 : Window Scale Option
内容 : 64 KB よりも大きいウィンドウ サイズを使用する場合のスケーリング ファクタを指定します。

種類 : 8
長さ : 10
オプション名 : Time Stamp Option
内容 : 転送されるパケットの往復時間 (RTT) の計算を補助するために使用されます。

種類 : 4
長さ : 2
オプション名 : TCP SACK permitted
内容 : SACK (Selective Acknowledgements) を使用できることを他のホストに通知します。

種類 : 5
長さ : 可変
オプション名 : TCP SACK Option
内容 : ホストが要求外のパケットを受信したかどうかを判別するために使用されます。

ウィンドウ スケーリング

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

このサイズ フィールドは拡張できないため、スケーリング ファクタ (倍率をビット シフトの回数で表したもの) が使用されます。TCP ウィンドウ スケーリングは、最大ウィンドウ サイズを 65,535 バイトから 1 GB に拡大できるオプションです。

ウィンドウ スケーリング オプションは、TCP の 3 ウェイ ハンドシェイクの際にのみ使用されます。ウィンドウ スケールの値は、16 ビットのウィンドウ サイズ フィールドを左にシフトするビット数を表します。ウィンドウ スケールに設定できる値は、0 (シフトなし) ~ 14 です。

実際のウィンドウ サイズを計算するには、ウィンドウ サイズに 2^S を掛けます。S はスケール値です。
次に例を示します。
ウィンドウ サイズが 65,535 バイトで、スケーリング ファクタが 3 の場合
実際のウィンドウ サイズ = 65535*2^3
実際のウィンドウ サイズ = 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「The Window field in a SYN (for example, a [SYN] or [SYN,ACK]) segment itself is never scaled」 (SYN セグメント ([SYN] セグメントまたは [SYN,ACK] セグメント) のウィンドウ フィールド自体は、スケーリングの対象にならない) という規定に基づいています。

つまり、3 ウェイ ハンドシェイクの後に送信される最初のデータ パケットが、実際のウィンドウ サイズになります。スケーリング ファクタが存在する場合は、65,535 バイトの初期ウィンドウ サイズが必ず使用されます。その後、ウィンドウ サイズに 3 ウェイ ハンドシェイクで指定されたスケーリング ファクタが掛けられます。以下の表は、さまざまなウィンドウ サイズに対するスケーリング ファクタの境界を示したものです。

スケーリング ファクタスケール値初期ウィンドウスケーリングされたウィンドウ
0165535 以下65535 以下
1265535131,070
2465535262,140
3865535524,280
416655351,048,560
532655352,097,120
664655354,194,240
7128655358,388,480
82566553516,776,960
95126553533,553,920
1010246553567,107,840
11204865535134,215,680
12409665535268,431,360
13819265535536,862,720
1416384655351,073,725,440

次に例を示します。

レジストリのウィンドウ サイズが 10 進数で 269000000 (269 MB) に設定されている場合、3 ウェイ ハンドシェイクの際のスケーリング ファクタは 13 です。これは、スケーリング ファクタ 12 で使用可能なウィンドウ サイズは、最大 268,431,360 (268 MB) バイトまでであるためです。

この例の初期ウィンドウ サイズは、次のように計算されます。
ウィンドウ サイズが 65,535 バイトで、スケーリング ファクタ 13 の場合
実際のウィンドウ サイズ = 65535*2^13
実際のウィンドウ サイズ = 536,862,720
ウィンドウ サイズの値がレジストリに追加され、そのサイズがデフォルト値よりも大きい場合、Windows では新しいウィンドウ サイズに対応したスケール値が使用されます。

次のレジストリ キーに Tcp1323Opts 値を追加すると、スケーリング ウィンドウおよびタイムスタンプを制御できます。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[名前] ボックスに Regedit と入力し、[OK] をクリックしてレジストリ エディタを起動します。
  2. レジストリ エディタで、[編集] メニューの [新規] をポイントし、[DWORD 値] をクリックします。
  3. [New Value #1] ボックスに 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 GB になると十分ではありません。

RTT 計算、PAWS チェックなどの操作を実行するため、スタックによって適切と見なされるセグメント (データおよび ACK) で使用されるように TCP タイムスタンプ オプションを設定できるようになりました。このデータを使用することにより、ウィンドウ サイズが大きい場合でも RTT を正確に計算できます。RTT は再送間隔の計算に使用されます。スループットを最適化するためには、正確な RTT および再送タイムアウトが必要です。

TCP セッションで TCP タイムスタンプが使用されている場合、そのセッションを開始したホストは、TCP の 3 ウェイ ハンドシェイクの最初のパケット (SYN パケット) でこのオプションを送信します。これにより、そのセッション中はどちら側でもこの TCP オプションを使用できるようになります。

TCP タイムスタンプ オプション (TSopt) :

種類 = 8長さ = 10TS 値 (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 (Protection Against Wrapped Sequence) 番号

TCP シーケンス番号フィールドは、32 ビットに制限されています。これによって、使用可能なシーケンス番号の数が制限されます。高容量ネットワークや大量のデータ転送の場合、パケットがネットワークを通過する前にシーケンス番号が一巡する可能性があります。1 Gbps のネットワーク上でのデータ送信では、シーケンス番号がわずか 34 秒で一巡する場合も考えられます。パケットが遅延されると、同じシーケンス番号の別のパケットが存在する可能性が生じます。重複したシーケンス番号による混乱を避けるため、シーケンス番号の拡張子として TCP タイムスタンプが使用されます。パケットには、その生成時に、常時更新されているタイムスタンプの最新の値が割り当てられており、シーケンス番号が重複した場合に、古いタイムスタンプ値を持つ方が古いパケットとして判断されて破棄されます。

SACK (Selective Acknowledgements)

Windows では、パフォーマンスを向上させるための SACK (Selective Acknowledgement) と呼ばれる機能がサポートされています。SACK は、特に、サイズの大きい TCP ウィンドウを使用する接続の場合に重要です。SACK の導入以前には、受信側は、連続して受信したデータ ストリームの最新のシーケンス番号、つまり受信ウィンドウの左端に対する確認応答しか送信できませんでした。SACK を有効にすると、受信側では、従来どおり ACK 番号を使用して受信ウィンドウの左端の確認応答を送信し、さらに受信したデータで連続していないブロックについても確認応答を送信できます。SACK では、以下に示すような TCP ヘッダー オプションを使用します。

SACK では、2 種類の TCP オプションを使用します。

TCP Sack-Permitted オプションは、SYN パケット (TCP 接続の確立時) でのみ使用され、SACK が可能なことを示します。

もう 1 つの TCP オプション、TCP Sack オプションには、1 つ以上のデータ ブロックに対する確認応答が含まれます。データ ブロックの識別には、そのデータ ブロックの先頭と末尾 (データ ブロックの左端と右端) のシーケンス番号が使用されます。

種類 4 は TCP Sack-Permitted オプション、種類 5 は TCP Sack オプションに相当します。長さは、この TCP オプションのバイト長です。

Tcp Sack Permitted オプション :

種類 = 4長さ = 2
1 バイト1 バイト

Tcp SACK オプション :

種類 = 5長さ = 可変
1 バイト最初のブロックの左端から最初のブロックの右端まで
...
N 番目のブロックの左端から N 番目のブロックの右端まで

SACK が有効 (デフォルトの設定) になっている場合、単一のパケットまたは一連のパケットが欠落していると、受信側は送信側に、どのデータを受信したのか、また、データのどの部分が欠落しているのかを通知します。通知を受けた送信側は、既に正常に受信されたデータ ブロックは再送せずに、欠落しているデータだけを選択して再送できます。SACK は、SackOpts レジストリ パラメータによって制御されます。

次のレジストリ キーの SackOpts 値を編集すると、SACK を使用するかどうかを制御できます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[名前] ボックスに Regedit と入力し、[OK] をクリックしてレジストリ エディタを起動します。
  2. レジストリ エディタで上記のキーを見つけてクリックし、[編集] メニューの [修正] をクリックします。
  3. [値のデータ] ボックスに、指定する値を入力します。
: 有効な値は、2 進数の 0 または 1 で、デフォルト値は 1 (有効) です。このパラメータは、SACK (Selective 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 の再送動作と Fast Retransmit

TCP の再送

通常の再送動作では、TCP は、送信する各セグメントを IP (Internet Protocol) に渡すときに再送タイマを開始します。あるセグメント内のデータに対する確認応答を受信する前にタイマがタイムアウトになると、そのセグメントを再送します。

再送タイムアウト (RTO) は、RFC 793 に記載されている SRTT (Smoothed Round Trip Time) の計算を使用して、接続の特性に合わせて動的に調整されます。あるセグメントに対するタイマは、そのセグメントが再送されるたびにタイムアウトまでの時間が 2 倍になります。TCP では、このアルゴリズムを使用して、その接続の通常の遅延時間に応じた調整を自動的に行います。

Fast Retransmit

状況によっては、再転送タイマがタイムアウトになる前に TCP がデータを再転送することがあります。これは、一般に、Fast Retransmit と呼ばれる機能が使用されている場合に発生します。Fast Retransmit をサポートしている受信側のホストが、予期される番号を超えるシーケンス番号のデータを受信した場合には、データの一部が欠落していると推定します。送信側ホストにこれを通知するため、受信側のホストは、ACK 番号に予期されるシーケンス番号を設定して、即座に ACK を送信します。この後も、到着する各 TCP セグメントに対して同様の操作を行います。送信側ホストが、同じシーケンス番号に応答する ACK のストリームを受信し始めた場合には、セグメントが欠落していると推定します。送信側のホストは、再転送タイマのタイムアウトを待つことなく、受信側のホストが予期しているセグメントを即座に再送信します。パケットの欠落が頻繁に発生する場合は、このような最適化によってパフォーマンスが大幅に改善されます。

デフォルトでは、同じシーケンス番号の ACK を 3 つ (通常の ACK とさらに 2 つの ACK) 受信し、そのシーケンス番号が現在の番号より古い番号の場合、Windows ではセグメントが再送されます。この動作は、TcpMaxDupAcks レジストリ パラメータで制御できます。

次のレジストリ キーの TcpMaxDupAcks 値を編集すると、Fast Retransmit の開始に必要な ACK の数を制御できます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  1. [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[名前] ボックスに Regedit と入力し、[OK] をクリックしてレジストリ エディタを起動します。
  2. レジストリ エディタで上記のキーを見つけてクリックし、[編集] メニューの [変更] をクリックします。
  3. [値のデータ] ボックスに、指定する値を入力します。
: 有効な範囲は 1 ~ 3 で、デフォルト値は 2 です。

このパラメータの値により、送信データの同じシーケンス番号に対して重複する ACK を何回受信したときに、Fast Retransmit を開始して転送中に消失したセグメントを再送するのかが決まります。
プロパティ

文書番号:224829 - 最終更新日: 08/08/2006 06:29:00 - リビジョン: 6.1

Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server, Microsoft Windows 2000 Professional, Microsoft Windows 2000 Datacenter Server, Microsoft Windows Server 2003, Enterprise Edition (32-bit x86), Microsoft Windows Server 2003, Standard Edition (32-bit x86), Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)

  • kbinfo kbenv kbnetwork KB224829
フィードバック
ms.js"> ""; document.write("