UDP ne sait rien de MTU. Les paquets UDP peuvent avoir n'importe quelle taille de 8 à 65 535 octets. Les couches de protocole sous UDP peuvent envoyer un paquet d'une taille spécifique ou refuseront d'envoyer ce paquet avec une erreur si elles sont trop grandes.
La couche sous 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 plus grand que ce que la couche ci-dessous peut transporter, IP peut diviser un seul paquet en plusieurs paquets appelés fragments. Chaque fragment est en fait un paquet IP qui lui est propre (possède un en-tête IP propre) et est également envoyé seul à la destination; c'est alors la tâche de la destination de collecter tous les fragments et de reconstruire le paquet complet à partir d'eux avant de passer les données reçues sur la couche supérieure suivante (par exemple UDP).
Le protocole Ethernet ne peut transporter que des trames avec une charge utile comprise entre 46 et 1 500 octets (il existe des exceptions mais cela dépasse le cadre de cette réponse). Si les données de charge utile sont inférieures à 46 octets, elles sont remplies pour être exatiquement de 46 octets. Si les données utiles dépassent 1 500 octets, l'interface refusera de les accepter. Si cela se produit, c'est à la couche IP de décider maintenant de fragmenter le paquet, de sorte qu'aucun fragment ne dépasse 1 500 octets ou de 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 est généralement à éviter, car
- C'est gaspiller des ressources du côté de l'expéditeur.
- cela gaspille des ressources du côté récepteur.
- il augmente la surcharge du protocole pour la même quantité de données utiles.
- si un seul fragment est perdu, le paquet entier est perdu.
- si un seul fragment est corrompu, le paquet entier est corrompu.
- en cas de renvoi, tous les fragments doivent être renvoyés.
C'est pourquoi TCP adopte intelligemment sa taille de trame afin que les paquets n'aient jamais besoin d'IP pour les fragmenter. Cela peut être fait en interdisant à IP de fragmenter les paquets et si IP signale qu'un paquet est trop gros pour être envoyé, TCP réduit la taille de la trame et réessaye, jusqu'à ce qu'aucune erreur ne soit plus signalée.
Pour UDP, cependant, ce serait la tâche de l'application elle-même, car UDP est un protocole "stupide", il n'a pas de logique de gestion propre, ce qui le rend très flexible, rapide et simple.
La seule taille UDP sur laquelle vous pouvez compter pour être toujours transportable est l'en-tête UDP 576 moins 8 octets et l'en-tête IP moins 20 (v4) / 40 (v6) octets, car la norme IP requiert 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 au standard si elle ne peut pas accepter des paquets d'au moins cette taille. Notez cependant que la norme ne dit pas 576 sans fragmentation, donc même un paquet IP de 576 octets peut être fragmenté entre deux hôtes.
La seule taille de paquet sur laquelle vous pouvez compter pour être transportable sans fragmentation est de 24 octets pour IPv4 et de 56 octets IPv6, car les plus petits en-têtes IP pour un fragment sont de 20/48 octets (v4 / v6) et un fragment doit avoir au moins 4/8 octets (v4 / v6) de données utiles. Ainsi, un système de transport sous la couche IP qui ne peut pas transporter au moins des paquets de ces tailles, ne peut pas être utilisé pour transporter du trafic IP.
Et avant que quiconque commente qu'un en-tête IPv6 ne dispose que de 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 fait 8 octets. Contrairement à IPv4, les décalages de fragmentation dans IPv6 sont comptés en unités de 8 octets et non de 4 octets, donc un fragment ne peut transporter qu'une charge utile qui est un multiple de 8 octets en cas d'IPv6.