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.
la source
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.Réponses:
Une implémentation est requise pour prendre en charge les en-têtes TCP et IP de taille maximale, qui sont chacun de 60 octets.
Une implémentation doit prendre en charge des datagrammes de 576 octets, ce qui, même avec des en-têtes maximum, signifie plus de 8 octets de données dans le datagramme. Pour envoyer des datagrammes avec plus de 8 octets de données, la fragmentation IP doit mettre au moins 8 octets de données dans au moins un des paquets qui représentent les fragments du datagramme. Ainsi, une implémentation doit prendre en charge au moins 8 octets de données dans un paquet.
Ensemble, une implémentation doit prendre en charge les paquets 60 + 60 + 8 octets.
Lorsque nous envoyons des paquets qui font partie d'un flux TCP, ils ont un en-tête IP de 20 octets (plus d'options) et un en-tête TCP de 20 octets (plus d'options). Cela laisse un minimum de (60 + 60 + 8) - (20 + 20) octets restants pour les données et les options. Par conséquent, c'est le maximum que nous pouvons supposer en toute sécurité TCP MSS d'une implémentation.
la source
60
montre deux foisJe ne sais pas d'où vient ce chiffre, mais je peux vous dire qu'il est en dehors des spécifications. La MTU minimale prise en charge pour les réseaux IP est de 576 octets, soit 512 octets de données plus jusqu'à 64 octets pour les en-têtes IP + TCP et les options TCP. Cette valeur a été choisie pour donner des frais généraux décemment bas dans le cas typique.
Ma lecture de bits de code du noyau suggère que la valeur que vous affichez n'est pas arbitraire. Il y avait une ancienne pratique pour utiliser simplement la constante brute 64 à la place de
TCP_MIN_MSS
. Par conséquent, je suppose qu'il y a un étrange réseau IP sur Foo que les développeurs du noyau ont rencontré qui leur a fait décider qu'ils pourraient augmenter la valeur de ce que vous voyez comment.Ce que ce type de réseau non standard est, cependant, je ne peux pas dire.
la source