OpenVOS 17.1 以降、STCP はタイムスタンプ、選択的確認応答、およびウィンドウスケーリング TCP オプションをサポートしています。これにより、TCPセグメントがドロップされた場合や、高帯域幅遅延接続(最小帯域幅*全体の遅延時間が65536を超えるリンク上の接続)でデータを送信する場合に、より効率的なデータフローが可能になります。これらの変更の効果はアプリケーションには透過的ですが、Packet_monitorを使用する際に注意すべき点がいくつかあります。
まず、STCPが接続要求を送信するときに、TCP(SYN)セグメントに16バイトが追加されるようになりました。
17:41:26.533 Xmit Ether Dst 00:23:54:52:18:6e Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP Ver/HL 45, ToS 0, Len 3c, ID a789, Flg/Frg 0, TTL 3c, Prtl 6
Cksum f2f6, Src a4984dd9, Dst a4984d32
TCP from 164.152.77.217.55423 to 164.152.77.50.7777
seq 3825990103, ack n.a., window 8192, 20 data bytes, flags Syn.
X/Off 0a, Flags 02, Cksum b717, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b4 3 3 6 4 2 8 a 32 2d bc 85 0 <<<4<<<< <<<2-<>
10 0 0 0 0
|
2 4 5 b4 | オプション 2 (最小セグメントサイズ)、オプション 4 バイトの合計長、値 05 b4 (1460 進数) (これらのバイトは新しいものではありません) |
3 3 6 | オプション 3 (ウィンドウスケール)、オプション 3 バイトの合計長、値 6 |
4 2 | オプション 4(選択的確認応答をサポート)、総長 2 バイト |
8 A 32 2D BC 85 0 0 0 0 0 0 | オプション 8 (タイムスタンプ), 総長 10 バイト, 送信時間 32 2d bc 85, 返却時間 0 0 0 0 0 0 0 |
0 | オプション0 |
第二に、接続応答(SYN/ACK)セグメントで送信されるオプションは、リモートホストのSYNセグメントに何が含まれているかに依存します。STCPは、接続要求に選択的確認応答対応オプションが含まれている場合にのみ、その応答に選択的確認応答対応オプションを含めます。接続要求に両方のオプションが含まれている場合にのみ、応答にはウィンドウスケールとタイムスタンプのオプションが含まれます。
14:31:32.145 Rcvd Ether Dst 00:00:a8:42:34:56 Src 00:00:a8:42:52:22 Type 0800
+(IP)
IP Ver/HL 45, ToS 0, Len 3c, ID 44c, Flg/Frg 0, TTL 3c, Prtl 6
Cksum 95e6, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.65007 to 164.152.77.217.7777
seq 3289184624, ack n.a., window 8192, 20 data bytes, flags Syn.
X/Off 0a, Flags 02, Cksum 91e8, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b4 3 3 6 4 2 8 a 30 b8 95 1a 0 <<<4<<<< <<<08><
10 0 0 0 0 <<<<
14:31:32.146 Xmit Ether Dst 00:00:a8:42:52:22 Src 00:00:a8:42:34:56 Type 0800
+(IP)
IP Ver/HL 45, ToS 0, Len 3c, ID 0, Flg/Frg 0, TTL 3c, Prtl 6
Cksum 9a32, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.65007
seq 3172667591, ack 3289184625, window 8192, 20 data bytes, flags Syn Ack.
X/Off 0a, Flags 12, Cksum 6b81, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b4 3 3 6 4 2 8 a 1 35 72 23 30 <<<4<<<< <<<<5r#0
10 b8 95 1a 0 8><<
|
デフォルトでは、Windows ホストは最大セグメントサイズのみを含めます。 ウィンドウスケールと セレクティブ・アクノリッジ対応オプションを含んでいます。接続要求にタイムスタンプオプションがなければ、STCPの応答にはタイムスタンプとウィンドウズスケールのオプションは含まれません。Windowのオプションに含まれる1がオプションであることに注意してください。 NO-OPオプションで、オプションのバイト数を4の整数倍にするために使用されます。 オプションの終了(STCPのリプライのオプションの末尾にある0も同じ理由です。
14:54:02.635 Rcvd Ether Dst 00:00:a8:41:34:56 Src 00:23:54:52:18:6e Type 0800
+(IP)
IP Ver/HL 45, ToS 0, Len 34, ID a4f, Flg/Frg 4000, TTL 80, Prtl 6
Cksum 0c39, Src a4984d32, Dst a4984dd9
TCP from 164.152.77.50.13478 to 164.152.77.217.7777
seq 3499417963, ack n.a., window 8192, 12 data bytes, flags Syn.
X/Off 08, Flags 02, Cksum 65c8, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b8 1 3 3 8 1 1 4 2 <<<8<<<< <<<<
14:54:02.636 Xmit Ether Dst 00:23:54:52:18:6e Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP Ver/HL 45, ToS 0, Len 30, ID b3d5, Flg/Frg 0, TTL 3c, Prtl 6
Cksum e6b6, Src a4984dd9, Dst a4984d32
TCP from 164.152.77.217.7777 to 164.152.77.50.13478
seq 3986949958, ack 3499417964, window 8192, 8 data bytes, flags Syn Ack.
X/Off 07, Flags 12, Cksum 85e0, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b4 4 2 0 0 <<<4<<
|
紛らわしいのは、接続が確立された後です。にもかかわらず、次のパケットには1バイトのデータしか含まれていません。 データバイトフィールドには13と書かれています。最初の12バイトは2つのNO-OPオプションとタイムスタンプオプションです。この後にタイムスタンプオプションが続きます。 データバイトは末尾の0xです。
15:02:36.545 Rcvd Ether Dst 00:00:a8:41:34:56 Src 00:00:a8:42:52:22 Type 0800
+(IP)
IP Ver/HL 45, ToS 0, Len 35, ID 447, Flg/Frg 0, TTL 3c, Prtl 6
Cksum 95f2, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.60312 to 164.152.77.217.7777
seq 2814493687, ack 4102208833, window 128, 13 data bytes, flags Push Ack
+.
X/Off 08, Flags 18, Cksum c9d0, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 1 1 8 a 2a 28 5d 8f 38 9f e0 a 0 <<<<*(]> 8>`<
|
オプションとデータの違いを見分けるには?オプションとデータの違いを見分けるには X/オフの値は、TCPヘッダの32ビット・ワードの数です。オプションがない場合、この値は5ですので、8の値は32ビットワードを3つ追加したことを示すか、12バイトを追加したことを示します。
この次のパケットは単なる確認応答であり、データは含まれていません。オフセットは再び 8 であるので、12 バイトのオプションがあり、データ長はちょうど 12 であることに注意してください。
15:02:39.758 Xmit Ether Dst 00:00:a8:42:52:22 Src 00:00:a8:41:34:56 Type 0800
+(IP)
IP Ver/HL 45, ToS 0, Len 34, ID 48a, Flg/Frg 0, TTL 3c, Prtl 6
Cksum 95b0, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.60312
seq 4102208833, ack 2814493688, window 128, 12 data bytes, flags Ack.
X/Off 08, Flags 10, Cksum a751, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 1 1 8 a 38 a0 2 91 2a 28 5d 8f <<<<8 <> *(]>
|
次のパケットは、セグメントの例です。 選択的承認オプションを使用して、確認応答番号の3ブロックを指定することができます。オプションに注意してください。 X/オフ値 0f は、TCP ヘッダに 40 バイト ((15 - 5) * 4) が追加されたことを示します。 データバイト.
9:52:39.491 Rcvd Ether Dst 00:00:a8:41:34:56 Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP Ver/HL 45, ToS 60, Len 50, ID 59, Flg/Frg 0, TTL 35, Prtl 6
Cksum 4355, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
seq 1652086450, ack 3779437719, window 4096, 40 data bytes, flags Ack.
X/Off 0f, Flags 10, Cksum c834, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 1 1 8 a 2 9e 86 bd 3c 4b dd 57 1 1 5 1a <<<<<<<< >K<W<<<<
10 e1 45 f6 77 e1 45 f8 83 e1 45 f2 5f e1 45 f4 6b <E<w<E<< <E<_<E<k
20 e1 45 c9 6f e1 45 cb 7b <E<o<E<{
|
TCPヘッダーの確認応答番号は、連続受信バイトの右端エッジ 。選択的確認応答オプションのデータブロックは、受信されたデータのブロックを示します。ブロック間のギャップは、未受信のバイトを表します。
もし packet_monitor がオプションをデータとして報告するのではなく、正しく報告してくれれば、これはもっとシンプルになるでしょう。stcp-2963 というバグが追加されました。このバグは将来のリリースで修正される予定ですが、それまではX/Offの値に注意を払う必要があります。
ウィンドウスケールオプションは、最も混乱を招く可能性があります。次のパケットでは 受信ウィンドウわずか4096バイトの
9:52:38.975 Rcvd Ether Dst 00:00:a8:41:34:56 Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP Ver/HL 45, ToS 60, Len 34, ID 8, Flg/Frg 0, TTL 35, Prtl 6
Cksum 43c2, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
seq 1652086450, ack 3779392131, window 4096, 12 data bytes, flags Ack.
X/Off 08, Flags 10, Cksum a3cf, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 1 1 8 a 2 9e 86 39 3c 4b dc e3 <<<<<>><K<<<
|
これは非常に小さなウィンドウですが、ウィンドウのスケーリングが行われているため、このサイズは誤解を招くことになります。どうやってわかるのでしょうか?識別する唯一の方法は、最初の接続設定を観察することです。次の例では、SYN と SYN-ACK セグメントの両方に ウィンドウスケーリングオプションを指定した場合、どちらの場合もスケール値は 6 なので、上のセグメントの 4096 (2^12) のウィンドウサイズを 6 ビットシフトして 262144 (2^18 または 256K) バイトの実際のウィンドウが得られます。
9:52:38.818 Rcvd Ether Dst 00:00:a8:41:34:56 Src 00:04:96:52:21:6f Type 0800
+ (IP)
IP Ver/HL 45, ToS 60, Len 3c, ID 5, Flg/Frg 0, TTL 35, Prtl 6
Cksum 43bd, Src 866fc8b9, Dst a4984dd9
TCP from 134.111.200.185.ftp-data to 164.152.77.217.53828
seq 1652086449, ack n.a., window 8192, 20 data bytes, flags Syn.
X/Off 0a, Flags 02, Cksum 29fd, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 2 18 3 3 6 4 2 8 a 2 9e 86 11 0 <<<<<<<< <<<<>><
10 0 0 0 0
9:52:38.819 Xmit Ether Dst 00:13:d4:59:7a:da Src 00:00:a8:41:34:56 Type 0800
+ (IP)
IP Ver/HL 45, ToS 0, Len 3c, ID a, Flg/Frg 0, TTL 3c, Prtl 6
Cksum 3d18, Src a4984dd9, Dst 866fc8b9
TCP from 164.152.77.217.53828 to 134.111.200.185.ftp-data
seq 3779391082, ack 1652086450, window 8192, 20 data bytes, flags Syn Ack
+.
X/Off 0a, Flags 12, Cksum 3b87, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b4 3 3 6 4 2 8 a 3c 4b dc cf 2 <<<<<<<< <<<<<K<
10 9e 86 11 0 >><
|
これらのオプションは、STCPパラメータの制御下にあります。
as: list_stcp_params
STCP パラメータ。
.. . .
最小IP最大セグメントサイズ [500-1480] (min_mss) 576
.. . .
最大送信ウィンドウサイズ [4096-1073725440] (max_send_ws) 1073725440
最大巨大windows [>=0] (max_huge_windows) 0
現在の巨大windows 0
最大 256kwindows [>=0] (max_256k_windows) 25
現在の 256kwindows 0
.. . . .
TCP RFC-1323 ポリシー [disable/allow/request] (tcp_rfc_1323_policy) リクエスト
TCPが要求したウィンドウのスケール[0-14] (tcp_window_scale) 6
TCP SACK ポリシー [disable/allow/request] (tcp_SACK_policy) リクエスト
として。
|
仝 tcp_rfc_1323_policyオプションは、タイムスタンプを使用するかどうかを示します。パラメータ値は disable/allow/request です。request のデフォルト値は、このオプションが接続要求セグメントの一部であり、受信した接続要求で要求された場合には返信セグメントの一部となることを示します。allow の値は、オプションが接続要求セグメントの一部ではなく、受信した接続要求に含まれている場合には返信セグメントの一部になる可能性があることを示します。disable にすると、オプションはどちらのタイプのセグメントにも含まれないことを示します。disable に設定すると、ウィンドウスケールオプションがセグメントに含まれないことを示します。
仝 tcp_window_scaleオプションは、スケーリングパラメータを制御します。0の値を指定すると、リモートホストにウィンドウのスケーリングがサポートされていることを伝えますが、STCPのウィンドウをスケーリングすることはできません。
15:48:43.409 Rcvd IP Ver/HL 45, ToS 0, Len 3c, ID 450, Flg/Frg 0, TTL 3
+c, Prtl 6
Cksum 95e2, Src a4984d80, Dst a4984dd9
TCP from 164.152.77.128.65410 to 164.152.77.217.7777
seq 1987362195, ack n.a., window 8192, 20 data bytes, flags Syn.
X/Off 0a, Flags 02, Cksum b8b3, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b4 3 3 6 4 2 8 a 30 ca ac 69 0 <<<4<<<< <<<0J,i
10 0 0 0 0
15:48:48.575 Xmit IP Ver/HL 45, ToS 0, Len 3c, ID 2, Flg/Frg 0, TTL 3
+c, Prtl 6
Cksum 9a30, Src a4984dd9, Dst a4984d80
TCP from 164.152.77.217.7777 to 164.152.77.128.65410
seq 3853608469, ack 1987362196, window 8192, 20 data bytes, flags Syn Ack.
X/Off 0a, Flags 12, Cksum c550, Urg-> 0000
offset 0 . . . 4 . . . 8 . . . C . . . 0...4... 8...C...
0 2 4 5 b4 3 3 0 4 2 8 a 1 47 89 66 30 <<<4<< < <<<<G>f0
10 ca ac 69 0 J,i
|
仝 tcp_sack_policyは選択的確認応答オプションを制御します。値は disable, allow, request があり、tcp_rfc_1323_policy オプションと全く同じ意味になります。
最後に、ウィンドウのスケーリングをサポートすることで、windows を以前の最大 64K よりも大きくすることが可能になりましたので、2 つの新しいウィンドウサイズプールが作成されました。これらは max_256k_windows と max_huge_windows プールに反映されています。max_256k_windows や max_huge_windows の値を設定することで、256K のウィンドウやさらに大きなウィンドウを広告できるソケットの最大数を調整することができます。
max_send_wsパラメータは、リモートホストの最大受信ウィンドウサイズが2^30(1073725440は実際には2^30 - 2^14)になったことを反映しています。ソケットの最大送信ウィンドウサイズは、max_send_wsパラメータとリモートホストがアドバタイズした受信ウィンドウサイズの最小値になります。