Por que o DNS através do UDP tem um limite de 512 bytes?

14

Eu estava procurando uma resposta para essa pergunta (a do título) e a melhor coisa que encontrei foi:

No design do protocolo DNS, o tamanho do bloco de transporte UDP (tamanho da carga útil) foi limitado a 512 bytes para otimizar o desempenho enquanto gera tráfego mínimo de rede.

minha pergunta é: como exatamente isso melhora o desempenho e existem outras razões para essa limitação ao usar o UDP?

Moha, o todo-poderoso camelo
fonte
5
A questão é realmente baseada em uma premissa falsa (pelo menos uma desatualizada). O limite de carga útil de 512 bytes não existe mais, veja minha resposta abaixo.
Håkan Lindqvist

Respostas:

18

A carga útil de 512 bytes garante que os pacotes DNS possam ser remontados se fragmentados em trânsito. Além disso, de um modo geral, há menos chance de pacotes menores serem descartados aleatoriamente.

O padrão IPv4 especifica que todo host deve ser capaz de remontar pacotes de 576 bytes ou menos. Com um cabeçalho IPv4 (20 bytes, embora possa ter até 60 bytes com opções) e um cabeçalho UDP de 8 bytes, um pacote DNS com uma carga útil de 512 bytes será menor que 576 bytes.

Como o @RyanRies diz: o DNS pode usar o TCP para cargas úteis maiores e para transferências de zona e DNSSEC. Há muito mais latência quando o TCP entra em ação porque, ao contrário do UDP, há um aperto de mão entre o cliente e o servidor antes que qualquer dado comece a fluir.

Evan Anderson
fonte
7
Uma observação relacionada: o motivo pelo qual sempre haverá 13 nomes de resolvedores DNS raiz (a.root-servers.net a m.root-servers.net) é porque esse é o número máximo que pode caber em uma resposta DNS a uma consulta para a raiz sem exceder o limite de 512 bytes. Assim, mesmo à medida que adicionamos mais servidores físicos à infraestrutura DNS raiz, logicamente sempre haverá treze servidores raiz.
Phoebus
2
@RyanRies Para DNSSEC EDNS0 com uma carga útil permitida maior, é realmente o modo normal de operação, não o TCP.
Håkan Lindqvist
1
O menor MTU permitido não é de 576 bytes, é de 68 bytes no IPv4 e de 1280 bytes no IPv6.
kasperd
1
@phoebus, você pode me mostrar como 13 servidores não excedem 512 bytes e 14 servidores? qual é o cálculo por trás disso?
Titi Wangsa bin Damhore
1
512 + 60 + 8 = 580 bytes, não 576, não?
Carlo Wood
12

O DNS moderno não está mais limitado à carga útil de 512 bytes para o UDP.

Com o EDNS0 em uso, pode ser especificado um tamanho de carga útil maior, o que também costuma ser o caso de clientes com reconhecimento de DNSSEC.

O suporte para cargas úteis maiores sobre o UDP tem sido uma faca de dois gumes, no entanto, é em parte a razão pela qual o uso de servidores de nomes para ataques de amplificação se tornou mais popular, pois você pode obter uma melhor amplificação se o invasor usar uma consulta que obtenha uma resposta grande. .

Veja rfc2671 para detalhes detalhados do EDNS0

Håkan Lindqvist
fonte
2
Isso é verdade, mas ainda existem roteadores e firewalls que descartam pacotes DNS UDP acima de 512 bytes.
Ryan Ries
2
@RyanRies Sim, embora esse comportamento seja considerado incorreto pelos padrões atuais, é algo que ocasionalmente ainda causa problemas. (Em teoria, se um tem um tal limite no lugar que seria de saber para configurar o software relevante não anunciar capacidade de lidar com / não enviar respostas maiores.)
Håkan Lindqvist
1

As operações DNS, por exemplo, consultas e operações de manutenção de zona, por padrão, usam a porta 53. Por motivos de desempenho, as consultas usam o protocolo UDP com um limite de tamanho de bloco de 512 bytes. Opcionalmente, o TCP pode ser negociado transação a transação para operações de consulta, mas devido à sobrecarga de desempenho incorrida com o TCP, essa é essencialmente uma capacidade teórica. Historicamente, exceder o limite de tamanho de resposta de 512 bytes geralmente era evitado a todo custo, e de fato o limite de 13 servidores raiz IPv4 era o máximo que poderia ser retornado em uma única transação UDP de 512 bytes.

Ron Aitchison - Pro DNS e BIND 10-2011

Alex Zubkov
fonte
Obrigado. Podemos saber a fonte da citação (para atribuir a ela)?
pothi Kalimuthu
-2

É uma coisa QOS.

Como o UDP é sem estado, o tratamento de erros de pacotes não é possível.

Assim, mantendo os pacotes no tamanho máximo, há uma mudança maior que eles atingirão seu destino, reduzindo o impacto da ausência de tratamento de erros.

Garreth McDaid
fonte
Pacotes maiores não significam que o UDP faça failover no TCP. Estou entendendo mal o que você está dizendo?
mfinni
Você provavelmente está certo. Eu acho que li isso em uma RFC proposta em algum lugar.
Garreth McDaid
O UDP não falha, mas para o DNS especificamente, se a resposta for muito grande para caber ao usar o UDP, isso resultará em uma resposta truncada (a resposta real não contém todos os dados e o sinalizador 'truncado' está definido para indicar isso), o cliente pode tentar novamente usando o TCP.
Håkan Lindqvist