Normalmente, o PMTUD (Path Maximum Discovery Unit Discovery) acontece sempre que um host pensa que um pacote foi descartado devido a ser muito grande.
Isso pode estar em resposta à resposta necessária à fragmentação do ICMP (tipo 3, código 4), indicando explicitamente que o pacote foi descartado. Na prática típica, todos os pacotes IPv4 são configurados com o sinalizador "não fragmentar" (DF), portanto, qualquer pacote que exceda o MTU provocará essa resposta. O IPv6 não suporta fragmentação.
Alguns roteadores ou firewalls de host descartam todo o ICMP com frequência porque um administrador ingênuo acredita que o ICMP é um risco à segurança . Ou, alguns esquemas de agregação de link podem interromper a entrega do ICMP . Um mecanismo alternativo para descobrir o MTU foi excedido e não depende do ICMP é proposto na RFC4821 .
tracepath
é a minha ferramenta Linux favorita para pesquisar MTU. Aqui está um exemplo de um host com uma MTU 9001 na LAN, mas que deve atravessar uma VPN IPsec para alcançar 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]
Os erros do ICMP podem ser observados com 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
As descobertas da MTU são armazenadas em cache. No Linux, isso pode ser observado e liberado ip
(cuidado com as mudanças desde o 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 o TCP, exceder a MTU pode ser evitado como parte da configuração da conexão. Incluído no SYN enviado por cada extremidade está um tamanho máximo de segmento (MSS). O cabeçalho TCP (20 bytes excluindo opções ) e o cabeçalho IP (20 bytes) significam que o MSS e o MTU estão relacionados por uma diferença de 40 bytes.
Aqui está um exemplo de uma configuração de conexão entre esses dois hosts ao transferir um arquivo grande com 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
No primeiro pacote, o host local propõe um MSS de 8961. Este é o 9001 MTU configurado, menos 40 bytes. O SYN / ACK retornado possui um MSS de 1379, implicando uma MTU de 1419. Por acaso sei nesta rede que o host remoto também enviou 8961, mas o valor foi modificado por um roteador, pois sabe que o caminho inclui um caminho da Internet ( MTU 1500) uma sobrecarga de um túnel IPsec. Este roteador também modificou nosso MSS enviado de 8961 para aparecer como 1419 no outro host. Isso é chamado de fixação MSS .
Então, de certa forma, o PMTUD está acontecendo o tempo todo. Na prática, isso pode realmente nunca acontecer, se a fixação do MSS estiver em vigor e todo o tráfego estiver ocorrendo através do TCP ou se nenhum dos roteadores tiver uma MTU menor do que a configurada nos pontos de extremidade. Mesmo sem a fixação do MSS, isso pode acontecer apenas raramente, quando o cache expira.