Fragmentation et réassemblage
Dans la complexité du monde des réseaux, chaque protocole, chaque technologie et chaque lien possède des caractéristiques propres. Un élément important, souvent sous-estimé, est la capacité de chaque technologie à transporter un certain volume d’informations en une seule fois, ce que l’on appelle la taille maximale d’unité de transmission, ou MTU (Maximum Transmission Unit).
Lorsqu’on parle de transmission de paquets sur Internet ou sur tout réseau, il faut comprendre que chaque paquet a une taille définie. Cependant, en fonction du chemin que prend ce paquet sur le réseau, il peut traverser différents types de liaisons avec des MTU différents. Par exemple, la taille standard du MTU pour Ethernet est de 1500 octets. Toutefois, lorsqu’on ajoute une étiquette VLAN (ce qui est fait dans dot1Q), le MTU peut être réduit légèrement en raison des octets supplémentaires de l’étiquette. De plus, dans des environnements comme l’ADSL, le MTU peut être encore différent, généralement 1492 octets.
Le défi est donc le suivant : comment une source peut-elle envoyer un paquet à une destination lorsque le paquet est trop gros pour être transmis sur l’une des liaisons intermédiaires? C’est ici que la fragmentation et le réassemblage entrent en jeu. Ces mécanismes assurent que les paquets de grande taille sont divisés en fragments plus petits pour pouvoir être transportés sur des liaisons avec un MTU inférieur, puis reconstitués à l’arrivée à leur destination finale. La fragmentation et le réassemblage sont des fonctions de la couche réseau, garantissant l’intégrité et la cohérence des données tout en optimisant leur transport à travers des environnements réseau hétérogènes.
La fragmentation IP v4
La fragmentation en IPv4 est un mécanisme conçu pour permettre à un paquet de données de traverser des segments de réseau qui ont une limite MTU inférieure à la taille du paquet. Lorsque cela se produit, la fragmentation est nécessaire pour diviser le paquet original en plusieurs fragments de taille plus petite, qui peuvent ensuite être transmis individuellement à travers le segment de réseau avec le MTU plus petit.
Lorsqu’un routeur détecte qu’un paquet est trop grand pour être transmis sur une interface due à une contrainte MTU, il fragmente le paquet en plusieurs fragments. Chaque fragment sera alors suffisamment petit pour traverser l’interface sans encombre. Ces fragments seront traités comme des paquets indépendants jusqu’à ce qu’ils atteignent leur destination, où ils seront réassemblés.
Un élément central de la fragmentation en IPv4 est le champ « offset » présent dans l’en-tête IPv4. Il s’agit d’un champ de 13 bits qui indique la position relative du fragment dans le paquet original. Par exemple, un offset de “8” signifie que le début du fragment se trouve 8 octets après le début du paquet original, un offset de “1024” signifie 1024 octets après le début du paquet original, et ainsi de suite.
L’utilité de cet offset réside dans le fait que les fragments n’arrivent pas nécessairement à la destination dans l’ordre dans lequel ils ont été créés. Les différents fragments d’un paquet peuvent emprunter des chemins différents à travers le réseau, et donc subir des délais distincts. En conséquence, ces fragments peuvent arriver à la destination dans un ordre différent de celui de la fragmentation originelle. L’offset permet à la machine réceptrice de comprendre l’ordre correct des fragments et de les placer dans la bonne position lorsqu’ils seront ultérieurement réassemblés.
Lorsque le paquet est divisé en fragments, chaque fragment est pourvu de sa propre entête IPv4. Cette redondance d’entêtes est nécessaire pour que chaque fragment puisse être routé indépendamment à travers le réseau jusqu’à sa destination finale. Autrement dit, bien que fragmenté, chaque morceau du paquet original est traité comme s’il était un paquet distinct.
Cependant, cette duplication des en-têtes pour chaque fragment a des conséquences en termes d’efficacité. Chaque entête IPv4 a une taille de 20 octets. Par conséquent, en fragmentant un paquet, on ajoute un surcoût en termes de bande passante puisque ces 20 octets supplémentaires sont ajoutés pour chaque nouveau fragment. Si un paquet est divisé en plusieurs fragments, cela peut représenter une augmentation significative de la quantité de données à transmettre, réduisant ainsi l’efficacité globale de la transmission.
La fragmentation successive en IPv4 introduit une couche supplémentaire de complexité au processus de fragmentation. Lorsqu’un paquet est déjà fragmenté par un routeur et continue son chemin à travers le réseau, il est possible qu’il rencontre un autre lien avec un MTU encore plus restrictif. Dans ce cas, le fragment peut être de nouveau divisé, subissant ainsi une fragmentation successive. C’est un phénomène dans lequel un fragment déjà divisé est de nouveau fragmenté en des morceaux plus petits.
La fragmentation successive peut engendrer plusieurs problèmes. Tout d’abord, elle augmente le nombre total de paquets en circulation dans le réseau. Chaque fragmentation ajoute un nouvel en-tête IP, consommant ainsi des ressources réseau supplémentaires pour le transport des en-têtes redondants. Cela réduit également l’efficacité du transport, car une proportion plus importante de la bande passante est consacrée à la transmission des en-têtes plutôt qu’aux données utiles. À chaque fragmentation successive, la probabilité d’erreur augmente. Si un seul fragment est perdu ou corrompu pendant le transport, le paquet entier doit être retransmis, ce qui peut conduire à des retards et à une diminution des performances.
Ainsi, bien que la fragmentation soit un mécanisme pour assurer la transmission de paquets sur des réseaux avec des MTU différents, elle peut aussi introduire un surcoût non négligeable en termes de bande passante due à la répétition des en-têtes pour chaque fragment. Les fragments nécessitent des ressources supplémentaires pour être traités et peuvent augmenter la latence. De plus, si un fragment est perdu en cours de route, tout le paquet doit être renvoyé, ce qui peut entraîner une inefficacité réseau. Ce sont ces préoccupations qui ont conduit à des approches différentes de la gestion de la fragmentation dans les nouvelles versions du protocole IP, comme IPv6.
Le réassemblage
Le processus de réassemblage est le complément naturel de la fragmentation. Il se déroule à la machine destinataire et vise à recomposer le paquet original à partir des fragments qui lui parviennent. Lorsque des fragments d’un paquet arrivent à la destination, celle-ci doit les regrouper pour reconstituer le paquet original. C’est là qu’interviennent les informations contenues dans l’en-tête de chaque fragment, en particulier l’offset. L’offset, comme mentionné précédemment, indique la position relative du fragment dans le paquet original, permettant ainsi à la machine réceptrice de savoir où placer chaque fragment pour reconstruire le paquet.
Il est à noter que le réassemblage nécessite une certaine gestion de la mémoire et des ressources par la machine destinataire. Les fragments peuvent arriver à des moments différents et dans un ordre quelconque. La machine réceptrice doit donc conserver en mémoire les fragments reçus jusqu’à ce que tous les fragments nécessaires aient été reçus. Cela implique aussi que la machine doit identifier quels fragments appartiennent au même paquet original. Pour ce faire, elle utilise les champs d’identification, d’adresse source et d’adresse de destination dans les en-têtes IPv4 des fragments.
Une fois tous les fragments d’un paquet reçus, la machine destinataire utilise l’offset de chaque fragment pour le positionner correctement et reconstruire le paquet original. Une fois le paquet entièrement reconstitué, il est alors traité comme n’importe quel autre paquet non fragmenté. Toutefois, si un ou plusieurs fragments d’un paquet ne parviennent pas à la destination dans un certain délai, la machine réceptrice peut décider d’abandonner le réassemblage de ce paquet. Dans un tel cas, tous les fragments déjà reçus pour ce paquet sont généralement supprimés pour libérer de la mémoire.
La fragmentation IP v6
Avec l’avènement d’IPv6, le mécanisme de fragmentation a subi des changements significatifs par rapport à IPv4. L’une des modifications les plus notables est que, dans IPv6, la fragmentation est gérée par l’expéditeur d’origine et non par les routeurs intermédiaires. Cette évolution a été introduite pour alléger la charge des routeurs et améliorer l’efficacité du routage.
Dans ce contexte, avant qu’un expéditeur ne transmette un paquet, il doit déterminer le MTU minimum du chemin emprunté par ce paquet pour atteindre sa destination. Pour y parvenir, il utilise un mécanisme appelé « Path MTU Discovery». Cette phase peut être perçue comme une forme de négociation, où l’expéditeur essaie de découvrir le plus petit MTU sur le chemin vers la destination. Le but est d’éviter les surprises en cours de route, de minimiser le besoin de fragmentation et d’optimiser la taille des paquets pour le chemin emprunté.
Une fois ce MTU minimum découvert, si l’expéditeur doit envoyer un paquet plus grand que ce MTU, il doit fragmenter le paquet lui-même avant de l’envoyer. L’entête de fragmentation IPv6, qui est un type d’entête d’extension, est utilisée pour cela. Contrairement à IPv4, où la fragmentation peut être effectuée à chaque étape du chemin par les routeurs intermédiaires, dans IPv6, seuls les fragments générés par l’expéditeur original parviennent à la destination, où ils sont réassemblés.
En IPv6, si un paquet est envoyé avec une taille supérieure au MTU du segment réseau qu’il traverse et que le principe du “Path MTU Discovery” n’a pas été correctement respecté. C’est le routeur intermédiaire qui détecte cette incompatibilité, et il ne fragmentera pas le paquet (contrairement à ce qui pourrait se passer avec IPv4). À la place, le routeur renvoie un message d’erreur de type « Packet Too Big» à l’expéditeur. Ce message contient des informations pour l’expéditeur, notamment la taille maximale du paquet que le segment réseau peut gérer, c’est-à-dire la valeur du MTU pour ce segment.
L’expéditeur, après avoir reçu le message « Packet Too Big», doit alors ajuster la taille de ses paquets en fonction de la valeur du MTU fournie dans le message et réessayer l’envoi. Si nécessaire, l’expéditeur devra fragmenter le paquet en segments de taille appropriée pour s’assurer qu’ils peuvent être transmis sur le segment réseau concerné.
En IPv6, grâce au mécanisme du « Path MTU Discovery» et du feedback basé sur le message « Packet Too Big», l’expéditeur est en mesure de connaître la taille MTU minimum du chemin emprunté par le paquet jusqu’à sa destination. Cette connaissance permet à l’expéditeur d’effectuer un découpage optimal de ses paquets, ajustant leur taille pour qu’ils correspondent précisément au MTU du segment le plus restrictif sur leur chemin.
Comparaison IPv4 et IPv6
Cette capacité d’ajuster la taille des paquets de manière optimale est un avantage distinct d’IPv6 par rapport à IPv4. Dans le cadre d’IPv4, les paquets pouvaient être fragmentés par n’importe quel routeur sur leur chemin, sans que l’expéditeur n’ait une connaissance claire du MTU de tous les segments du réseau. Cela pouvait entraîner des fragmentations non optimales, où un paquet pourrait être inutilement divisé en fragments plus petits que nécessaires, engendrant ainsi une surcharge inutile sur le réseau et une consommation inefficace des ressources. En revanche, avec IPv6, l’expéditeur peut découper ses paquets pour minimiser le nombre de fragments tout en garantissant leur transmission sans encombre. Cela optimise non seulement l’utilisation des ressources du réseau, mais améliore également les performances globales en réduisant les coûts associés à la fragmentation et au réassemblage des paquets à la destination.
3 Comments
Dans sous-chapitre “Fragmentation IPv6” : “[…] Le routeur ne fragmentera pas le paquet […]” –> supprimer “le routeur”.
“Cela pouvait entraîner des fragmentations non optimales, où un paquet pourrait être inutilement divisé en fragments plus petits que nécessaires” : comment est-ce possible que le routeur fragmente plus que nécessaire ?
un jumbo frame vers ethernet, puis vers dot1q (cf https://cours.zaretti.be/wp-content/uploads/2023/10/mtu-overhead.svg )
en IPv4: on a 6x 1496 + 6x 4
en IPv6: on a 6x 1496 + 1x 24
j’ai corrigé la formulation, merci!