Le TCP MSS sous Linux doit être d'au moins 88 (inclure / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
Ma question est: où ont-ils trouvé "60 + 60 + 8" et pourquoi? J'obtiens que 20 + 20 vient de l'en-tête IP + en-tête TCP.
EDIT: Après avoir regardé de plus près les en-têtes, la formule me ressemble comme ceci:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
La question se pose toujours: pourquoi ? Pourquoi le noyau Linux utilise-t-il cette formule, interdisant ainsi (un flux forcé) des segments TCP de, disons, 20 octets? Pensez iperf ici.
EDIT2: Voici mon cas d'utilisation. En forçant un MSS bas sur socket / connexion, tous les paquets envoyés par la pile auront une petite taille. Je veux définir un MSS bas lorsque je travaille avec iperf pour les tests de paquets / seconde. Je ne peux pas obtenir de paquets IP inférieurs à 128 octets (trames Ethernet de 142 octets) sur le fil en raison de cette limite inférieure pour le MSS! Je voudrais me rapprocher d'une taille de trame Ethernet de 64 octets selon RFC 2544. Théoriquement, cela devrait être possible: 18 + 20 + 20 <64.
TCP_MIN_MSS
.
TCP_MIN_MSS
. Pourquoi ne peut-il pas être 1? Quel RFC casserait-il? Quel problème théorique ou pratique cela causerait-il? Êtes-vous sûr que c'est "en dehors des spécifications"? "Différents minima"? Il n'y a qu'un minimum d'intérêt ici: le plus petit MSS autorisé par le noyau.