Maximale Paketgröße für eine TCP-Verbindung

196

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

Alexa
quelle
24
TCP ist streambasiert. Gibt es einen bestimmten Grund, warum Sie sich Sorgen um einzelne Pakete machen?
Matti Virkkunen
27
Da die darunter liegenden Schichten paketbasiert sind ... Typische Implementierung -> Schicht 1 - Ethernet PHY, Schicht 2 - Ethernet MAC (MAC-Paketdefinition, Schicht 3 - Internetprotokoll (IP-Paketdefinition), Schicht 4 - TCP (Transmission Control Protocol) ) - Verwendet den paketbasierten Dienst darunter.
2
Es gibt kein "TCP-Paket". Es gibt TCP- Segmente , deren Länge durch ein 32-Bit-Wort beschrieben wird und die in oder über IP- Pakete enthalten sind, deren Länge in 16 Bit beschrieben wird. Es gibt auch Ethernet-Frames, die all diese Dinge enthalten. Nach welchen dieser Dinge fragst du? Wenn Sie TCP verwenden, müssen Sie sich in keiner Weise um eines von ihnen kümmern: TCP und IP kümmern sich um alles für Sie.
Marquis von Lorne

Antworten:

178

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.

Äther
quelle
15
"Aber die Werte sind für jede physikalische Technologie festgelegt" - das stimmt nicht. Ethernet hatte früher eine maximale MTU von 1500, aber Sie konnten auch eine niedrigere verwenden. Mit dem Aufkommen von Jumbo-Frames gibt es kein wirklich festgelegtes Maximum, und das Maximum variiert je nach Hardware und Treiber.
WhirlWind
4
@Whirl: stimmt, sie sind konfigurierbar, aber im Allgemeinen nicht; "konfigurierbar" ist subjektiv, weil man sich dazu mit dem Kernel befassen müsste. Es ist nichts, woran man auf Anwendungsebene basteln kann, wo sich das OP zu befinden scheint.
Ether
3
@HiroProtagonist: 1500 ist ein Maximum, daher ist es nicht überraschend, 600 zu haben.
Nicolas Raoul
28
Warum ist es 64K (65535 Bytes) die Einschränkung? Weil das Fenstergrößenattribut im TCP-Header nur 16 Bit beträgt. Ich wollte nur erwähnen, könnte irgendwann jemandem helfen ..... tolle Antwort übrigens @Ether!
Cacho Santa
2
Es ist auch möglich, es mithilfe der Fensterskalierung zu verbessern. In diesem Fall ist das Maximum 1 GiB
Martin Melka
86

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.

Nektarios
quelle
Warum sind GET-Anforderungen durchschnittlich 600 Byte lang?
10
Du meinst 64K, nicht 65K. Ich weiß nicht, was Sie unter "Der Ort, an dem ich anfange, sind 1400 Bytes" verstehen. Sie müssen sich keine Gedanken über die Paketgröße in der TCP-API machen. Es kümmert sich um die Bestimmung und Beobachtung des Weges MTU. Es gibt keinen Grund, warum Sie 2G nicht in einem schreiben können, send()wenn es Ihnen passt.
Marquis von Lorne
19
Du 1480'ishsolltest 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.
Eugene Beresovsky
2
Ich habe über Wireshark gesehen, dass ein Server große Pakete (über 1400 Bytes) sendet und der Client sie zerlegt empfängt, wenn nur wenige Pakete mit maximal 1400 Bytes vorhanden sind. Wer ist für die Demontage des Pakets verantwortlich? @Nektario ...?
Inbaly
2
@EugeneBeresovsky gut mit den optionalen Headern, die + bis zu 40 weitere Bytes sind, aber es ist variabel, so dass 1420 die Grenze zu sein scheint. Mit dem Vorschlag von 1400 erhalten Sie eine kleine Polsterung. Ich werde mit 1408 gehen, da es durch 128 teilbar ist
Garet Claborn
22

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.

Brian R. Bondy
quelle
Ich frage mich, ob Sie TCP als Nachrichtenwarteschlange verwenden können, wenn Sie alle Ihre Nachrichten in ein großes TCP-Paket einfügen können.
CMCDragonkai
4

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.

Pavel Radzivilovsky
quelle
8
TCP verfügt über Pakete sowie einen Paket-Header, von dem ein Teil den IP-Header überlappt. Nur weil du es nicht sehen sollst, heißt das nicht, dass es nicht existiert. TCP erfolgt immer über IP. Sie können dies nicht ohne IP tun, da sich die Header überlappen.
WhirlWind
23
@WhirlWind TCP hat Segmente. IP hat Pakete.
Marquis von Lorne
1
TCP hat Segmente (oder nennen Sie sie Pakete, es ist in Ordnung). Die TCP-API enthält keine Pakete.
Pavel Radzivilovsky
13
@ NathanLong Der Schaden ist, dass Sie unnötige Verwirrung stiften. TCP hat Segmente, UDP hat Datagramme, IP hat Pakete, Ethernet hat Frames, ...
Marquis of Lorne
1
@Chexxor Mit welcher Sprache werden Sie TCP-Segmente in IP-Paketen in Ethernet-Frames beschreiben? Es besteht keinerlei Notwendigkeit, das Problem zu verwirren, indem derselbe Begriff für verschiedene Dinge verwendet wird, wenn die Autoren dieser Dinge große Schwierigkeiten haben, verschiedene Begriffe zu verwenden.
Marquis von Lorne
3

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?

Wirbelwind
quelle
6
Dadurch erhalten Sie nur die maximale Paketgröße auf dem ersten Link. Soweit ich weiß, darf jeder andere Knoten entlang der Route keine großen Pakete mögen und wird möglicherweise irgendwo entlang des Pfades aufgeteilt.
Matti Virkkunen
Ja, das stimmt ... deine Frage ist also gut - warum willst du das?
WhirlWind
Ich möchte Videos / Bilder über eine LAN-Verbindung übertragen
Alexa
1
Warum ist das wichtig, da TCP streamorientiert ist?
WhirlWind
3

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.

DAG
quelle
3

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.

David McCulloch
quelle
2

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.

Hashtpaa
quelle
2

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

Ziegfried
quelle