El TCP MSS en Linux debe tener al menos 88 (incluir / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
Mi pregunta es: ¿dónde se les ocurrió "60 + 60 + 8" y por qué? Entiendo que 20 + 20 proviene del encabezado IP + encabezado TCP.
EDITAR: después de mirar más de cerca los encabezados, la fórmula me busca así:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
La pregunta sigue en pie: ¿por qué ? ¿Por qué el kernel de Linux utiliza esta fórmula, prohibiendo (un flujo forzado de) segmentos TCP de, digamos, 20 bytes? Piensa iperf aquí.
EDIT2: Aquí está mi caso de uso. Al forzar un MSS bajo en el socket / conexión, todos los paquetes enviados por la pila tendrán un tamaño pequeño. Quiero establecer un MSS bajo cuando trabajo con iperf para paquetes / segunda prueba. ¡No puedo obtener paquetes IP de menos de 128 bytes (tramas Ethernet de 142 bytes) en el cable debido a este límite inferior para el MSS! Me gustaría acercarme al tamaño de trama de Ethernet de 64 bytes según RFC 2544. Teóricamente esto debería ser posible: 18 + 20 + 20 <64.
fuente
TCP_MIN_MSS
.TCP_MIN_MSS
. ¿Por qué no puede ser 1? ¿Qué RFC se rompería? ¿Qué problema teórico / práctico causaría? ¿Estás seguro de que está "fuera de las especificaciones"? ¿"Mínimos diferentes"? Aquí solo hay un mínimo de interés: el MSS más pequeño permitido por el núcleo.Respuestas:
Se requiere una implementación para admitir los encabezados TCP e IP de tamaño máximo, que son 60 bytes cada uno.
Una implementación debe admitir datagramas de 576 bytes, que incluso con encabezados máximos significa más de 8 bytes de datos en el datagrama. Para enviar datagramas con más de 8 bytes de datos, la fragmentación de IP debe colocar al menos 8 bytes de datos en al menos uno de los paquetes que representan los fragmentos del datagrama. Por lo tanto, una implementación debe admitir al menos 8 bytes de datos en un paquete.
En conjunto, una implementación debe admitir paquetes de 60 + 60 + 8 bytes.
Cuando enviamos paquetes que forman parte de una secuencia TCP, tienen un encabezado IP de 20 bytes (más opciones) y un encabezado TCP de 20 bytes (más opciones). Eso deja un mínimo de (60 + 60 + 8) - (20 + 20) bytes restantes para datos y opciones. Por lo tanto, este es el máximo que podemos asumir con seguridad el TCP MSS de una implementación.
fuente
60
aparece dos vecesNo sé de dónde viene ese número, pero puedo decirte que está fuera de la especificación. La MTU mínima admitida para redes IP es de 576 bytes, que son 512 bytes de datos más hasta 64 bytes para encabezados IP + TCP y opciones de TCP. Ese valor fue elegido para dar una sobrecarga decentemente baja en el caso típico.
Mi lectura de bits de código del núcleo sugiere que el valor que está mostrando no es arbitrario. Había una práctica más antigua para usar la constante sin procesar 64 en lugar de
TCP_MIN_MSS
. Por lo tanto, supongo que hay una extraña red de IP sobre Foo con la que se encontraron los desarrolladores del kernel que les hizo decidir que podrían aumentar el valor de lo que ves.Sin embargo, no puedo decir cuál es ese tipo de red no estándar.
fuente