En règle générale, la découverte d'unité de transmission maximale de chemin (PMTUD) se produit chaque fois qu'un hôte pense qu'un paquet a été abandonné en raison de sa trop grande taille.
Cela peut être en réponse à la fragmentation ICMP requise (type 3, code 4) réponse indiquant explicitement que le paquet a été abandonné. Dans la pratique courante, tous les paquets IPv4 sont définis avec l'indicateur "ne pas fragmenter" (DF), de sorte que tout paquet dépassant la MTU provoquera une telle réponse. IPv6 ne prend pas du tout en charge la fragmentation.
Certains routeurs ou pare-feu hôtes suppriment souvent tous les protocoles ICMP car un administrateur naïf estime que les protocoles ICMP constituent un risque pour la sécurité . Ou, certains schémas d'agrégation de liens peuvent interrompre la livraison ICMP . Un autre mécanisme pour découvrir le MTU a été dépassé qui ne repose pas sur ICMP est proposé dans la RFC4821 .
tracepath
est mon outil Linux préféré pour sonder MTU. Voici un exemple d'un hôte avec un MTU 9001 sur le LAN, mais qui doit traverser un VPN IPsec pour atteindre 10.33.32.157:
$ tracepath -n 10.33.32.157
1?: [LOCALHOST] pmtu 9001
1: 10.1.22.1 0.122ms pmtu 1500
1: 169.254.3.1 1.343ms pmtu 1422
1: 10.255.254.61 23.790ms
2: no reply
^C [this host won't return an ICMP port unreachable, so tracepath won't terminate]
Les erreurs ICMP peuvent être observées avec tcpdump
:
$ sudo tcpdump -p -ni eth0 'icmp and icmp[0] == 3 and icmp[1] == 4'
14:46:57.313690 IP 10.1.22.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1500), length 36
14:46:57.315080 IP 169.254.3.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1422), length 556
Les découvertes MTU sont mises en cache. Sous Linux, cela peut être observé et vidé ip
(attention aux changements depuis Linux 3.6 ):
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0 src 10.1.22.194
cache expires 591sec mtu 1422
$ sudo ip route flush cache
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0 src 10.1.22.194
cache
Pour TCP, le dépassement du MTU peut être évité dans le cadre de la configuration de la connexion. La taille maximale de segment (MSS) est incluse dans le SYN envoyé par chaque extrémité. L'en-tête TCP (20 octets hors options ) et l'en-tête IP (20 octets) signifient que MSS et MTU sont liés par une différence de 40 octets.
Voici un exemple de configuration de connexion entre ces deux hôtes lors du transfert d'un gros fichier avec scp
:
$ sudo tcpdump -p -ni eth0 'host 10.33.32.157 and tcp[13]&2 == 2'
IP 10.1.22.194.45853 > 10.33.32.157.22: Flags [S], seq 634040018, win 26883, options [mss 8961,sackOK,TS val 10952240 ecr 0,nop,wscale 7], length 0
IP 10.33.32.157.22 > 10.1.22.194.45853: Flags [S.], seq 1371736848, ack 634040019, win 26847, options [mss 1379,sackOK,TS val 10824267 ecr 10952240,nop,wscale 7], length 0
Dans le premier paquet, l'hôte local propose un MSS de 8961. Il s'agit du 9001 MTU configuré, moins 40 octets. Le SYN / ACK retourné a un MSS de 1379, ce qui implique un MTU de 1419. Il se trouve que dans ce réseau, l'hôte distant a également envoyé 8961, mais la valeur a été modifiée par un routeur car il sait que le chemin comprend un chemin Internet ( MTU 1500) une surcharge d'un tunnel IPsec. Ce routeur a également modifié notre MSS envoyé de 8961 pour apparaître comme 1419 sur l'autre hôte. C'est ce qu'on appelle le serrage MSS .
Donc, dans un sens, PMTUD se produit tout le temps. En pratique, cela peut en fait ne jamais se produire, si le serrage MSS est en place et que tout le trafic se produit via TCP, ou si aucun des routeurs n'a une MTU plus petite que celle configurée sur les points de terminaison. Même sans serrage MSS, cela ne peut se produire que rarement, lorsque le cache expire.