Pular para o conteúdo principal

A partir do OpenVOS 17.1, o STCP suporta as opções de carimbo de tempo, reconhecimento seletivo e escala de janela TCP. Isto permitirá um fluxo de dados mais eficiente quando os segmentos TCP são descartados ou quando o envio de dados sobre uma conexão de alta largura de banda retarda (uma conexão sobre um link onde a largura de banda mínima * latência geral > 65536). O efeito destas mudanças é transparente para as aplicações, mas há algumas coisas que você deve estar ciente ao usar o packet_monitor.

Primeiro, quando a STCP envia um pedido de conexão, o segmento TCP (SYN) conterá agora 16 bytes adicionais.

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 opção 2 (tamanho mínimo do segmento), comprimento total da opção 4 bytes, valor 05 b4 (1460 decimal) (estes bytes não são novos)
3 3 6 opção 3 (escala de janela), comprimento total da opção 3 bytes, valor 6
4 2 opção 4 (reconhecimento seletivo suportado), comprimento total 2 bytes
8 a 32 2d bc 85 0 0 0 0 0 opção 8 (carimbo de tempo), duração total 10 bytes, tempo de envio 32 2d bc 85, tempo de retorno 0 0 0 0
0 opção 0 (fim das opções)

Em segundo lugar, as opções enviadas em um segmento de resposta de conexão (SYN/ACK) dependerão do que o segmento SYN do host remoto contém. O STCP incluirá a opção de reconhecimento seletivo suportado em sua resposta somente se o pedido de conexão a incluir. A resposta só incluirá a escala de janela e opções de carimbo de tempo se a solicitação de conexão também incluir ambas as opções.

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 padrão, os hosts Windows incluem apenas o tamanho máximo do segmento, escala de janela e reconhecimento seletivo apoiado opções. Sem a opção de carimbo de hora na solicitação de conexão a resposta do STCP não incluirá as opções de carimbo de hora ou escala de janela. Observe que os 1's incluídos nas opções da Janela são as opções de NO-OP e são usados para fazer do número de bytes de opção um múltiplo inteiro de 4. fim das opções (0's) no final das opções na resposta da STCP são pela mesma razão.

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

A parte confusa vem depois que a conexão é estabelecida. O pacote a seguir contém apenas 1 byte de dados, mesmo que a bytes de dados campo diz 13. Os primeiros 12 bytes são duas opções NO-OP seguidas de uma opção de carimbo de tempo. O byte de dados é o 0x no 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>`<

Como posso saber a diferença entre opções e dados? O X/Off é o número de palavras de 32 bits no cabeçalho do TCP. Se não houver opções, este valor é 5, portanto um valor de 8 indica uma adição de três palavras de 32 bits ou mais 12 bytes.

Este próximo pacote é apenas um reconhecimento, ele não contém dados. Note que o offset é novamente 8, portanto há 12 bytes de opção e o comprimento dos dados é apenas 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 <> *(]>

O seguinte pacote é um exemplo de um segmento que contém um reconhecimento seletivo opção com 3 blocos de números de reconhecimento. Observe a opção X/Off valor de 0f indicando 40 bytes adicionais ((15 - 5) * 4) no cabeçalho TCP que o packet_monitor informa como bytes de dados.

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

O número de reconhecimento no cabeçalho do TCP é o mais correto edge de bytes recebidos continuamente. Os blocos de dados na opção de confirmação seletiva indicam os blocos de dados que foram recebidos. As lacunas entre os blocos representam os bytes que não foram recebidos.

Tudo isso seria muito mais simples se o packet_monitor relatasse corretamente as opções em vez de relatá-las como dados. O bug stcp-2963 foi adicionado para fazer com que o packet_monitor fizesse exatamente isso. O bug está programado para ser corrigido em um lançamento futuro, até lá você precisa prestar atenção ao valor X/Off.

A opção de escala de janela tem o potencial de ser a mais confusa. O pacote a seguir mostra um janela de recepção de apenas 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 é uma janela extremamente pequena, mas o tamanho é enganoso porque a escala da janela está em vigor. Como você pode saber? A única maneira de saber é ter observado a conexão inicial estabelecida. No caso seguinte, você pode ver que tanto o segmento SYN como o SYN-ACK incluem o escala de janela e, em ambos os casos, o valor da escala é 6, portanto o tamanho da janela 4096 (2^12) no segmento acima é deslocado por 6 bits para dar a janela real de 262144 (2^18 ou 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                                       >><

Essas opções estão sob o controle dos parâmetros STCP.

como: list_stcp_params    

Parâmetros STCP:

. . . .
menor tamanho de segmento IP máximo [500-1480] (min_mss) 576
. . . .
tamanho máximo da janela de envio [4096-107373725440] (max_send_ws) 1073725440
janelas enormes máximas [>=0] (max_huge_windows) 0
janelas enormes atuais 0
máximo 256k janelas [>=0] (max_256k_janelas) 25
janelas atuais de 256k 0
. . . . .
TCP RFC-1323 Política [desabilitar/permitir/pedir] (tcp_rfc_1323_policy) solicitação
Escala de janela TCP solicitada [0-14] (tcp_window_scale) 6
Política TCP SACK [desativar/permitir/pedir] (tcp_SACK_policy) solicitação

como:

O tcp_rfc_1323_policy indica se serão usados carimbos de tempo. Os valores dos parâmetros são desabilitar/permitir/pedir/pedir. O padrão de solicitação indica que a opção faz parte de um segmento de solicitação de conexão e, se solicitado em uma solicitação de conexão recebida, fará parte do segmento de resposta. Um valor de permissão indica que a opção não fará parte de um segmento de pedido de conexão, mas pode fazer parte de uma resposta, se o pedido de conexão recebido a incluir. A desativação indica que a opção não fará parte de nenhum dos tipos de segmento. A definição do valor para desativar também indica que a opção de escala de janela não fará parte do segmento.

O tcp_escala_de_janela controla o parâmetro de escalonamento. Um valor zero diz ao host remoto que a escala de janela é suportada, mas não para escalar a janela do 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

O tcp_sack_policy controla a opção de reconhecimento seletivo. Os valores podem ser desativados, permitidos e solicitados e significam exatamente a mesma coisa que eles fazem para a opção tcp_rfc_1323_policy.

Finalmente, com suporte de escala de janela é possível ter janelas maiores do que o máximo anterior de 64K , portanto, duas novas piscinas de tamanho de janela foram criadas. Estes se refletem nas janelas max_256k_windows e max_huge_windows pools. É possível ajustar o número máximo de soquetes que podem anunciar uma janela de 256K ou uma janela ainda maior definindo os valores max_256k_windows ou max_huge_windows.

O parâmetro max_send_ws reflete o fato de que a janela de recepção máxima possível do host remoto é agora 2^30 (1073725440 é na verdade 2^30 - 2^14). Para um determinado soquete, o tamanho máximo real da janela de envio é o mínimo do parâmetro max_send_ws e os hosts remotos anunciados recebem o tamanho da janela.

© 2024 Stratus Technologies.