Quelle est la taille de paquet maximale pour une connexion TCP ou comment puis-je obtenir la taille de paquet maximale?
Quelle est la taille de paquet maximale pour une connexion TCP ou comment puis-je obtenir la taille de paquet maximale?
Réponses:
La limite absolue de la taille des paquets TCP est de 64 Ko (65 535 octets), mais en pratique, elle est bien plus grande que la taille de tout paquet que vous verrez, car les couches inférieures (par exemple, Ethernet) ont des tailles de paquets inférieures.
La MTU (Maximum Transmission Unit) pour Ethernet, par exemple, est de 1500 octets. Certains types de réseaux (comme Token Ring) ont de plus grandes MTU et certains types ont de plus petites MTU, mais les valeurs sont fixes pour chaque technologie physique.
C'est une excellente question et j'y rencontre beaucoup au travail en fait. Il y a beaucoup de réponses "techniquement correctes" comme 65k et 1500. J'ai fait beaucoup de travail pour écrire des interfaces réseau et utiliser 65k est idiot, et 1500 peut aussi vous causer de gros ennuis. Mon travail se déroule sur de nombreux 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 à avancer progressivement, vous pouvez probablement aller à 1450 et parfois à 1480 pouces. Si vous avez besoin de plus que cela, vous devez bien sûr 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, les données d'en-tête sont clouées, etc. beaucoup de matériel a des limites inférieures.
Si vous "poussez", vous pouvez obtenir des choses vraiment étranges. Des données tronquées, évidemment, ou des données supprimées que j'ai rarement vues. Les données corrompues se produisent également rarement mais certainement.
send()
si c'est pratique.
1480'ish
devrait l'être 1460
. L'en-tête IP et l'en-tête TCP occupent au moins 20 octets chacun (à moins que des champs d'en-tête facultatifs ne soient utilisés) et donc le maximum pour (trame non Jumbo) Ethernet est 1500 - 20 -20 = 1460
.
Au niveau de l'application, l'application utilise TCP comme protocole orienté flux. TCP à son tour a des segments et résume les détails de l'utilisation des paquets IP non fiables.
TCP traite les segments plutôt que les 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 prise en charge sur certains systèmes d'exploitation que vous pouvez utiliser, appelée TCP_MAXSEG, qui récupère la taille de segment TCP maximale (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 voulez réduire la taille de la mémoire tampon utilisée, vous pouvez également examiner: 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 est de 536 octets (octets de taille 8 bits). Voir RFC 879
Il n'y a pas de paquets dans l'API TCP.
Il y a souvent des paquets dans les protocoles sous-jacents, comme lorsque TCP est fait 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 (selon le formulation de la question).
Si vous demandez quel est le nombre maximal d'octets que vous pouvez send()
dans un appel d'API, cela dépend de l'implémentation et des paramètres. Vous appelez généralement send () pour des segments pouvant aller jusqu'à plusieurs kilo-octets et vous êtes toujours prêt à ce que le système refuse de l'accepter totalement ou partiellement, auquel cas vous devrez gérer manuellement le fractionnement en morceaux plus petits pour alimenter vos données dans le fichier. API TCP send ().
En général, cela dépend de l'interface que la connexion utilise. 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 de celle-ci, qui est 14 pour 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 de MTU de chemin pour réduire votre MTU efficace.
La question est, pourquoi vous en souciez-vous?
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 baissera encore plus pour les en-têtes IPSec.
La taille de fenêtre par défaut varie considérablement jusqu'à un maximum de 65 535 octets. J'utilise http://tcpcheck.com pour consulter mes propres valeurs IP source et vérifier ce que les autres fournisseurs Internet utilisent.
Une solution peut être de définir l'option de socket TCP_MAXSEG ( http://linux.die.net/man/7/tcp ) sur une valeur qui est "sûre" avec le réseau sous-jacent (par exemple définie sur 1400 pour être sûre sur Ethernet), puis utiliser un grand tampon lors de l'envoi d'un appel système. De cette façon, il peut y avoir moins d'appels système 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.
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