Zum Hauptinhalt springen

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.

© 2020 Stratus Technologies.