Ab OpenVOS 17.1 unterstützt STCP die TCP-Optionen Zeitstempel, selektive Quittierung und Fensterskalierung. Dies ermöglicht einen effizienteren Datenfluss, wenn TCP-Segmente verworfen werden oder wenn Daten über eine Verbindung mit hoher Bandbreitenverzögerung gesendet werden (eine Verbindung über eine Verbindung, bei der die minimale Bandbreite * Gesamtlatenz > 65536 ist). Die Auswirkungen dieser Änderungen sind für Anwendungen transparent, aber es gibt ein paar Dinge, die Sie bei der Verwendung von packet_monitor beachten sollten.
Erstens: Wenn STCP eine Verbindungsanforderung sendet, enthält das TCP (SYN)-Segment nun zusätzliche 16 Bytes.
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 | Option 2 (Mindestsegmentgröße), Gesamtlänge der Option 4 Bytes, Wert 05 b4 (1460 dezimal) (diese Bytes sind nicht neu) |
3 3 6 | Option 3 (Fensterskala), Gesamtlänge der Option 3 Bytes, Wert 6 |
4 2 | Option 4 (selektive Quittierung unterstützt), Gesamtlänge 2 Bytes |
8 a 32 2d bc 85 0 0 0 0 | Option 8 (Zeitstempel), Gesamtlänge 10 Bytes, Sendezeit 32 2d bc 85, Rücklaufzeit 0 0 0 0 |
0 | Option 0 (Ende der Optionen) |
Zweitens hängen die Optionen, die in einem Segment der Verbindungsantwort (SYN/ACK) gesendet werden, davon ab, was das SYN-Segment des entfernten Hosts enthält. STCP nimmt die Option "Selective Acknowledgment Supported" nur dann in seine Antwort auf, wenn die Verbindungsanforderung sie enthält. Die Antwort enthält nur dann die Optionen window scale und time stamp, wenn die Verbindungsanforderung beide Optionen ebenfalls enthält.
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-Hosts enthalten standardmäßig nur die maximale Segmentgröße, Fensterskala und Selektive Quittierung unterstützt Optionen. Ohne die Option "Zeitstempel" in der Verbindungsanforderung enthält die STCP-Antwort weder den Zeitstempel noch die Optionen für die Fenstergröße. Beachten Sie, dass die 1en in den Fensteroptionen die NO-OP Option sind und dazu dienen, die Anzahl der Optionsbytes zu einem ganzzahligen Vielfachen von 4 zu machen. Die Vielfachen Ende der Optionen (0) am Ende der Optionen in der STCP-Antwort sind aus demselben Grund.
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<<
|
Der verwirrende Teil kommt, nachdem die Verbindung hergestellt wurde. Das folgende Paket enthält nur 1 Byte an Daten, obwohl im Datenbytes Feld 13 anzeigt. Die ersten 12 Bytes sind zwei NO-OP-Optionen, gefolgt von einer Zeitstempeloption. Die Datenbyte ist das 0x am Ende.
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>`<
|
Wie kann ich den Unterschied zwischen Optionen und Daten erkennen? Der X/Aus Wert ist die Anzahl der 32-Bit-Wörter im TCP-Header. Wenn keine Optionen vorhanden sind, beträgt dieser Wert 5. Ein Wert von 8 bedeutet also eine Addition von drei 32-Bit-Wörtern oder 12 weiteren Bytes.
Dieses nächste Paket ist nur eine Bestätigung, es enthält keine Daten. Beachten Sie, dass der Offset wieder 8 ist, so dass es 12 Bytes an Optionen gibt und die Datenlänge nur 12 beträgt.
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 <> *(]>
|
Das folgende Paket ist ein Beispiel für ein Segment, das eine Selektive Quittierung Option mit 3 Blöcken von Bestätigungsnummern enthält. Beachten Sie den X/Aus Wert von 0f, der auf zusätzliche 40 Bytes ((15 - 5) * 4) im TCP-Header hinweist, die packet_monitor als Datenbytes.
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<{
|
Die Acknowledgment-Nummer im TCP-Header ist die rechte Seite edge der kontinuierlich empfangenen Bytes. Die Datenblöcke in der selektiven Bestätigungsoption zeigen Datenblöcke an, die empfangen wurden. Die Lücken zwischen den Blöcken stehen für Bytes, die nicht empfangen wurden.
Das wäre alles viel einfacher, wenn packet_monitor die Optionen korrekt melden würde, anstatt sie als Daten zu melden. Der Bug stcp-2963 wurde hinzugefügt, damit packet_monitor genau das tut. Der Fehler soll in einer zukünftigen Version behoben werden, bis dahin müssen Sie auf den X/Off-Wert achten.
Die Option "Fensterskala" kann am meisten Verwirrung stiften. Das folgende Paket zeigt eine Empfangsfenster von nur 4096 Bytes.
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<<<
|
Dies ist ein extrem kleines Fenster, aber die Größe ist irreführend, weil die Skalierung des Fensters in Kraft ist. Wie kann man das erkennen? Das kann man nur feststellen, wenn man den ursprünglichen Verbindungsaufbau beobachtet hat. Im folgenden Fall können Sie sehen, dass sowohl das SYN- als auch das SYN-ACK-Segment die Option Fensterskalierung enthalten, und in beiden Fällen ist der Skalierungswert 6, so dass die 4096 (2^12) Fenstergröße im obigen Segment um 6 Bits verschoben wird, um das tatsächliche Fenster von 262144 (2^18 oder 256K) Bytes zu erhalten.
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 >><
|
Diese Optionen werden von den STCP-Parametern gesteuert.
as: list_stcp_params
STCP-Parameter:
. . . .
niedrigste IP maximale Segmentgröße [500-1480] (min_mss) 576
. . . .
maximale Sendefenstergröße [4096-1073725440] (max_send_ws) 1073725440
maximal große Fenster [>=0] (max_huge_windows) 0
aktuelle große Fenster 0
maximal 256k Fenster [>=0] (max_256k_windows) 25
aktuelle 256k-Fenster 0
. . . . .
TCP RFC-1323 Policy [disable/allow/request] (tcp_rfc_1323_policy) request
TCP angeforderte Fenstergröße [0-14] (tcp_window_scale) 6
TCP SACK-Richtlinie [disable/allow/request] (tcp_SACK_policy) Anfrage
as:
|
Die Option tcp_rfc_1323_policy Option gibt an, ob Zeitstempel verwendet werden sollen. Die Parameterwerte sind disable/allow/request. Der Standardwert request bedeutet, dass die Option Teil eines Verbindungsanforderungssegments ist und, falls sie in einer empfangenen Verbindungsanforderung angefordert wird, Teil des Antwortsegments ist. Der Wert allow gibt an, dass die Option nicht Teil eines Verbindungsanforderungssegments ist, aber Teil einer Antwort sein kann, wenn die empfangene Verbindungsanforderung sie enthält. Der Wert disable bedeutet, dass die Option in keinem der beiden Segmenttypen enthalten ist. Wird der Wert auf disable gesetzt, bedeutet dies auch, dass die Option window scale nicht Teil des Segments ist.
Die Option tcp_window_scale Option steuert den Skalierungsparameter. Ein Nullwert teilt dem entfernten Host mit, dass die Skalierung des Fensters unterstützt wird, aber das STCP-Fenster nicht skaliert werden soll.
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
|
Die tcp_sack_policy steuert die Option der selektiven Quittierung. Die Werte können disable, allow und request sein und bedeuten genau dasselbe wie bei der Option tcp_rfc_1323_policy.
Schließlich ist es mit der Unterstützung der Fensterskalierung möglich, Fenster zu haben, die größer sind als die bisherige Höchstgrenze von 64K, so dass zwei neue Fenstergrößen-Pools geschaffen wurden. Diese spiegeln sich in den Pools max_256k_windows und max_huge_windows wider. Sie können die maximale Anzahl der Sockets, die ein 256K-Fenster oder ein noch größeres Fenster anzeigen können, durch die Einstellung der Werte max_256k_windows oder max_huge_windows anpassen.
Der Parameter max_send_ws spiegelt die Tatsache wider, dass das maximal mögliche Empfangsfenster des entfernten Hosts nun 2^30 beträgt (1073725440 ist eigentlich 2^30 - 2^14). Für einen bestimmten Socket ist die tatsächliche maximale Sendefenstergröße das Minimum aus dem max_send_ws-Parameter und der angekündigten Empfangsfenstergröße des entfernten Hosts.