it-swarm.com.de

maximale Paketgröße für eine TCP Verbindung

Was ist die maximale Paketgröße für eine TCP Verbindung oder wie kann ich die maximale Paketgröße ermitteln?

174
Alexa

Die absolute Beschränkung für TCP Paketgröße ist 64 KB (65535 Byte), aber in der Praxis ist dies weitaus größer als die Größe eines Pakets, das Sie sehen werden, weil die unteren Schichten (z. B. Ethernet) niedriger sind Paketgrößen.

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.

158
Ether

Dies ist eine ausgezeichnete Frage, und ich bin bei der Arbeit viel damit beschäftigt. Es gibt eine Menge "technisch korrekter" Antworten wie 65.000 und 1.500. Ich habe viel Arbeit mit dem Schreiben von Netzwerkschnittstellen geleistet und die Verwendung von 65.000 ist albern, und 1.500 kann Sie auch in große Schwierigkeiten bringen. Meine Arbeit geht auf viele verschiedene Hardware/Plattformen/Router, und um ehrlich zu sein, ist der Ort, an dem ich anfange, 1400 Bytes. Wenn Sie mehr als 1400 brauchen, können Sie anfangen, sich nach oben zu bewegen, können Sie wahrscheinlich bis 1450 und manchmal bis 1480'ish gehen? Wenn Sie mehr als das brauchen, müssen Sie sich 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 Ausgeben über TCP sprechen, aber natürlich werden Header-Daten angeheftet und so weiter, sodass Sie "Gepäck" haben, das Sie auf 1500 oder höher bringt Viele Hardware hat niedrigere Grenzen.

Wenn Sie "Push it", können Sie einige wirklich seltsame Dinge los. Offensichtlich abgeschnittene Daten oder abgelegte Daten, die ich selten gesehen habe. Verfälschte Daten kommen ebenfalls selten, aber sicher vor.

75
Nektarios

Auf Anwendungsebene verwendet die Anwendung TCP als stream-orientiertes Protokoll. TCP) hat wiederum Segmente und abstrahiert die Details der Arbeit mit unzuverlässigen IP-Paketen.

TCP befasst sich mit Segmenten anstelle von Paketen. Jedes TCP - Segment hat eine Sequenznummer, die in einem TCP - Header enthalten ist. Die tatsächlichen Daten, die in einem TCP - Segment gesendet wurden ist variabel.

Es gibt einen Wert für getsockopt , der von einem Betriebssystem namens TCP_MAXSEG unterstützt wird, das die maximale TCP Segmentgröße (MSS) abruft. Er wird von diesem Betriebssystem nicht unterstützt alles Betriebssystem.

Ich bin mir nicht sicher, was Sie genau tun möchten, aber wenn Sie die verwendete Puffergröße reduzieren möchten, können Sie auch Folgendes überprüfen: SO_SNDBUF und SO_RCVBUF.

18
Brian R. Bondy

Gemäß 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 Bits). Siehe RFC 879

6
Robert Jacobs

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 bei sehr heiklen Leistungsoptimierungen, die Sie vornehmen sind wahrscheinlich nicht interessiert (entsprechend der Fragestellung).

Wenn Sie nach der maximalen Anzahl von Bytes fragen, die Sie in einem API-Aufruf send() können, hängt dies von der Implementierung und den Einstellungen ab. Normalerweise rufen Sie send () für Blöcke mit einer Größe von bis zu mehreren Kilobyte auf und sind immer bereit, die vollständige oder teilweise Annahme durch das System zu verweigern. In diesem Fall müssen Sie die Aufteilung in kleinere Blöcke manuell verwalten, um Ihre Daten in das System zu übertragen TCP send () API.

4

Wenn Sie mit Linux-Computern arbeiten, ist "ifconfig eth0 mtu 9000 up" der Befehl zum Festlegen der MTU für eine Schnittstelle. Allerdings muss ich sagen, dass die große MTU einige Nachteile hat, wenn die Netzwerkübertragung nicht so stabil ist und möglicherweise mehr Kernelspeicher benötigt.

3
DAG

Im Allgemeinen hängt dies von der Schnittstelle ab, die die Verbindung verwendet. Sie können wahrscheinlich ein ioctl () verwenden, um die MTU abzurufen, und wenn es sich um Ethernet handelt, können Sie normalerweise die maximale Paketgröße ermitteln, indem Sie die Größe des Hardware-Headers von dem Wert subtrahieren, der für Ethernet ohne VLAN 14 beträgt.

Dies ist nur 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 interessiert es dich?

3
WhirlWind

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. 1400 to) seien Sie sicher im Ethernet) und verwenden Sie dann einen großen Puffer beim Senden des Systemaufrufs. Auf diese Weise kann es zu weniger teuren Systemaufrufen kommen. Der Kernel teilt die Daten so auf, dass sie zu MSS passen.

Auf diese Weise können Sie abgeschnittene Daten vermeiden und Ihre Anwendung muss sich nicht um kleine Puffer kümmern.

2
hashtpaa

Die Paketgröße für eine TCP Einstellung im IP-Protokoll (Ip4). Für dieses Feld (TL) werden 16 Bits zugewiesen, dementsprechend beträgt die maximale Paketgröße 65535 Bytes: IP Protokolldetails

2
Ziegfried

Es scheint, dass die meisten Websites im Internet 1460 Byte für den Wert von MTU verwenden. Manchmal ist es 1452 und wenn Sie sich in einem VPN befinden, wird es für die IPSec-Header noch mehr fallen.

Die Standardfenstergröße variiert erheblich und beträgt maximal 65535 Byte. Ich benutze http://tcpcheck.com , um meine eigenen Quell-IP-Werte zu überprüfen und zu überprüfen, welche anderen Internetanbieter verwenden.

2
David McCulloch