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.