よくあるお問い合わせについてのサポート情報

 
 Windows XP の TCP 機能の説明
 Windows XP の TCP 機能についてご説明します。
  • TCP ウィンドウ サイズ
  • 現在サポートされている TCP オプション
  • ウィンドウ スケーリング - RFC 1323
  • タイムスタンプ - RFC 1323
  • 重複シーケンス番号に対する保護 (PAWS)
  • SACKS (Selective Acknowledgments) - RFC 2018
  • TCP の再転送動作と高速再転

この資料では、各機能の概要と、レジストリ内でこれらの機能を変更する方法について説明します。

重要 : この資料には、レジストリの編集方法が記載されています。万一に備えて、編集の前には必ずレジストリの復元方法を理解しておいてください。復元方法の詳細については、Regedit.exe のヘルプ トピック「レジストリを復元する」、または Regedt32.exe のヘルプ トピック「レジストリ キーを復元する」を参照してください。

警告 : レジストリ エディタの使い方を誤ると、深刻な問題が発生することがあります。最悪の場合、オペレーティング システムの再インストールが必要になることがあります。弊社では、レジストリ エディタの誤用により発生した問題に関しては、一切責任を負わないものとします。レジストリ エディタは、自己の責任においてご使用ください。

レジストリの編集方法の詳細については、Regedit.exe のヘルプの「キーと値の変更」または「キーと値を変更する」を参照してください。または Regedt32.exe のヘルプの「レジストリ情報の追加と削除」または「レジストリの情報を追加または削除する」、および「レジストリ情報の編集」または「レジストリ情報を編集する」を参照してください。レジストリの編集を行う前に、必ずレジストリのバックアップをとってください。Windows NT または Windows 2000 を実行している場合、システム修復ディスク (ERD) も更新する必要があります。

詳細

TCP ウィンドウ サイズ

TCP 受信ウィンドウのサイズは、接続中にバッファに格納できる受信データの量 (バイト数) です。送信ホストが受信ホストからの確認応答やウィンドウ更新を待機する前に送信できるデータは、この量に制限されます。Windows 2000 および Window XP の TCP/IP スタックは、ほとんどの環境でセルフ チューニングが可能なように設計されており、以前のバージョンよりもデフォルト ウィンドウ サイズが大きくなっています。

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

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

  1. リモート ホストに最初に送信される接続要求では、受信ウィンドウ サイズが 16 KB (16,384 バイト) としてアドバタイズされます。
  2. 接続が確立されると、受信ウィンドウのサイズは、MSS の均等な増分値になるように切り上げられます。
  3. ウィンドウ サイズは、MSS の 4 倍に調整されます。ウィンドウ スケーリング オプション (RFC 1323) が有効でない限り、最大サイズは 64 KB になります。
: 後述の「ウィンドウ スケーリング」を参照してください。
 
イーサネット接続の場合、ウィンドウ サイズは通常 17,520 バイト (16KB のサイズを を 1460 バイトのセグメント 12 個分に切り上げた値) に設定されます。SACKS (Selective Acknowledgments) やタイムスタンプなどの拡張 TCP ヘッド オプションがサポートされているコンピュータへの接続を確立すると、ウィンドウ サイズが小さくなる場合があります。この 2 つのオプションでは、TCP ヘッダーのサイズが 20 バイトより大きくなり、データ用の領域が少なくなるためです。

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

受信ウィンドウ サイズを特定の値に設定するには、次のレジストリ キーに TcpWindowSize 値を追加します。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
  1. ツール バーの [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。そして、「Regedit」と入力して、レジストリ エディタを起動します。
  2. レジストリ エディタで、[編集] メニューの [新規] をポイントし、[DWORD 値] をクリックします。
  3. [新しい値 #1] ボックスに「TcpWindowSize」と入力して Enter キーを押し、[編集] メニューの [変更] をクリックします。
  4. [値のデータ] ボックスにウィンドウ サイズを入力します。 : ウィンドウ サイズの有効範囲は、0 から 0x3FFFC000 (16 進数) までです。
この値は、デフォルトでは存在しません。TcpWindowSize 値を追加すると、上で説明したデフォルト ウィンドウ サイズのアルゴリズムは無視されます。

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

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

これまで、TCP オプションは主として最大セグメント サイズのネゴシエーションに使用されていました。Windows 2000 および Windows XP では、ウィンドウ スケーリング、タイムスタンプ、SACK (Selective ACK) に TCP オプションが使用されます。

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 Acks) を使用できることをほかのホストに通知します。

種類 : 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 「SYS セグメント ([SYS] セグメントまたは [SYS,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) バイトまでとなっているためです。

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

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

送信されるすべてのセグメントおよび受信されるすべての ACK で RTT の計算に使用するために、TCP タイムスタンプ オプションを設定できるようになりました。このデータを使用することにより、ウィンドウ サイズが大きい場合でも RTT を正確に計算できます。RTT は再転送間隔の計算に使用されます。最適なスループットには、正確な RTT および再転送タイムアウトが必要です。

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

TCP タイムスタンプ オプション (TSopt):
種類 = 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 タイムスタンプが使用されます。パケットは現在カウントが進行しているタイムスタンプを持ち、古いタイムスタンプを持つ古いパケットは破棄されます。

SACKS (Selective Acknowledgements)

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

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

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

もう 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」と入力してレジストリ エディタを起動します。
  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 の再転送動作と高速再転送

TCP 再転送

通常の再転送動作の復習すると、TCP は各発信セグメントがインターネット プロトコル (IP) に渡されるときに再転送タイマを開始します。あるセグメント内のデータに対する確認応答が受信される前にタイマがタイムアウトになると、そのセグメントは再転送されます。

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

高速再転送

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

デフォルトでは、同じシーケンス番号の 3 つの ACK (1 つの ACK と 2 つのコピー) を受信し、そのシーケンス番号が現在の番号より遅れている場合、Windows 2000 および Windows XP がセグメントを再送信します。この動作は、TcpMaxDupAcks レジストリ パラメータで制御できます。

次のレジストリ キーの TcpMaxDupAcks 値を編集すると、高速再転送の開始に必要な ACK の数を制限できます。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
  1. ツール バーの [スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。そして、「Regedit」と入力してレジストリ エディタを起動します。
  2. レジストリ エディタで上記のキーを捜してクリックし、[編集] メニューの [変更] をクリックします。
  3. [値のデータ] ボックスに値を入力します。
: 有効な範囲は 1 から 3 まで、デフォルト値は 2 です。

このパラメータは、送信データの同じシーケンス番号に対して重複する ACK を何回受信したときに、高速再転送を起動して転送中に消失したセグメントを再転送するかどうかを決定します。


 

WindowsXP よくあるお問い合わせ トップページに戻る