Mécanisme de découverte du PMTU
From Livre IPv6
Pour des considérations d'efficacité (voir paragraphe Protocoles réseau et transport), il est généralement préférable que les informations échangées entre équipements soient contenues dans des datagrammes de taille maximale. Cette taille dépend du chemin suivi par les datagrammes et est égale à la plus grande taille autorisée par l'ensemble des liens traversés. Elle est de ce fait appelée PMTU, ou Path Maximum Transmission Unit (unité de transfert de taille maximale sur le chemin).
Principe
Initialement, l'équipement émetteur fait l'hypothèse que le PMTU d'un certain chemin est égal au MTU du lien auquel il est directement attaché (cf. See Paquet 4 le paquet 4 de l'exemple). S'il s'avère que les paquets transmis sur ce chemin excèdent la taille maximale autorisée par un lien intermédiaire, alors le routeur associé détruit ces paquets et retourne un message d'erreur ICMPv6 de type «paquet trop grand» (voir See Protocoles réseau et transport, See Paquet trop grand), en y indiquant le MTU accepté (voir paquet 5 de l'exemple suivant). Fort de ces informations, l'équipement émetteur réduit le PMTU supposé pour ce chemin (paquet 6).
Plusieurs itérations peuvent être nécessaires avant d'obtenir un PMTU permettant à tout paquet d'arriver à l'équipement destinataire sans jamais excéder le MTU de chaque lien traversé. Le protocole IPv6 garantit que le MTU de tout lien ne peut descendre en dessous de 1 280 octets, valeur qui constitue ainsi une borne inférieure pour le PMTU. Ce protocole reposant sur la perte de paquets, il est laissé le soin aux couches supérieures de gérer la fiabilité de la communication en retransmettant si nécessaire (paquet 6 de l'exemple).
Si la détermination du PMTU se fait essentiellement lors des premiers échanges entre les équipements concernés, elle peut également être revue en cours de transfert si, suite à un changement de route, un lien plus contraignant est traversé.
L'émetteur vérifie aussi que le PMTU n'a pas augmenté en envoyant de temps en temps un paquet plus grand. Si celui-ci traverse le réseau sans problème, la valeur du PMTU est augmentée.
Signalons enfin que l'algorithme de découverte du PMTU fonctionne indifféremment avec des échanges point-à-point ou multipoints. Dans ce dernier cas, le PMTU sera le PMTU minimal permis par l'ensemble des chemins vers chaque site destinataire du groupe de diffusion.
Exemple
Cet exemple montre les premiers paquets échangés lors d'une ouverture de connexion TCP. Les machines sont situées sur deux réseaux Ethernet distincts (MTU de 1 500 octets) et interconnectés par un tunnel IPv4 (MTU de 1 480 octets du fait de la présence de l'en-tête IPv4 supplémentaire).
IPv6 Version : 6 Classe : 0x00 Label : 00000 Longueur : 40 octets (0x0028) Protocole : 6 (0x06, TCP Nombre de sauts : 64 (0x40) Source : 3ffe:302:12:2::13 (oban) Desti. : 3ffe:304:115:8300:2c0:4fff:fe61:214c (duval) TCP Port Source : 0xffad Port Destination : 0x1389 Sequence : 0x5c3e066a Acquittement : 0x00000000 Offset : 0xa Drapeaux : 0x2 (SYN) fenêtre :0x4000 Checksum : 0x9c2e Ptr Msg urgent : 0x0000 Options : - mss 1440, nop,wscale 0, timestamp 10386372 0 0000: 60 00 00 00 00 28 06 40 3f fe 03 02 00 12 00 02 0010: 00 00 00 00 00 00 00 13 3f fe 03 04 01 15 83 00 0020: 02 c0 4f ff fe 61 21 4c|ff ad 13 89 5c 3e 06 6a 0030: 00 00 00 00 a0 02 40 00 9c 2e 00 00 02 04 05 a0 0040: 01 03 03 00 01 01 08 0a 00 9e 7b c4 00 00 00 00
La phase de connexion commence avec l'émission d'un paquet SYN. Au niveau des options, la taille des segments proposée est de 1440 octets, soit une taille de paquets de 1500 octets si l'on ajoute l'en-tête IPv6 et l'en-tête TCP.
IPv6 Version : 6 Classe : 00 Label : 00000 Longueur : 40 octets (0x0028) Protocole : 6 (0x06, TCP) Nombre de sauts : 60 (0x3c) Source : 3ffe:304:115:8300:2c0:4fff:fe61:214c(duval) Desti. : 3ffe:302:12:2::13 (oban) TCP Port Source : 0x1389 Port Destination : 0xffad Sequence : 0xe3599c1a Acquittement : 0x5c3e066b Offset : 0xa Drapeaux : 0x12 (SYN ACK) fenêtre :0x42f0 Checksum : 0x145a Ptr Msg urgent : 0x0000 Options : - mss 4410, wscale 0, timestamp 4323715 10386372 0000: 60 00 00 00 00 28 06 3c 3f fe 03 04 01 15 83 00 0010: 02 c0 4f ff fe 61 21 4c 3f fe 03 02 00 12 00 02 0020: 00 00 00 00 00 00 00 13|13 89 ff ad e3 59 9c 1a 0030: 5c 3e 06 6b a0 12 42 f0 14 5a 00 00 02 04 11 3a 0040: 01 03 03 00 01 01 08 0a 00 41 f9 83 00 9e 7b c4
L'entité distante accepte la connexion ainsi que la taille de segment de 1440 octets.
IPv6 Version : 6 Classe : 00 Label : 00000 Longueur : 32 octets (0x0020) Protocole : 6 (0x06, TCP) Nombre de sauts : 64 (0x40) Source : 3ffe:302:12:2::13 (oban) Desti. : 3ffe:304:115:8300:2c0:4fff:fe61:214c (duval) TCP Port Source : 0xffad Port Destination : 0x1389 Sequence : 0x5c3e066b Acquittement : 0xe3599c1b Offset : 0x8 Drapeaux : 0x10 (ACK) fenêtre :0x4380 Checksum : 0x4b14 Ptr Msg urgent : 0x0000 0000: 60 00 00 00 00 20 06 40 3f fe 03 02 00 12 00 02 0010: 00 00 00 00 00 00 00 13 3f fe 03 04 01 15 83 00 0020: 02 c0 4f ff fe 61 21 4c|ff ad 13 89 5c 3e 06 6b 0030: e3 59 9c 1b 80 10 43 80 4b 14 00 00 01 01 08 0a 0040: 00 9e 7b c4 00 41 f9 83
Fin d'ouverture de connexion.
IPv6 Version : 6 Classe : 0 Label : 000000 Longueur : 1460 octets (0x05b4) Protocole : 6 (0x06, TCP) Nombre de sauts : 64 (0x40) Source : 3ffe:302:12:2::13 (oban) Desti. : 3ffe:304:115:8300:2c0:4fff:fe61:214c (duval) TCP Port Source : 0xffad Port Destination : 0x1389 Sequence : 0x5c3e066b Acquittement : 0xe3599c1b Offset : 0x8 Drapeaux : 0x10 (ACK) fenêtre :0x4380 Checksum : 0x40a9 Ptr Msg urgent : 0x0000 Données : 1440 octets. 0000: 60 00 00 00 05 b4 06 40 3f fe 03 02 00 12 00 02 0010: 00 00 00 00 00 00 00 13 3f fe 03 04 01 15 83 00 0020: 02 c0 4f ff fe 61 21 4c|ff ad 13 89 5c 3e 06 6b 0030: e3 59 9c 1b 80 10 43 80 40 a9 00 00 01 01 08 0a 0040: 00 9e 7b c4 00 41 f9 83|20 21 22 23 24 25 26 27 ...suite des 1440 octets de données...
Premier envoi de données, en supposant que le PMTU correspond au MSS négocié.
IPv6 Version : 6 Classe : 00 Label : 00000 Longueur : 536 octets (0x0218) Protocole : 58 (0x3a, ICMPv6) Nombre de sauts : 254 (0x0fe) Source : 3ffe:302:11:1::8 (site-router) Desti. : 3ffe:302:12:2::13 (oban) ICMPv6 Type : 2 (0x02, Paquet trop grand) Code : 0 Checksum : 0e8f7 MTU : 1480 (0x0000 05c8) Données : Paquet ayant provoque l'erreur 0000: 60 00 00 00 02 18 3a fe 3f fe 03 02 00 11 00 01 0010: 00 00 00 00 00 00 00 08 3f fe 03 02 00 12 00 02 0020: 00 00 00 00 00 00 00 13|02 00 e8 f7 00 00 05 c8| 0030: 60 00 00 00 05 b4 06 3e 3f fe 03 02 00 12 00 02 0040: 00 00 00 00 00 00 00 13 3f fe 03 04 01 15 83 00 0050: 02 c0 4f ff fe 61 21 4c|ff ad 13 89 5c 3e 06 6b 0060: e3 59 9c 1b 80 10 43 80 40 a9 00 00 01 01 08 0a 0070: 00 9e 7b c4 00 41 f9 83|20 21 22 23 24 25 26 27 suite du paquet IPv6 tronqué à 1280-48 octets ...
Le routeur gérant le tunnel annonce que ce paquet ne peut être relayé tel quel. Le paquet ICMP retourné inclut le MTU accepté par le tunnel et les premiers octets du paquet concerné. Noter que la taille de ce message ICMPv6 est limitée à 1280 octets. En pratique seule la partie utile du paquet TCP (son en-tête) a été recopiée.
IPv6 Version : 6 Classe : 00 Label : 00000 Longueur : 1440 octets (0x05a0) Protocole : (0x06, TCP) Nombre de sauts : 64 (0x40) Source : 3ffe:302:12:2::13 (oban) Desti. : 3ffe:304:115:8300:2c0:4fff:fe61:214c (duval) TCP Port Source : 0xffad Port Destination : 0x1389 Sequence : 0x5c3e066b Acquittement : 0xe3599c1b Offset : 0x8 Drapeaux : 0x10 (ACK) fenêtre :0x4380 Checksum : 0x8bb3 Ptr Msg urgent : 0x0000 Données : 1420 octets. 0000: 60 00 00 00 05 a0 06 40 3f fe 03 02 00 12 00 02 0010: 00 00 00 00 00 00 00 13 3f fe 03 04 01 15 83 00 0020: 02 c0 4f ff fe 61 21 4c|ff ad 13 89 5c 3e 06 6b 0030: e3 59 9c 1b 80 10 43 80 8b b3 00 00 01 01 08 0a 0040: 00 9e 7b c4 00 41 f9 83|20 21 22 23 24 25 26 27 0050: 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 suite des 1420 octets de données...
L'émetteur retransmet les données perdues en se limitant cette fois aux 1 420 octets permis (soit 1 480 moins les en-têtes IPv6 et TCP).
Mise en oeuvre
L'exploitation de l'information de PMTU se fait de plusieurs façons suivant l'endroit où les données à transmettre sont segmentées :
- si un protocole de type TCP est utilisé, celui-ci assurera la segmentation de façon transparente pour les applications, en fonction des informations de PMTU que pourra lui communiquer la couche IPv6.
- si un protocole de type UDP est utilisé, alors cette segmentation devra être assurée par une couche supérieure, éventuellement l'application. Il faut donc que celle-ci (1) puisse être informée du PMTU autorisé, même dans le cas où celui-ci change par la suite, et (2) puisse segmenter ses données en conséquence. Parce que ces deux conditions ne sont pas toujours réunies, IPv6 a conservé un mécanisme de fragmentation (voir See Protocoles réseau et transport, See Fragmentation).
Un deuxième aspect concerne l'identification des chemins afin de pouvoir y associer les informations de PMTU. Plusieurs possibilités, laissées à l'implémenteur, sont possibles. Un chemin peut être identifié par l'adresse destination, ou par l'identificateur de flux si celui-ci est utilisé, ou par la route suivie dans le cas où elle est imposée (voir See Protocoles réseau et transport, See Routage).
Enfin, s'il est fortement recommandé que chaque équipement supporte le mécanisme de recherche du PMTU, ce n'est pas obligatoire. Ainsi, un équipement qui n'en dispose pas (par exemple une ROM de boot) devra restreindre la taille de tout paquet transmis au MTU minimal que doit supporter tout lien, soit 1280 octets.