Normalmente, el descubrimiento de unidad de transmisión máxima de ruta (PMTUD) ocurre cada vez que un host piensa que un paquete se descartó debido a que es demasiado grande.
Esto puede ser en respuesta a la respuesta de fragmentación requerida de ICMP (tipo 3, código 4) que indica explícitamente que el paquete se descartó. En la práctica típica, todos los paquetes IPv4 se configuran con el conjunto de indicadores "no fragmentar" (DF), por lo que cualquier paquete que supere la MTU generará dicha respuesta. IPv6 no admite fragmentación en absoluto.
Algunos enrutadores o firewalls de host eliminan todos los ICMP a menudo porque un administrador ingenuo cree que ICMP es un riesgo de seguridad . O, algunos esquemas de agregación de enlaces pueden interrumpir la entrega de ICMP . En RFC4821 se propone un mecanismo alternativo para descubrir la MTU que no se basa en ICMP .
tracepath
es mi herramienta de Linux favorita para probar MTU. Aquí hay un ejemplo de un host con una MTU 9001 en la LAN, pero que debe atravesar una VPN IPsec para llegar a 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]
Los errores ICMP se pueden observar con 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
Los descubrimientos de MTU se almacenan en caché. En Linux, esto se puede observar y enjuagar ip
(tenga cuidado con los cambios desde 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
Para TCP, se puede evitar exceder la MTU como parte de la configuración de la conexión. En el SYN enviado por cada extremo se incluye un tamaño máximo de segmento (MSS). El encabezado TCP (20 bytes excluyendo opciones ) y el encabezado IP (20 bytes) significan que MSS y MTU están relacionados por una diferencia de 40 bytes.
Aquí hay un ejemplo de una configuración de conexión entre estos dos hosts al transferir un archivo grande con 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
En el primer paquete, el host local propone un MSS de 8961. Esta es la MTU 9001 configurada, menos 40 bytes. El SYN / ACK devuelto tiene un MSS de 1379, lo que implica una MTU de 1419. Sé que en esta red el host remoto también envió 8961, pero un enrutador ha modificado el valor ya que sabe que la ruta incluye una ruta de Internet ( MTU 1500) una sobrecarga desde un túnel IPsec. Este enrutador también modificó nuestro MSS enviado de 8961 para que aparezca como 1419 en el otro host. Esto se llama sujeción MSS .
Entonces, en cierto sentido, PMTUD está sucediendo todo el tiempo. En la práctica, puede que nunca suceda si la sujeción de MSS está en su lugar y todo el tráfico se produce a través de TCP, o si ninguno de los enrutadores tiene una MTU menor que la configurada en los puntos finales. Incluso sin la sujeción de MSS, puede ocurrir solo en raras ocasiones, cuando caduca el caché.