Pular para o conteúdo principal

Tenho notado alguma confusão entre a Unidade Máxima de Transmissão Ethernet (MTU) e o Tamanho Máximo do Segmento TCP (MSS), espero que o seguinte explique. Se você ainda estiver (ou estiver agora) confuso, não hesite em acrescentar um comentário ou enviar-me um e-mail pedindo esclarecimentos.

Primeiro, STCP diferencia entre segmentos TCP enviados a um host em uma sub-rede local e segmentos enviados a um host em uma sub-rede remota, ou seja, através de um roteador. Os segmentos enviados a um host em uma subrede local têm um MSS relacionado ao MTU Ethernet; especificamente o MSS é MTU - tamanho do cabeçalho IP - tamanho do cabeçalho TCP. Em versões anteriores à 17.1 (mais cerca de 17.1 em um minuto) isto faz com que o MSS seja igual a 1500 - 20 - 20 ou 1460. Os segmentos enviados a um host em uma sub-rede remota utilizam um MSS de 536. O STCP usa o MSS menor em segmentos remotos devido às exigências da RFC 791 e RFC 879. Discuti como afinar (aumentar) o MSS e problemas potenciais em um artigo no eNewsletter do cliente Stratus de junho de 2004. Você pode encontrar uma cópia do artigo aqui. Enquanto o artigo foi escrito usando exemplos da versão 14.7 do VOS, o conteúdo ainda é válido (a partir da versão do OpenVOS é 17.1).

A versão 17.1 do OpenVOS adicionou suporte a estruturas jumbo Ethernet. Os Jumbo frames permitem mais de 1500 bytes no frame Ethernet, ou seja, um aumento na MTU Ethernet. O MTU padrão ainda é 1500, mas você pode aumentá-lo quando a interface é configurada usando o argumento "-mtu" (exemplo 1). O valor máximo do argumento MTU é 16110 dependendo de seu hardware (ver tabela 1).

ifconfig #sdlmux.m16.11-2 172.16.1.116 -netmask 255.255.255.0 -mtu 9200 -add
Adding interface %phx_vos#sdlmux.m16.11-2 with IP address 172.16.1.116
%phx_vos#sdlmux.m16.11-2: <UP, BROADCAST, RUNNING, NOFORWARDBROADCAST, KEEPALIVE
+,  MTU:9200>
172.16.1.116 netmask 0xffffff00 broadcast 172.16.1.255
Exemplo 1 - configuração da MTU ao configurar uma interface

 

Tipo de Adaptador MTU
Adaptadores incorporados em V100, V200, V400 1500
Adaptadores incorporados em V150, V250, V300, V500
Adaptadores incorporados em V2302, V2404, V4304, V4408, V6308, V6408
9200
Adaptador de cobre U571V de porta única 10/100/1000 mbps 1500
Adaptador de fibra U574V-LC Dual-Port 1000 mbps
Adaptador de cobre U575V Dual-Port 10/100/1000 mbps
Adaptador de cobre U578V Quad-Port 10/100/1000 mbps
U582V Quad-Port 10/100/1000 mbps adaptador de cobre
Adaptador de fibra U583V Quad-Port 1000 mbps
9200
Adaptador de fibra U584V Dual-Port 10.000 mbps 16110
Adaptador de fibra U776V Quad-Port 1000 mbps 9200
Tabela 1 - Valores MTU por tipo de hardware

 

Após definir uma MTU maior, você pode ver que a STCP anunciará um MSS maior para conexões locais, 0x23c8 é 9160 decimal.


9:04:55.912 Xmit Ether Dst 00:16:97:c4:01:aa  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    0, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  23fc, Src ac100174, Dst ac10012c
TCP from 172.16.1.116.59410 to 172.16.1.44.9182
    seq  3764213089, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum d329,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a 18 bf 3f d6  0  <<#H<<<< <<<<??V
     10     0  0  0  0

 

Mas as conexões remotas ainda recebem o menor MSS, 0x218 é 536 decimal.


9:20:34.051 Xmit Ether Dst 00:16:97:c4:01:aa  Src 00:00:a8:41:52:22 Type 0800
+(IP)    
IP   Ver/HL 45, ToS  0, Len   3c, ID    0, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  1086, Src ac100174, Dst c0a8000a
TCP from 172.16.1.116.49186 to 192.168.0.10.9182
    seq  1916893234, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum de8e,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  2 18  3  3  6  4   2  8  a  0  1 69  a  0  <<<<<<<< <<< <i<
     10     0  0  0  0

 

Você não pode aumentar o MSS mínimo para conexões remotas além de 1460 (1480 com o cabeçalho TCP)

as: set_stcp_param min_mss 9160
set_stcp_param: Argumento não está dentro do intervalo permitido. Erro em
     'param_value'. [500-1480] permitido
como:

 

A menos que ambos os lados de uma conexão anunciem um MSS maior, não há nenhum efeito real. Por exemplo, mesmo que o servidor FTP esteja configurado com uma MTU de 9200 e esteja anunciando um MSS de 9160, já que o cliente está anunciando um MSS de 1460 (0x5b4), que é o número máximo de bytes que o servidor enviará em um segmento.


11:02:49.758 Xmit Ether Dst 00:00:a8:42:3b:6e  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID    5, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  2401, Src ac100174, Dst ac100122
TCP from 172.16.1.116.ftp-data to 172.16.1.34.49343
    seq  2092638702, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum 7c62,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a  0 19 5c b5  0  <<#H<<<< <<< <5
     10     0  0  0  0

11:02:49.758 Rcvd Ether Dst 00:00:a8:41:52:22  Src 00:00:a8:42:3b:6e Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID 1bcb, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  083b, Src ac100122, Dst ac100174
TCP from 172.16.1.34.49343 to 172.16.1.116.ftp-data
    seq  3565222463, ack 2092638703, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum fef7,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4  5 b4  3  3  6  4   2  8  a 13 cc 99  0  0  <<<4<<<< <<<<L>
     10    19 5c b5  0                                       <5

. . . . 

11:02:50.620 Xmit Ether Dst 00:00:a8:42:3b:6e  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len  5dc, ID    8, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  1e5e, Src ac100174, Dst ac100122
TCP from 172.16.1.116.ftp-data to 172.16.1.34.49343
    seq  2092638703, ack 3565222464, window   128, 1460 data bytes, flags Push A
+ck.
    X/Off 08, Flags 18, Cksum 7467,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
. . . .

 

Mesmo quando ambos os lados anunciam o MSS maior, não há garantia de que cada quadro conterá a quantidade máxima de dados. Por exemplo, tanto o cliente quanto o servidor estão anunciando um MSS de 9160, mas os segmentos são apenas 8204 bytes porque esse é o máximo que a aplicação está planejada para enviar.


11:33:40.492 Xmit Ether Dst 00:00:a8:43:ba:64  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID   34, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  231b, Src ac100174, Dst ac1001d9
TCP from 172.16.1.116.ftp-data to 172.16.1.217.49430
    seq   851197707, ack     n.a., window  8192, 20 data bytes, flags Syn.
    X/Off 0a, Flags 02, Cksum d8f7,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a  0 20 9b 7d  0  <<#H<<<< <<<  >}
     10     0  0  0  0

11:33:40.493 Rcvd Ether Dst 00:00:a8:41:52:22  Src 00:00:a8:43:ba:64 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len   3c, ID   33, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  231c, Src ac1001d9, Dst ac100174
TCP from 172.16.1.217.49430 to 172.16.1.116.ftp-data
    seq  3989207776, ack  851197708, window  8192, 20 data bytes, flags Syn Ack.
    X/Off 0a, Flags 12, Cksum d75d,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
      0     2  4 23 c8  3  3  6  4   2  8  a  0  e e1 8a  0  <<#H<<<< <<< <a>
     10    20 9b 7d  0                                        >}

. . . .

11:33:40.504 Xmit Ether Dst 00:00:a8:43:ba:64  Src 00:00:a8:41:52:22 Type 0800
+(IP)
IP   Ver/HL 45, ToS  0, Len 2034, ID   37, Flg/Frg    0, TTL 3c,  Prtl  6
          Cksum  0320, Src ac100174, Dst ac1001d9
TCP from 172.16.1.116.ftp-data to 172.16.1.217.49430
    seq   851197708, ack 3989207777, window   128, 8204 data bytes, flags Ack.
    X/Off 08, Flags 10, Cksum ee81,  Urg-> 0000
     offset 0  .  .  .  4  .  .  .   8  .  .  .  C  .  .  .  0...4... 8...C...
. . . .

 

Finally just setting a large MTU on your hosts is not enough; you also have to make sure that all network devices between the two hosts are configured to allow the larger frame size. If not then what you will find is that everything will work correctly when the host uses small (<= 1460) segments, but if it transmits a larger segment, that segment will be dropped by the network device and the connection will eventually fail with a timeout condition of some kind. Larger segments may be sent because the application sends it or because STCP combines smaller segments. This can make for random and very frustrating failures.

© 2020 Stratus Technologies.