TCP MSS mínimo no Linux

8

O TCP MSS no Linux deve ter pelo menos 88 (incluir / net / tcp.h):

/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS             88U

Minha pergunta é: onde eles criaram "60 + 60 + 8" e por quê? Eu entendo que 20 + 20 vem do cabeçalho IP + cabeçalho TCP.

EDIT: Depois de dar uma olhada nos cabeçalhos, a fórmula me parece assim:

(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)

A questão ainda permanece: por que ? Por que o kernel Linux usa essa fórmula, proibindo assim (um fluxo forçado de) segmentos TCP de, digamos, 20 bytes? Pense iperf aqui.

EDIT2: Aqui está o meu caso de uso. Ao forçar um MSS baixo no socket / conexão, todos os pacotes enviados pela pilha terão um tamanho pequeno. Eu quero definir um baixo MSS quando se trabalha com iperf para testes de pacotes / segundo. Não consigo obter pacotes IP menores que 128 bytes (quadros Ethernet de 142 bytes) no fio devido a esse limite inferior para o MSS! Eu gostaria de chegar tão perto de um tamanho de quadro Ethernet de 64 bytes como por RFC 2544. Teoricamente isso deve ser possível: 18 + 20 + 20 < 64.

    
por Mircea Gherzan 11.10.2011 / 13:21

2 respostas

4

É necessária uma implementação para suportar os cabeçalhos TCP e IP de tamanho máximo, com 60 bytes cada.

Uma implementação deve suportar datagramas de 576 bytes, que mesmo com cabeçalhos máximos significam mais de 8 bytes de dados no datagrama. Para enviar datagramas com mais de 8 bytes de dados, a fragmentação de IP deve colocar pelo menos 8 bytes de dados em pelo menos um dos pacotes que representam os fragmentos do datagrama. Assim, uma implementação deve suportar pelo menos 8 bytes de dados em um pacote.

Juntando isso, uma implementação deve suportar pacotes de 60 + 60 + 8 bytes.

Quando enviamos pacotes que fazem parte de um fluxo TCP, eles têm um cabeçalho IP de 20 bytes (mais opções) e um cabeçalho TCP de 20 bytes (mais opções). Isso deixa um mínimo de (60 + 60 + 8) - (20 + 20) bytes restantes para dados e opções. Portanto, este é o máximo que podemos com segurança assumir o TCP MSS de uma implementação.

    
por 23.10.2011 / 06:17
3

Eu não sei de onde esse número vem, mas posso dizer que está fora da especificação. O MTU mínimo suportado para redes IP é de 576 bytes, que são 512 bytes de dados e até 64 bytes para cabeçalhos IP + TCP e opções TCP. Esse valor foi escolhido para dar um gasto decentemente baixo no caso típico.

Minha leitura de bits do código do kernel sugere que o valor que você está mostrando não é arbitrário. Havia uma prática mais antiga de usar apenas a constante bruta 64 no lugar de TCP_MIN_MSS . Portanto, eu suponho que há uma estranha rede IP-over-Foo que os desenvolvedores do kernel encontraram que os fez decidir que poderiam aumentar o valor para o que você vê como.

O que esse tipo de rede não padrão é, no entanto, não posso dizer.

    
por 11.10.2011 / 15:55