taille maximale des paquets 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?

La limitation absolue de la taille des paquets TCP est de 64 Ko (65 535 octets), mais en pratique, cette taille est bien supérieure à celle des paquets que vous voyez, car les tailles inférieures des paquets (par exemple Ethernet) sont plus faibles.

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

C’est une excellente question et je me heurte beaucoup à cela au travail. Il y a beaucoup de réponses “techniquement correctes” telles que 65k et 1500. J’ai beaucoup travaillé sur l’écriture d’interfaces réseau et l’utilisation de 65k est stupide, et 1500 peut aussi vous causer de gros problèmes. Mon travail se déroule sur beaucoup de matériels / plates-formes / routeurs différents, et pour être honnête, je commence par 1400 octets. Si vous avez besoin de plus de 1400, vous pouvez commencer à progresser, vous pouvez probablement aller à 1450 et parfois à 1480? Si vous avez besoin de plus que cela, bien sûr, vous devez diviser en 2 paquets, dont il existe 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, il y a des données d’en-tête, etc., vous avez donc un bagage à 1500 ou plus. beaucoup de matériel a des limites inférieures.

Si vous «poussez», vous pouvez obtenir des choses vraiment étranges. Données tronquées, évidemment, ou données supprimées que j’ai rarement vues. Les données corrompues se produisent également rarement mais certainement.

Au niveau de l’application, l’application utilise TCP comme protocole orienté stream. TCP à son tour a des segments et élimine les détails du travail avec des paquets IP non fiables.

TCP traite des segments au lieu des paquets. Chaque segment TCP a un numéro de séquence qui est 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 que vous pouvez utiliser, appelée TCP_MAXSEG, qui récupère la taille maximale du segment TCP (MSS). Il n’est cependant pas supporté 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.

Selon http://en.wikipedia.org/wiki/Maximum_segment_size , la plus grande taille par défaut pour un paquet IPV4 sur un réseau 536. Voir RFC 879

Il n’y a pas de paquets dans l’API TCP.

Il existe 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 intéressent probablement pas. formulation de la question).

Si vous demandez quel est le nombre maximum d’octets que vous pouvez send() dans un appel API, cela dépend de l’implémentation et des parameters. En général, vous appelez send () pour des morceaux de plusieurs kilo-octets, et soyez toujours prêt pour que le système refuse de l’accepter totalement ou partiellement. Dans ce cas, vous devrez gérer manuellement le fractionnement pour alimenter vos données. TCP send () API.

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

Une solution peut être de définir l’option de socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) sur une valeur “sûre” avec le réseau sous-jacent (par exemple, définie sur 1400 pour être sûre sur Ethernet), puis sur utiliser un grand tampon dans l’appel système d’envoi. De cette façon, il peut y avoir moins d’appels système coûteux. Le kernel divisera les données pour correspondre à MSS.

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

Il semble que la plupart des sites Web sur Internet utilisent 1460 octets pour la valeur de MTU. Parfois, c’est 1452 et si vous êtes sur un VPN, cela diminuera encore plus pour les en-têtes IPSec.

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

En général, cela dépend 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 Ethernet sans VLAN.

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

La question est, pourquoi vous souciez-vous?

La taille du 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 65535 octets: détails du protocole IP