O TCP MSS no Linux deve ter pelo menos 88 (inclua / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
Minha pergunta é: de 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 olhar mais de perto os 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 quê ? Por que o kernel do Linux usa essa fórmula, proibindo, assim, (um fluxo forçado de) segmentos TCP de, digamos, 20 bytes? Pense no iperf aqui.
EDIT2: Aqui está o meu caso de uso. Ao forçar um MSS baixo no soquete / conexão, todos os pacotes enviados pela pilha terão um tamanho pequeno. Quero definir um MSS baixo ao trabalhar com o iperf para pacotes / segundo teste. Não consigo obter pacotes IP menores que 128 bytes (quadros Ethernet de 142 bytes) no fio por causa desse limite mais baixo para o MSS! Eu gostaria de chegar o mais próximo possível de um tamanho de quadro Ethernet de 64 bytes, conforme RFC 2544. Teoricamente, isso deveria ser possível: 18 + 20 + 20 <64.
fonte
TCP_MIN_MSS
.TCP_MIN_MSS
. Por que não pode ser 1? Que RFC quebraria? Que problema teórico / prático ele causaria? Você tem certeza de que está "fora das especificações"? "Mínimos diferentes"? Há apenas um mínimo de interesse aqui: o menor MSS permitido pelo kernel.Respostas:
É 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, esse é o máximo que podemos assumir com segurança, o TCP MSS de uma implementação.
fonte
60
programa éNão sei de onde vem esse número, mas posso dizer que está fora das especificações. 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 fornecer despesas gerais decentemente baixas 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, suponho que exista uma rede IP-over-Foo estranha que os desenvolvedores do kernel encontraram que os fez decidir que poderiam aumentar o valor para o que você vê.O que esse tipo de rede fora do padrão é, no entanto, não posso dizer.
fonte