Zum Hauptinhalt springen

Ab OpenVOS 17.1 unterstützt STCP die TCP-Optionen „Time Stamp“, „Selective Acknowledgment“ und „Window Scaling“. Dies ermöglicht einen effizienteren Datenfluss, wenn TCP-Segmente verloren gehen oder wenn Daten über eine Verbindung mit hoher Bandbreite und hoher Latenz übertragen werden (eine Verbindung über eine Leitung, bei der die Mindestbandbreite * Gesamtlatenz > 65536 ist). Die Auswirkungen dieser Änderungen sind für Anwendungen transparent, doch gibt es einige Punkte, die Sie bei der Verwendung von packet_monitor beachten sollten.

Erstens: Wenn STCP eine Verbindungsanfrage sendet, enthält das TCP-(SYN-)Segment nun 16 zusätzliche 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 (Fenselskala), Gesamtlänge von Option 3 Bytes, Wert 6
4 2 Option 4 (selektive Bestätigung unterstützt), Gesamtlänge 2 Byte
8 a 32 2d v. Chr. 85 0 0 0 0 Option 8 (Zeitstempel), Gesamtlänge 10 Byte, Sendezeit 32 2d bc 85, Empfangszeit 0 0 0 0
0 Option 0 (Ende der Optionen)

Zweitens hängen die in einem Verbindungsantwort-Segment (SYN/ACK) gesendeten Optionen davon ab, was das SYN-Segment des Remote-Hosts enthält. STCP fügt die Option für die selektive Bestätigung nur dann in seine Antwort ein, wenn diese in der Verbindungsanfrage enthalten ist. Die Antwort enthält die Optionen „Window Scale“ und „Time Stamp“ nur dann, wenn die Verbindungsanfrage ebenfalls beide Optionen 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><<

Standardmäßig enthalten Windows-Hosts nur die maximale Segmentgröße, Fenstergröße und unterstützte selektive Bestätigung . Ohne die Zeitstempel-Option in der Verbindungsanfrage enthält die Antwort von STCP weder die Zeitstempel- noch die Fensterskalierungsoptionen. Beachten Sie, dass die in den Windows-Optionen enthaltenen „1“ die NO-OP und dienen dazu, die Anzahl der Optionsbytes auf ein ganzzahliges Vielfaches von 4 zu bringen. Das Vielfache Endes der Optionen (Nullen) am Ende der Optionen in der Antwort von STCP dienen demselben Zweck.

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<<

Verwirrend wird es, nachdem die Verbindung hergestellt wurde. Das folgende Paket enthält nur 1 Byte an Daten, obwohl die Datenbyte 13 anzeigt. Die ersten 12 Bytes sind zwei NO-OP-Optionen, gefolgt von einer Zeitstempel-Option. Das 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 Optionen und Daten unterscheiden? Die X/Off 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, dass drei 32-Bit-Wörter oder 12 weitere Bytes hinzugefügt wurden.

Das nächste Paket ist lediglich eine Bestätigung und enthält keine Daten. Beachten Sie, dass der Offset erneut 8 beträgt, sodass die Option 12 Byte umfasst und die Datenlänge ebenfalls 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 selektiven Bestätigungsoption mit 3 Blöcken von Bestätigungsnummern enthält. Beachten Sie die X/Off -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 Bestätigungsnummer im TCP-Header entspricht dem rechtesten edge fortlaufend empfangenen Bytes. Die Datenblöcke bei der Option „Selektive Bestätigung“ kennzeichnen Datenblöcke, die bereits empfangen wurden. Die Lücken zwischen den Blöcken stehen für Bytes, die noch nicht empfangen wurden.

Das Ganze wäre viel einfacher, wenn `packet_monitor` die Optionen korrekt melden würde, anstatt sie als Daten auszugeben. Der Fehler „stcp-2963“ wurde hinzugefügt, um `packet_monitor` dazu zu bringen, genau das zu tun. Der Fehler soll in einer zukünftigen Version behoben werden; bis dahin müssen Sie auf den Wert von X/Off achten.

Die Option „Window Scale“ ist möglicherweise am verwirrendsten. Das folgende Paket zeigt ein Empfangsfenster von nur 4096 Byte.

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, doch die Größe täuscht, da die Fensterskalierung aktiv ist. Woran erkennt man das? Man kann dies nur feststellen, wenn man den Aufbau der ursprünglichen Verbindung beobachtet hat. Im folgenden Fall ist zu sehen, dass sowohl das SYN- als auch das SYN-ACK-Segment die Option „Window Scaling“ enthalten, und in beiden Fällen beträgt der Skalierungswert 6, sodass die Fenstergröße von 4096 (2^12) im obigen Segment um 6 Bits verschoben wird, was das tatsächliche Fenster von 262144 (2^18 oder 256K) Bytes ergibt.

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 durch STCP-Parameter gesteuert.

als:  list_stcp_params    

STCP-Parameter:

. . . .
kleinste maximale IP-Segmentgröße [500–1480]       (min_mss)               576
. . . .
maximale Sendewindowgröße [4096–1073725440]  (max_send_ws)           1073725440
maximale Anzahl großer Fenster [>=0]                  (max_huge_windows)      0
aktuelle Anzahl großer Fenster                                                0
maximale Anzahl 256k-Fenster [>=0]                  (max_256k_windows)      25
aktuelle Anzahl 256k-Fenster                                                0
. . . . .
TCP RFC-1323-Richtlinie [deaktivieren/zulassen/anfordern] (tcp_rfc_1323_policy)   anfordern
TCP-Fenster-Skalierung [0–14]           (tcp_window_scale)      6
TCP-SACK-Richtlinie [deaktivieren/zulassen/anfordern]     (tcp_SACK_policy)       anfordern

als:

Die tcp_rfc_1323_policy gibt an, ob Zeitstempel verwendet werden. Die möglichen Werte sind disable/allow/request. Der Standardwert request bedeutet, dass die Option Teil eines Verbindungsanforderungssegments ist und, falls in einer empfangenen Verbindungsanforderung angefordert, Teil des Antwortsegments sein wird. Der Wert „allow“ bedeutet, 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. Die Einstellung auf „disable“ bedeutet außerdem, dass die Option „window scale“ nicht Teil des Segments ist.

Die Die Option steuert den Skalierungsparameter. Ein Wert von Null teilt dem Remote-Host mit, dass die Fensterskalierung zwar unterstützt wird, das STCP-Fenster jedoch 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 für selektive Bestätigungen. Die Werte können „disable“, „allow“ und „request“ lauten und haben genau dieselbe Bedeutung wie bei der Option „tcp_rfc_1323_policy“.

Dank der Unterstützung für die Fensterskalierung sind nun Fenster möglich, die größer sind als das bisherige Maximum von 64 KB; daher wurden zwei neue Fenstergrößenpools eingerichtet. Diese spiegeln sich in den Pools „max_256k_windows“ und „max_huge_windows“ wider. Sie können die maximale Anzahl an Sockets, die ein 256-KB-Fenster oder ein noch größeres Fenster anbieten können, anpassen, indem Sie die Werte für „max_256k_windows“ oder „max_huge_windows“ festlegen.

Der Parameter `max_send_ws` spiegelt wider, dass das maximal mögliche Empfangsfenster des Remote-Hosts nun 2^30 beträgt (1073725440 entspricht tatsächlich 2^30 – 2^14). Für einen bestimmten Socket entspricht die tatsächliche maximale Größe des Sendefensters dem kleineren Wert aus dem Parameter `max_send_ws` und der vom Remote-Host gemeldeten Größe des Empfangsfensters.