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.
