Was ist die maximale Paketgröße für eine TCP-Verbindung oder wie kann ich die maximale Paketgröße erhalten?
Was ist die maximale Paketgröße für eine TCP-Verbindung oder wie kann ich die maximale Paketgröße erhalten?
Antworten:
Die absolute Beschränkung der TCP-Paketgröße beträgt 64 KB (65535 Byte). In der Praxis ist diese jedoch weitaus größer als die Größe eines Pakets, das Sie sehen werden, da die unteren Schichten (z. B. Ethernet) geringere Paketgrößen aufweisen.
Die MTU (Maximum Transmission Unit) für Ethernet beträgt beispielsweise 1500 Byte. Einige Netzwerktypen (wie Token Ring) haben größere MTUs, und einige Typen haben kleinere MTUs, aber die Werte sind für jede physikalische Technologie festgelegt.
Dies ist eine ausgezeichnete Frage, auf die ich bei der Arbeit tatsächlich viel stoße. Es gibt viele "technisch korrekte" Antworten wie 65k und 1500. Ich habe viel Arbeit beim Schreiben von Netzwerkschnittstellen geleistet und die Verwendung von 65k ist albern, und 1500 kann Sie auch in große Schwierigkeiten bringen. Meine Arbeit geht auf vielen verschiedenen Hardware / Plattformen / Routern, und um ehrlich zu sein, ist der Ort, an dem ich anfange, 1400 Bytes. Wenn Sie mehr als 1400 brauchen, können Sie beginnen, sich nach oben zu bewegen. Sie können wahrscheinlich zu 1450 und manchmal zu 1480'ish gehen? Wenn Sie mehr als das benötigen, müssen Sie natürlich in zwei Pakete aufteilen, von denen es mehrere offensichtliche Möglichkeiten gibt.
Das Problem ist, dass Sie über das Erstellen eines Datenpakets und das Ausschreiben über TCP sprechen, aber natürlich werden Header-Daten angeheftet und so weiter, sodass Sie "Gepäck" haben, das Sie auf 1500 oder mehr bringt. Und auch a Viele Hardware hat untere Grenzen.
Wenn Sie es "schieben", können Sie einige wirklich seltsame Dinge in Gang bringen. Offensichtlich abgeschnittene Daten oder abgelegte Daten, die ich selten gesehen habe. Beschädigte Daten kommen ebenfalls selten, aber sicher vor.
send()
wenn es Ihnen passt.
1480'ish
solltest es sein 1460
. Der IP-Header und der TCP-Header belegen jeweils mindestens 20 Byte (sofern keine optionalen Headerfelder verwendet werden), und daher beträgt das Maximum für Ethernet (ohne Jumbo-Frame) 1500 - 20 -20 = 1460
.
Auf Anwendungsebene verwendet die Anwendung TCP als Stream-orientiertes Protokoll. TCP wiederum verfügt über Segmente und abstrahiert die Details der Arbeit mit unzuverlässigen IP-Paketen.
TCP behandelt Segmente anstelle von Paketen. Jedes TCP-Segment hat eine Sequenznummer, die in einem TCP-Header enthalten ist. Die tatsächlich in einem TCP-Segment gesendeten Daten sind variabel.
Es gibt einen Wert für getockopt , der auf einem Betriebssystem unterstützt wird, das Sie verwenden können: TCP_MAXSEG, das die maximale TCP-Segmentgröße (MSS) abruft. Es wird jedoch nicht auf allen Betriebssystemen unterstützt.
Ich bin mir nicht sicher, was genau Sie versuchen, aber wenn Sie die verwendete Puffergröße reduzieren möchten, können Sie auch Folgendes untersuchen: SO_SNDBUF und SO_RCVBUF.
Laut http://en.wikipedia.org/wiki/Maximum_segment_size beträgt die standardmäßig größte Größe für ein IPV4-Paket in einem Netzwerk 536 Oktette (Bytes mit einer Größe von 8 Bit). Siehe RFC 879
Die TCP-API enthält keine Pakete.
Es gibt häufig Pakete in zugrunde liegenden Protokollen, beispielsweise wenn TCP über IP ausgeführt wird, an denen Sie kein Interesse haben, da sie nichts mit dem Benutzer zu tun haben, außer sehr heiklen Leistungsoptimierungen, an denen Sie wahrscheinlich nicht interessiert sind (laut Formulierung der Frage).
Wenn Sie fragen, wie viele Bytes maximal send()
in einem API-Aufruf enthalten sein können, hängt dies von der Implementierung und den Einstellungen ab. Normalerweise rufen Sie send () für Blöcke mit bis zu mehreren Kilobyte auf und sind immer bereit, dass das System die vollständige oder teilweise Annahme verweigert. In diesem Fall müssen Sie die Aufteilung in kleinere Blöcke manuell verwalten, um Ihre Daten in den zu speisen TCP send () API.
Im Allgemeinen hängt dies von der Schnittstelle ab, die die Verbindung verwendet. Sie können wahrscheinlich ein ioctl () verwenden, um die MTU abzurufen. Wenn es sich um Ethernet handelt, können Sie normalerweise die maximale Paketgröße ermitteln, indem Sie die Größe des Hardware-Headers von der Größe abziehen, die für Ethernet ohne VLAN 14 beträgt.
Dies ist nur dann der Fall, wenn die MTU im gesamten Netzwerk mindestens so groß ist. TCP verwendet möglicherweise die Pfad-MTU-Erkennung, um Ihre effektive MTU zu reduzieren.
Die Frage ist, warum kümmert es dich?
Wenn Sie mit Linux-Computern arbeiten, ist "ifconfig eth0 mtu 9000 up" der Befehl zum Festlegen der MTU für eine Schnittstelle. Ich muss jedoch sagen, dass eine große MTU einige Nachteile hat, wenn die Netzwerkübertragung nicht so stabil ist und möglicherweise mehr Kernelspeicher verwendet werden.
Es scheint, dass die meisten Websites im Internet 1460 Bytes für den Wert von MTU verwenden. Manchmal ist es 1452 und wenn Sie in einem VPN sind, wird es für die IPSec-Header noch mehr fallen.
Die Standardfenstergröße variiert erheblich bis zu maximal 65535 Byte. Ich verwende http://tcpcheck.com , um meine eigenen Quell-IP-Werte zu überprüfen und zu überprüfen, was andere Internetanbieter verwenden.
Eine Lösung kann darin bestehen, die Socket-Option TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) auf einen Wert zu setzen, der für das zugrunde liegende Netzwerk "sicher" ist (z. B. auf 1400 eingestellt, um im Ethernet sicher zu sein) Verwenden Sie beim Senden eines Systemaufrufs einen großen Puffer. Auf diese Weise kann es weniger Systemaufrufe geben, die teuer sind. Der Kernel teilt die Daten so auf, dass sie mit MSS übereinstimmen.
Auf diese Weise können Sie abgeschnittene Daten vermeiden und Ihre Anwendung muss sich nicht um kleine Puffer kümmern.
Die Paketgröße für eine TCP-Einstellung im IP-Protokoll (Ip4). Für dieses Feld (TL) werden 16 Bit zugewiesen, dementsprechend beträgt die maximale Paketgröße 65535 Byte: IP-Protokolldetails