O adaptador Ethernet do meu computador usa quadros Ethernet de 1.500 bytes. Normalmente, isso significa que o MTU da minha conexão local é de 1500
bytes.
Mas minha conexão (IPv4) com a Internet tem alguma sobrecarga. Isso significa que meu MTU real ao me comunicar com a Internet é 1492
. Isso está causando todos os problemas regulares existentes na interface MTU mal configurada.
O roteador pode corrigi-lo
Obviamente, eu poderia usar netsh
e substituir minha interface de rede por uma MTU personalizada. Mas eu não quero fazer isso. O servidor DHCP do meu roteador já sabe que o MTU é 1492
. Se solicitado, o servidor DHCP responderá com a opção 26 do DHCP:
- 26 Interface MTU =
1492
Por isso, estava me deixando louco por que o servidor DHCP não está informando à minha máquina Windows 7 a configuração da MTU como um dos itens retornados na oferta DHCP :
- 54 Identificador do servidor DHCP =
192.168.1.1
- 51 Tempo de concessão do endereço IP =
2 hours
- 1 Máscara de sub-rede =
255.255.255.0
- 15 nome de domínio =
example.local
- 3 roteador =
192.168.1.1
- 6 Domain Name Server =
8.8.8.8
,8.8.4.4
,74.82.42.42
Sem interface MTU ! Portanto, a Ethernet da minha máquina está presa em 1500
bytes.
O servidor DHCP fez o que deveria fazer
Demorou mais tempo para escavar, mas percebi que o servidor DHCP apenas fornece o que o cliente solicitou . Durante o meu Windows 7 DHCP Discover , o Windows 7 enumera a lista de todas as opções de DHCP que ele gostaria que fossem retornadas:
- 1 Máscara de sub-rede
- 15 nome de domínio
- 3 roteador
- 6 Servidor de nomes de domínio
- 44 Servidor de nomes NetBIOS sobre TCP / IP
- 46 Tipo de nó NetBIOS sobre TCP / IP
- 47 Escopo NetBIOS sobre TCP / IP
- 31 Executar a descoberta do roteador
- 33 Rota estática
- 121 Rota estática sem classe
- 249 Rota estática sem classe (Microsoft)
- 43 Informações específicas do fornecedor
O Windows 7 nem está pedindo o MTU !
Deve saber o que está fazendo
O Windows deve ter uma razão pela qual não está solicitando o MTU; mas eu não sei o que é. No começo eu pensei que era porque estava usando o Path Maximum MTU Discovery . Mas PMTU
funciona apenas para conexões TCP, usa a opção TCP MSS
(Maximum Segment Size) e requer que a MSS
opção local esteja correta.
No meu caso, a configuração TCP MSS (que vem da opção MTU) está incorreta. Isto é1460 bytes
1500 interface MTU
- 20 bytes IP header = 1480 bytes
- 20 bytes TCP header
= 1460 bytes MSS
que é muito alto.
Nota : Posso confirmar que o Windows está usando um MSS de 1460 bytes de um
SYN
pacote, quando uma conexão TCP está sendo estabelecida.
Se não o PathMTU, então o que?
O que o Windows 7 está pensando? Qual é o comportamento pretendido aqui? O que os desenvolvedores de pilha de rede da Microsoft achavam que deveria acontecer?
Agora finja que meu Internet MTU é realmente 1472 (o que é) e finja que meu adaptador Ethernet realmente usa 8,192
quadros Ethernet de byte (o que faz). O que uma corporação deveria fazer? Devo ir até todas as máquinas da empresa e digitar:
>netsh interface ipv4 set interface interface="Local Area Connection" mtu=1472 store=persistent
Isso não é razoável. E mesmo que fosse razoável, não é o que estou perguntando.
Estou tentando entender o que o Windows quer que aconteça. estou tentando entender como deve se comportar. estou tentando aprender algo aqui. Finja que meu gateway da Internet é um caixa eletrônico de 576 bytes; como instruo as máquinas com Windows 7 que o MTU se elas desejam enviar para a Internet é de 576 bytes?
Respostas:
O caminho MTU não é apenas TCP e não usa o MSS (embora, como você supôs, o MSS seja derivado do MTU). Qualquer salto que receba um pacote muito grande para encaminhar enviará um
ICMP fragmentation needed
pacote de volta à origem. Isso faz parte da camada 3 e é independente do TCP.O problema com o PMTU é que os pacotes ICMP recebidos geralmente são descartados ou não encaminhados para a origem e, portanto, a origem não sabe reduzir o tamanho do pacote.
Como seu roteador sabe que o MTU do próximo salto é 1472, ele deve enviar pacotes PMTU para seus clientes. Você pode verificar isso com o wireshark e, se não estiver fazendo isso, precisará ser corrigido.
Você tem algumas soluções alternativas. Uma é definir a interface interna da MTU do roteador para 1472, o que significa que ela é acionada antes que o roteador faça qualquer processamento. A outra opção é (se você pode fazer isso com o roteador) é ativar o bit DF para cada pacote. Essa é uma solução bastante brutal, pois todos os pacotes de tamanho completo acabarão como dois pacotes separados, um pequeno e um grande, com a sobrecarga resultante.
Em um ambiente corporativo, todas as três abordagens podem ser usadas, mas a configuração difícil do mtu na interface da LAN do roteador é bastante comum.
(Nunca deparei com uma instância em que o DHCP seja usado para mediar o MTU, na maioria dos casos não seria o lugar certo, porque o MTU interno e o MTU de borda geralmente são diferentes, onde você pode usar jumbo-frames internamente, mas precisa reduzir tamanho normal para o tráfego da Internet)
fonte
Path MTU Discovery
confiar no TCP MSS neste artigo do MSDN . vejo agora que acabei de ler errado. Consultoria RFC1191 - Path MTU Discovery teria sido a melhor escolha. Agora, fico me perguntando por que o roteador local não está respondendo com o Destino ICMP Inacessível - Fragmentação necessária, mas o sinalizador DF definido . O pfSense acaba de lançar a versão 2.1, e ele não envia o ICMP 3-4 :(