Pular para o conteúdo principal

A partir do OpenVOS 17.1, o STCP suporta as opções TCP de carimbo de data/hora, reconhecimento seletivo e dimensionamento de janela. Isso permitirá um fluxo de dados mais eficiente quando segmentos TCP forem descartados ou ao enviar dados por uma conexão com alto atraso de largura de banda (uma conexão por um link em que a largura de banda mínima * latência geral > 65536). O efeito dessas alterações é transparente para os aplicativos, mas há algumas coisas que você deve saber ao usar o packet_monitor.

Primeiro, quando o STCP envia uma solicitação de conexão, o segmento TCP (SYN) agora conterá 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) (esses bytes não são novos)
3 3 6 opção 3 (escala da janela), comprimento total da opção 3 bytes, valor 6
4 2 opção 4 (confirmação seletiva suportada), comprimento total de 2 bytes
8 a 32 2d a.C. 85 0 0 0 0 opção 8 (carimbo de data/hora), comprimento total 10 bytes, hora de envio 32 2d bc 85, hora 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 conteúdo do segmento SYN do host remoto. O STCP incluirá a opção de reconhecimento seletivo suportada em sua resposta somente se a solicitação de conexão a incluir. A resposta incluirá as opções de escala de janela e carimbo de data/hora somente 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 suportados . Sem a opção de carimbo de data/hora na solicitação de conexão, a resposta do STCP não incluirá as opções de carimbo de data/hora ou escala de janela. Observe que os 1 incluídos nas opções da janela são as opções NO-OP e são usados para tornar o número de bytes da opção um múltiplo inteiro de 4. O múltiplo final das opções (0) no final das opções na resposta do STCP tem a 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, embora os campo bytes de dados indique 13. Os primeiros 12 bytes são duas opções NO-OP seguidas por uma opção de carimbo de data/hora. 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 distinguir entre opções e dados? O valor X/Off é o número de palavras de 32 bits no cabeçalho TCP. Se não houver opções, esse valor é 5, portanto, um valor de 8 indica uma adição de três palavras de 32 bits ou mais 12 bytes.

O próximo pacote é apenas um reconhecimento, não contém dados. Observe que o deslocamento é 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 pacote a seguir é um exemplo de um segmento que contém um opção de reconhecimento seletivo com 3 blocos de números de confirmação. Observe o valor X/Off de 0f, que indica 40 bytes adicionais ((15 – 5) * 4) no cabeçalho TCP, que o packet_monitor relata 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 TCP é a edge direita edge bytes recebidos continuamente. Os blocos de dados na opção de reconhecimento seletivo indicam blocos de dados que foram recebidos. As lacunas entre os blocos representam 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 faça exatamente isso. O bug está programado para ser corrigido em uma versão futura. Até lá, você precisa prestar atenção ao valor X/Off.

A opção de escala da janela tem o potencial de ser a mais confusa. O pacote a seguir mostra uma 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 é enganador porque o dimensionamento da janela está em vigor. Como você pode saber? A única maneira de saber é observar a configuração da conexão inicial. No caso a seguir, você pode ver que os segmentos SYN e SYN-ACK incluem o opção de dimensionamento de janela e, em ambos os casos, o valor de escala é 6, de modo que o tamanho da janela 4096 (2^12) no segmento acima é deslocado em 6 bits para fornecer 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:

. . . .
tamanho máximo do segmento IP mais baixo [500-1480] (min_mss) 576.
 . . .
tamanho máximo da janela de envio [4096-1073725440] (max_send_ws) 1073725440
janelas enormes máximas [>=0]                  (max_huge_windows)      0
janelas enormes atuais                                                0
janelas máximas de 256k [>=0]                  (max_256k_windows)      25
janelas atuais de 256k                                                0.
 . . . .
Política TCP RFC-1323 [desativar/permitir/solicitar] (tcp_rfc_1323_policy)   solicitar
Escala de janela solicitada pelo TCP [0-14]           (tcp_window_scale)      6
Política TCP SACK [desativar/permitir/solicitar]     (tcp_SACK_policy)       solicitar

como:

A tcp_rfc_1323_policy indica se os carimbos de data/hora serão usados. Os valores dos parâmetros são desativar/permitir/solicitar. O padrão de solicitar indica que a opção faz parte de um segmento de solicitação de conexão e, se solicitada em uma solicitação de conexão recebida, fará parte do segmento de resposta. Um valor de permitir indica que a opção não fará parte de um segmento de solicitação de conexão, mas poderá fazer parte de uma resposta, se a solicitação de conexão recebida a incluir. A opção desativar indica que a opção não fará parte de nenhum dos dois tipos de segmento. Definir o valor como desativar também indica que a opção de escala de janela não fará parte do segmento.

O opção tcp_window_scale controla o parâmetro de dimensionamento. Um valor zero informa ao host remoto que o dimensionamento da janela é suportado, mas que a janela do STCP não deve ser dimensionada.

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

A tcp_sack_policy controla a opção de reconhecimento seletivo. Os valores podem ser desativar, permitir e solicitar e significam exatamente a mesma coisa que significam para a opção tcp_rfc_1323_policy.

Finalmente, com o suporte ao dimensionamento de janelas, é possível ter janelas maiores do que o máximo anterior de 64K, portanto, dois novos conjuntos de tamanhos de janela foram criados. Eles são refletidos nos conjuntos max_256k_windows e max_huge_windows. Você pode 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 será o mínimo do parâmetro max_send_ws e o tamanho da janela de recepção anunciado pelos hosts remotos.

© 2024 Stratus Technologies.