Das TCP-MSS unter Linux muss mindestens 88 sein (include / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
Meine Frage ist: Wo haben sie "60 + 60 + 8" gefunden und warum? Ich bekomme, dass 20 + 20 vom IP-Header + TCP-Header kommt.
EDIT: Nach einem genaueren Blick auf die Überschriften sieht die Formel für mich so aus:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
Die Frage bleibt noch: Warum ? Warum verwendet der Linux-Kernel diese Formel und verhindert so (einen erzwungenen Fluss von) TCP-Segmenten von beispielsweise 20 Bytes? Denken Sie hier iperf.
EDIT2: Hier ist mein Anwendungsfall. Durch Erzwingen eines niedrigen MSS für Socket / Verbindung haben alle vom Stapel gesendeten Pakete eine geringe Größe. Ich möchte ein niedriges MSS einstellen, wenn ich mit iperf für Pakete / zweite Tests arbeite. Ich kann keine IP-Pakete erhalten, die kleiner als 128 Bytes (Ethernet-Frames von 142 Bytes) sind, da diese Untergrenze für das MSS liegt! Ich möchte einer Ethernet-Frame-Größe von 64 Bytes gemäß RFC 2544 so nahe kommen. Theoretisch sollte dies möglich sein: 18 + 20 + 20 <64.
quelle
TCP_MIN_MSS
.TCP_MIN_MSS
. Warum kann es nicht 1 sein? Welchen RFC würde es brechen? Welches theoretische / praktische Problem würde es verursachen? Sind Sie sicher, dass es "außerhalb der Spezifikation" ist? "Unterschiedliche Minima"? Hier gibt es nur ein Minimum an Interesse: das kleinste vom Kernel zugelassene MSS.Antworten:
Eine Implementierung ist erforderlich, um die maximal großen TCP- und IP-Header zu unterstützen, die jeweils 60 Byte groß sind.
Eine Implementierung muss 576-Byte-Datagramme unterstützen, was selbst bei maximalen Headern mehr als 8 Byte Daten im Datagramm bedeutet. Um Datagramme mit mehr als 8 Datenbytes zu senden, muss die IP-Fragmentierung mindestens 8 Datenbytes in mindestens eines der Pakete einfügen, die die Fragmente des Datagramms darstellen. Daher muss eine Implementierung mindestens 8 Datenbytes in einem Paket unterstützen.
Zusammengenommen muss eine Implementierung 60 + 60 + 8-Byte-Pakete unterstützen.
Wenn wir Pakete senden, die Teil eines TCP-Streams sind, haben sie einen 20-Byte-IP-Header (plus Optionen) und einen 20-Byte-TCP-Header (plus Optionen). Damit verbleiben mindestens (60 + 60 + 8) - (20 + 20) Bytes für Daten und Optionen. Daher ist dies das Maximum, das wir sicher für das TCP-MSS einer Implementierung annehmen können.
quelle
60
wird zweimalIch weiß nicht, woher diese Nummer kommt, aber ich kann Ihnen sagen, dass sie außerhalb der Spezifikation liegt. Die für IP-Netzwerke unterstützte Mindest-MTU beträgt 576 Byte, dh 512 Datenbyte plus bis zu 64 Byte für IP + TCP-Header und TCP-Optionen. Dieser Wert wurde gewählt, um im typischen Fall einen angemessen geringen Overhead zu erzielen.
Mein Lesen von Kernel-Code-Bits legt nahe, dass der angezeigte Wert nicht willkürlich ist. Es gab eine ältere Praxis, nur die Rohkonstante 64 anstelle von zu verwenden
TCP_MIN_MSS
. Daher gehe ich davon aus, dass es ein seltsames IP-over-Foo-Netzwerk gibt, auf das die Kernel-Entwickler gestoßen sind, das sie zu der Entscheidung veranlasst hat, den Wert auf das zu erhöhen, was Sie sehen, wie.Was dieser nicht standardmäßige Netzwerktyp ist, kann ich jedoch nicht sagen.
quelle