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.
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.