web-dev-qa-db-fra.com

Comment le MTU est-il 65535 dans UDP, mais Ethernet n'autorise pas la taille de l'image plus de 1500 octets

J'utilise un Ethernet rapide de 100 Mbps, dont la taille du cadre est inférieure à 1500 octets (1472 octets pour la charge utile selon mon manuel). Dans ce cas, j'ai pu envoyer et recevoir un paquet UDP de taille de message 65507 octets, ce qui signifie que la taille du paquet était de 65507 + 20 (en-tête IP) + 8 (en-tête UDP) = 65535.

Si la taille de la charge utile de l'image lui-même est maximale de 1472 octets (selon mon manuel), comment la taille de la propriété intellectuelle peut-elle être supérieure à celle qui est 65535?

J'ai utilisé le code de l'expéditeur comme

char buffer[100000];
for (int i = 1; i < 100000; i++)
{
    int len = send (socket_id, buffer, i);
    printf("%d\n", len);
}

Code du récepteur comme

while (len = recv (socket_id, buffer, 100000))
{
     printf("%d\n". len);
}

J'ai observé que sendreturns -1 au i > 65507 et recv imprime ou reçoit un paquet de maximum of length 65507.

11
nikku

Les datagrammes UDP ont peu à voir avec la taille de la MTU, vous pouvez les rendre aussi gros que vous le souhaitez jusqu'à 64K. Vous pouvez même en envoyer l'un d'eux dans un paquet entier tant que vous utilisez des cadres Jumbo avec une taille plus grande le grand datagramme.

Cependant, les trames jumbo doivent être prises en charge par tout l'équipement que le cadre passera sur ce problème et un problème. Pour des raisons pratiques, les cadres Ethernet sont la taille du tranport la plus répandue, la MTU pour celles-ci est CIRCA 1500 octets, je dirai 1500 à l'avenir, mais ce n'est pas toujours. Lorsque vous créez un datagramme UDP plus grand que le MTU sous-jacent (lequel comme indiqué est le plus souvent éventuellement Ethernet), il sera classé silencieusement en plusieurs cadres de 1500 octets. Si vous TCPDummp Ce trafic, vous verrez un certain nombre de paquets cassés à la limite MTU qui aura le drapeau plus de fragments défini avec un numéro de fragment. Le premier paquet aura un numéro de fragment de 0 et le jeu plus de fragments et le dernier aura un numéro de fragment non nul et plus de fragments non définis.

Alors pourquoi les soins? Les détails de la mise en œuvre importent réellement. La fragmentation peut blesser les performances dans le réseau, pas plus grand problème, mais une personne à conscience. Si une énorme taille de datagramme utilisée alors si tout fragment doit être perdu que l'ensemble des datagrammes devra être résolf. De même à des volumes élevés et aujourd'hui, il s'agit de volumes parfaitement réalisables, puis une association MIS-Association des cadres au réassemblage est possible. Il peut également exister des problèmes d'obtenir des paquets UDP fragmentés pour traverser les configurations de pare-feu Enterprise où les équilibreurs de charge répandent les paquets, si un fragment est sur un pare-feu et l'autre sur une autre, le trafic sera chuté comme incomplète.

Donc, ne créez pas de datagrammes UDP plus gros que la fragmentation de la taille du MTU, sauf si vous ne devez que vous devez et si vous devez spécifier que l'infrastructure étant communiquée entre est proche (la même ferme sous-réseau) à quel point les cadres Jumbo seraient probablement une bonne option.

11
Martyn A

UDP ne sait rien à propos de MTU. Les paquets UDP peuvent avoir une taille de 8 à 65535 octets. Les couches de protocole sous UDP peuvent soit envoyer un paquet de taille spécifique ou rejeteront pour envoyer ce paquet avec une erreur si trop gros.

La couche inférieure à UDP est généralement IP, IPv4 ou IPv6. Et le paquet IP peut avoir n'importe quelle taille de 20 (IPv4)/40 (IPv6) à 65535 octets, c'est le même maximum que UDP. Cependant, IP prend en charge un mécanisme appelé fragmentation. Si un paquet IP est de plus grand de taille que ce que le calque ci-dessous peut transporter, IP peut diviser un paquet unique en plusieurs paquets appelés fragments. Chaque fragment est en fait un paquet IP à part entière (possède un propre en-tête IP) et est également envoyé seul à la destination; Il s'agit alors de la tâche de la destination de collecter tous les fragments et de ré-construire le paquet complet hors d'eux avant de passer les données reçues sur la couche supérieure suivante (E.G. UDP).

Le protocole Ethernet ne peut que transporter des cadres avec une charge utile comprise entre 46 et 1500 octets (il y a des exceptions mais qui dépasse la portée de cette réponse). Si les données de charge utile sont inférieures à 46 octets, il est rembourré pour être exattuellement 46 octets. Si les données de la charge utile dépassent 1500 octets, l'interface refusera de l'accepter. Si cela se produit, il appartient à la couche IP de décider maintenant de fragmenter le paquet, de sorte qu'aucun fragment ne soit plus grand que 1500 octets ou signaler une erreur à la couche supérieure suivante si la fragmentation a été désactivée ou interdite pour cette connexion particulière.

La fragmentation doit généralement être évitée, comme

  • est perte de ressources au côté de l'expéditeur.
  • il gaspille des ressources au côté du destinataire.
  • il augmente la surcharge de protocole pour la même quantité de données de charge utile.
  • si un seul fragment est perdu, tout le paquet est perdu.
  • si un seul fragment est corrompu, tout le paquet est corrompu.
  • en cas de renvoi, tous les fragments doivent être résolus.

C'est pourquoi TCP adopte intelligemment sa taille de trame de sorte que les paquets ne nécessitent jamais IP pour les fragmenter. Cela peut être fait en interdisant la propriété intellectuelle aux paquets de fragment et si IP rapporte qu'un paquet est trop gros pour être Envoyé, TCP réduit la taille de la trame et essaie à nouveau jusqu'à ce qu'aucune erreur ne soit rapportée.

Pour UDP, ce serait la tâche de la demande elle-même, car l'UDP est un protocole "muet", il n'a aucune logique de gestion à part entière, ce qui le rend très flexible, rapide et simple.

La seule taille UDP que vous pouvez compter sur le fait de toujours transporter est 576 moins 8 octets 8 octets UDP en-tête et moins 20 (V4)/40 (V6) Octès IP, car la norme IP nécessite que chaque hôte IP puisse recevoir des paquets IP avec une taille totale de 576 octets. Votre implémentation de protocole ne serait pas conforme standard si elle ne peut accepter de paquets d'au moins cette taille. Notez cependant que la norme ne dit pas 576 sans fragmentation, alors même un paquet IP de 576 octets peut être fragmenté entre deux hôtes.

La seule taille de paquet que vous pouvez compter pour être transportable sans fragmentation est de 24 octets pour IPv4 et 56 octets IPv6, car les plus petits en-têtes IP pour un fragment sont 20/48 octets (V4/V6) et un fragment doit avoir au moins 4/8 BYTES (V4/V6) Données de charge utile. Ainsi, un système de transport en dessous de la couche IP qui ne peut pas transporter au moins des paquets de tailles de Thèses, ne peut pas être utilisé pour transporter le trafic IP.

Et avant que quiconque ne commencère qu'un en-tête IPv6 n'a que 40 octets: c'est correct mais, contrairement à un en-tête IPv4, un en-tête IPv6 standard n'a pas de champs d'en-tête pour la fragmentation. Si un paquet doit être fragmenté, un en-tête d'extension de fragmentation doit être ajouté sous l'en-tête de base IPv6 et cet en-tête d'extension est de 8 octets longs. Contrairement à la Contrairement à IPv4, les compensations de fragmentation dans IPv6 sont comptées dans 8 octets et non pas 4 par des unités d'octets. Un fragment ne peut donc transporter qu'une charge utile qui est un multiple de 8 octets en cas de IPv6.

1
Mecki

S'éteint pour permettre à la pile TCP/IP de fragmenter les paquets, selon les besoins, il y a beaucoup de frais généraux plus bas que d'envoyer des paquets individuels.

1
geekosaur

Pour répondre à votre question ", si la taille de la charge utile de l'image est maximale de 1472 octets (selon mon manuel), comment la taille de la propriété intellectuelle peut-elle être supérieure à celle qui est 65535?"

Il est dû à une fonctionnalité de déchargement appelée UFO. (Déchargement de la fragmentation UDP). Veuillez vous reporter à - Ceci lien.

Vous pouvez vérifier et basculer les fonctions de déchargement via EthTool -K Ethx et EthTool -K Ethx respectivement.

0
Nehal Dattani

Si vous surveillez les cadres sortants, il est possible que votre adaptateur réseau prend en charge le déchargement de la segmentation et il est activé. Avec la déchargement de la segmentation activée, la carte réseau elle-même gère la segmentation du paquet/du cadre dans la taille appropriée, plutôt que la pile de réseau. Cela libère la CPU sur l'ordinateur pour effectuer d'autres tâches, améliorant les performances. Sur Linux, "EthTool -k [Device]" affichera les drapeaux de déchargement.

0
Andrew Bowers