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
セグメントを使用する割合が高くなっています。
受信ウィンドウ
サイズは、次の方法で決定されます。
- リモート
ホストに最初に送信される接続要求では、受信ウィンドウ
サイズが 16 KB (16,384 バイト)
としてアドバタイズされます。
- 接続が確立されると、受信ウィンドウのサイズは、MSS
の均等な増分値になるように切り上げられます。
- ウィンドウ サイズは、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
- ツール バーの [スタート]
ボタンをクリックし、[ファイル名を指定して実行]
をクリックします。そして、「Regedit」と入力して、レジストリ
エディタを起動します。
- レジストリ エディタで、[編集]
メニューの [新規] をポイントし、[DWORD 値]
をクリックします。
- [新しい値 #1] ボックスに「TcpWindowSize」と入力して
Enter キーを押し、[編集] メニューの [変更]
をクリックします。
- [値のデータ]
ボックスにウィンドウ
サイズを入力します。 注 :
ウィンドウ サイズの有効範囲は、0 から
0x3FFFC000 (16 進数) までです。
この値は、デフォルトでは存在しません。TcpWindowSize
値を追加すると、上で説明したデフォルト
ウィンドウ
サイズのアルゴリズムは無視されます。
注 : TcpWindowSize を Parameters
キーに追加して、すべてのインターフェイスのウィンドウ
サイズをグローバルに設定することもできます。
現在サポートされている TCP
オプション
これまで、TCP
オプションは主として最大セグメント
サイズのネゴシエーションに使用されていました。Windows
2000 および Windows XP では、ウィンドウ
スケーリング、タイムスタンプ、SACK (Selective
ACK) に TCP オプションが使用されます。
TCP オプションには、次の 2 種類があります。
- シングル オクテット TCP
オプション (特定のオプションの種類を示すために使用されます)
- マルチ オクテット 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
- ツール バーの [スタート]
ボタンをクリックし、[ファイル名を指定して実行]
をクリックします。そして、Regedit
と入力してレジストリ
エディタを起動します。
- レジストリ エディタで、[編集]
メニューの [新規] をポイントし、[DWORD 値]
をクリックします。
- [新しい値 #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
- ツール バーの [スタート]
ボタンをクリックし、[ファイル名を指定して実行]
をクリックします。そして、「Regedit」と入力してレジストリ
エディタを起動します。
- レジストリ
エディタで、上記のキーを探してクリックし、[編集]
メニューの [変更] をクリックします。
- [値のデータ]
ボックスに値を入力します。
注 : 有効な 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
- ツール バーの [スタート]
ボタンをクリックし、[ファイル名を指定して実行]
をクリックします。そして、「Regedit」と入力してレジストリ
エディタを起動します。
- レジストリ
エディタで上記のキーを捜してクリックし、[編集]
メニューの [変更] をクリックします。
- [値のデータ]
ボックスに値を入力します。
注 : 有効な範囲は 1
から 3 まで、デフォルト値は 2 です。
このパラメータは、送信データの同じシーケンス番号に対して重複する
ACK
を何回受信したときに、高速再転送を起動して転送中に消失したセグメントを再転送するかどうかを決定します。
|