web-dev-qa-db-fra.com

taille de paquet maximale pour une connexion TCP

Quelle est la taille de paquet maximale pour une connexion TCP ou comment puis-je obtenir la taille de paquet maximale?

174
Alexa

La limite absolue de TCP taille du paquet est de 64 Ko (65 535 octets), mais elle est beaucoup plus pratique que la taille de tout paquet que vous verrez, car les couches inférieures (par exemple, Ethernet) ont des tailles de paquet inférieures.

Le MTU (Maximum Transmission Unit) pour Ethernet, par exemple, est de 1500 octets. Certains types de réseaux (tels que Token Ring) ont des MTU plus grandes et d'autres ont des MTU plus petits, mais les valeurs sont fixes pour chaque technologie physique.

158
Ether

C’est une excellente question et j’en ai souvent beaucoup au travail. Il y a beaucoup de réponses "techniquement correctes" telles que 65k et 1500. J'ai beaucoup travaillé à la rédaction d'interfaces réseau et utiliser 65k est idiot, et 1500 peut aussi vous causer de gros problèmes. Mon travail utilise de nombreux matériels/plates-formes/routeurs et, pour tout dire, je commence ici à 1400 octets. Si vous AVEZ BESOIN de plus de 1400, vous pouvez commencer à progresser progressivement, vous pouvez probablement aller jusqu'à 1450 et parfois jusqu'à 1480? Si vous avez besoin de plus que cela, vous devez bien sûr vous séparer en 2 paquets, parmi lesquels il y a plusieurs façons évidentes de le faire.

Le problème est que vous parlez de créer un paquet de données et de l'écrire via TCP, mais bien sûr, des données d'en-tête sont ajoutées et ainsi de suite, de sorte que vous avez un "bagage" qui vous place à 1 500 ou plus. beaucoup de matériel a des limites inférieures.

Si vous "Push", vous pouvez obtenir des choses vraiment bizarres. Données tronquées, évidemment, ou données abandonnées que j'ai rarement vues. Les données corrompues se produisent aussi rarement mais certainement.

75
Nektarios

Au niveau de l'application, l'application utilise TCP en tant que protocole orienté flux. TCP possède à son tour des segments et résume les détails du travail avec des paquets IP peu fiables.

TCP traite des segments au lieu de paquets. Chaque segment TCP a un numéro de séquence contenu dans un en-tête TCP. Les données réelles envoyées dans un segment TCP sont variables.

Il existe une valeur pour getsockopt qui est prise en charge sur certains systèmes d’exploitation, appelée TCP_MAXSEG, qui récupère la taille maximale de segment TCP (MSS). Il n'est cependant pas pris en charge sur tous les systèmes d'exploitation.

Je ne sais pas exactement ce que vous essayez de faire, mais si vous souhaitez réduire la taille de la mémoire tampon utilisée, vous pouvez également consulter: SO_SNDBUF et SO_RCVBUF.

18
Brian R. Bondy

Selon http://en.wikipedia.org/wiki/Maximum_segment_size , la plus grande taille par défaut d'un paquet IPV4 sur un réseau est de 536 octets (octets de taille 8 bits). Voir RFC 879

6
Robert Jacobs

Il n'y a pas de paquets dans TCP API.

Il y a souvent des paquets dans les protocoles sous-jacents, comme lorsque TCP est effectué sur IP, ce qui ne vous intéresse pas, car ils n'ont rien à voir avec l'utilisateur, sauf pour des optimisations de performances très délicates qui ne vous concernent probablement pas. intéressé par (selon la formulation de la question).

Si vous demandez quel est le nombre maximal d'octets que vous pouvez send() dans un appel d'API, il en va de l'implémentation et des paramètres. Vous appelez habituellement send () pour des morceaux allant jusqu'à plusieurs kilo-octets et vous êtes toujours prêt à ce que le système refuse de l'accepter totalement ou partiellement. Dans ce cas, vous devrez gérer manuellement le fractionnement en morceaux plus petits pour alimenter vos données en fichiers. TCP send () API.

4

Si vous utilisez des machines Linux, "ifconfig eth0 mtu 9000 up" est la commande permettant de définir le MTU pour une interface. Cependant, je dois dire que le gros MTU présente des inconvénients si la transmission sur le réseau n’est pas aussi stable et qu’il peut utiliser davantage de mémoires d’espace noyau.

3
DAG

Généralement, cela dépendra de l'interface utilisée par la connexion. Vous pouvez probablement utiliser un ioctl () pour obtenir le MTU, et s'il s'agit d'Ethernet, vous pouvez généralement obtenir la taille de paquet maximale en soustrayant la taille de l'en-tête matériel, soit 14 pour un Ethernet sans VLAN.

Ce n'est le cas que si la MTU est au moins aussi grande sur le réseau. TCP peut utiliser la découverte du MTU du chemin pour réduire votre MTU effective.

La question est, pourquoi vous souciez-vous?

3
WhirlWind

Une solution peut être de définir l’option de socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) sur une valeur "sans danger" avec le réseau sous-jacent (par exemple de 1400 à être sûr sur ethernet), puis utilisez une grande mémoire tampon lors de l’appel système. De cette façon, il peut y avoir moins d'appels système qui sont coûteux. Le noyau divisera les données pour correspondre à MSS.

De cette façon, vous pouvez éviter les données tronquées et votre application n'a pas à se soucier des petits tampons.

2
hashtpaa

La taille de paquet pour un paramètre TCP dans le protocole IP (Ip4). Pour ce champ (TL), 16 bits sont alloués. La taille maximale du paquet est donc de 65 535 octets: détails du protocole IP

2
Ziegfried

Il semble que la plupart des sites Web sur Internet utilisent 1460 octets pour la valeur de MTU. Parfois, il s’agit de 1452 et si vous utilisez un VPN, le nombre d’en-têtes IPSec sera encore plus élevé.

La taille de la fenêtre par défaut varie un peu jusqu'à 65 535 octets. J'utilise http://tcpcheck.com pour consulter mes propres valeurs IP source et pour vérifier ce que les autres fournisseurs Internet utilisent.

2
David McCulloch