Ir al contenido principal

A partir de OpenVOS 17.1, STCP soporta la marca de tiempo, el reconocimiento selectivo y las opciones de escalado de ventanas TCP. Esto permitirá un flujo de datos más eficiente cuando se caigan los segmentos TCP o cuando se envíen datos a través de una conexión de gran ancho de banda con retardo (una conexión a través de un enlace en el que el ancho de banda mínimo * latencia total > 65536). El efecto de estos cambios es transparente para las aplicaciones, pero hay algunas cosas que debe tener en cuenta cuando utilice packet_monitor.

En primer lugar, cuando STCP envíe una solicitud de conexión, el segmento TCP (SYN) contendrá ahora 16 bytes adicionales.

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 opción 2 (tamaño mínimo del segmento), longitud total de la opción 4 bytes, valor 05 b4 (1460 decimal) (estos bytes no son nuevos)
3 3 6 opción 3 (escala de ventana), longitud total de la opción 3 bytes, valor 6
4 2 opción 4 (se admite el reconocimiento selectivo), longitud total 2 bytes
8 a 32 2d bc 85 0 0 0 0 opción 8 (sello de tiempo), longitud total 10 bytes, tiempo de envío 32 2d bc 85, tiempo de retorno 0 0 0 0
0 opción 0 (fin de las opciones)

En segundo lugar, las opciones enviadas en un segmento de respuesta de conexión (SYN/ACK) dependerán de lo que contenga el segmento SYN del host remoto. STCP incluirá la opción de acuse de recibo selectivo soportada en su respuesta sólo si la solicitud de conexión la incluye. La respuesta sólo incluirá las opciones de escala de ventana y marca de tiempo si la solicitud de conexión también incluye ambas opciones.

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

Por defecto, los hosts de Windows sólo incluyen el tamaño máximo del segmento, escala de la ventana y reconocimiento selectivo apoyado opciones. Sin la opción de marca de tiempo en la solicitud de conexión, la respuesta de STCP no incluirá las opciones de marca de tiempo o escala de ventana. Tenga en cuenta que los 1 incluidos en las opciones de la ventana son los NO-OP y se utilizan para hacer que el número de bytes de opción sea un múltiplo entero de 4. El múltiplo fin de las opciones (0's) al final de las opciones en la respuesta de STCP son por la misma razón.

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

La parte confusa viene después de que se establece la conexión. El siguiente paquete contiene sólo 1 byte de datos aunque el bytes de datos El campo dice 13. Los primeros 12 bytes son dos opciones de NO-OP seguidas de una opción de marca de tiempo. El byte de datos es el 0x al final.

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

¿Cómo puedo diferenciar entre opciones y datos? El X/Off El valor es el número de palabras de 32 bits en el encabezado TCP. Si no hay opciones, este valor es 5, por lo que un valor de 8 indica una adición de tres palabras de 32 bits o 12 bytes más.

El siguiente paquete es sólo un reconocimiento, no contiene datos. Observe que el desplazamiento es de nuevo 8, por lo que hay 12 bytes de opción y la longitud de los datos es sólo 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 <> *(]>

El siguiente paquete es un ejemplo de un segmento que contiene una reconocimiento selectivo con 3 bloques de números de reconocimiento. Observe el X/Off valor de 0f que indica 40 bytes adicionales ((15 - 5) * 4) en el encabezado TCP que packet_monitor informa como bytes de datos.

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

El número de acuse de recibo en la cabecera TCP es el más a la derecha edge de los bytes recibidos continuamente. Los bloques de datos en la opción de acuse de recibo selectivo indican bloques de datos que se han recibido. Los espacios entre los bloques representan los bytes que no se han recibido.

Todo esto sería mucho más sencillo si packet_monitor informara correctamente de las opciones en lugar de informarlas como datos. Se ha añadido el error stcp-2963 para hacer que packet_monitor haga precisamente eso. El error está programado para ser corregido en una futura versión, hasta entonces debe prestar atención al valor X/Off.

La opción de la escala de ventana tiene el potencial de ser la más confusa. El siguiente paquete muestra un ventana de recepción de sólo 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<<<

Esta es una ventana extremadamente pequeña pero el tamaño es engañoso porque la escala de la ventana está en efecto. ¿Cómo puedes saberlo? La única forma de saberlo es haber observado la conexión inicial establecida. En el siguiente caso se puede ver que tanto el segmento SYN como el SYN-ACK incluyen el escalado de la ventana y en ambos casos el valor de la escala es 6, de modo que el tamaño de la ventana de 4096 (2^12) en el segmento anterior se desplaza en 6 bits para dar la ventana real de 262144 (2^18 o 256K) bytes.

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

Estas opciones están bajo el control de los parámetros de STCP.

as: list_stcp_params    

Parámetros de STCP:

. . . .
Tamaño máximo del segmento IP más bajo [500-1480] (min_mss) 576
. . . .
tamaño máximo de la ventana de envío [4096-1073725440] (max_send_ws) 1073725440
máximo de ventanas enormes [>=0] (max_huge_windows) 0
actuales enormes ventanas 0
máximo 256k ventanas [>=0] (max_256k_windows) 25
actual 256k ventanas 0
. . . . .
Política TCP RFC-1323 [desactivar/permitir/solicitar] (tcp_rfc_1323_policy) solicitud
Escala de la ventana solicitada por el TCP [0-14] (tcp_window_scale) 6
Política TCP SACK [desactivar/permitir/solicitar] (tcp_SACK_policy) solicitud

como:

El tcp_rfc_1323_policy indica si se utilizarán las marcas de tiempo. Los valores de los parámetros son deshabilitar/permitir/solicitar. El valor por defecto de la solicitud indica que la opción forma parte de un segmento de solicitud de conexión y si se solicita en una solicitud de conexión recibida formará parte del segmento de respuesta. El valor de allow indica que la opción no formará parte de un segmento de solicitud de conexión, pero puede formar parte de una respuesta, si la solicitud de conexión recibida la incluye. El valor de deshabilitar indica que la opción no formará parte de ninguno de los dos tipos de segmento. El valor de deshabilitar también indica que la opción de escala de la ventana no formará parte del segmento.

El tcp_escala_ventana controla el parámetro de escala. Un valor cero indica al host remoto que se admite el escalado de la ventana pero no para escalar la ventana de 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

El tcp_sack_policy controla la opción de reconocimiento selectivo. Los valores pueden ser deshabilitados, permitidos y solicitados y significan exactamente lo mismo que para la opción tcp_rfc_1323_policy.

Finalmente, con el apoyo de la escalada de ventanas es posible tener ventanas más grandes que el máximo anterior de 64K , por lo que se han creado dos nuevos grupos de tamaño de ventana. Estos se reflejan en los pools de max_256k_windows y max_huge_windows. Se puede ajustar el número máximo de sockets que pueden anunciar una ventana de 256K o una ventana aún más grande estableciendo los valores max_256k_windows o max_huge_windows.

El parámetro max_send_ws refleja el hecho de que el máximo posible de la ventana de recepción del host remoto es ahora 2^30 (1073725440 es en realidad 2^30 - 2^14). Para un socket dado el tamaño máximo real de la ventana de envío con ser el mínimo del parámetro max_send_ws y los hosts remotos anunciados reciben el tamaño de la ventana.