Como o protocolo DNS muda de UDP para TCP?

31

Antes que alguém pergunte: eu já vi Quando as consultas DNS usam TCP em vez de UDP? e isso não responde à minha pergunta.

Tudo o que continuo ouvindo é " se a resposta for muito longa, o DNS usará o TCP ". Isso não explica como isso acontece.

Então, aqui está a situação: o cliente DNS solicita a resolução de um registro usando UDP. O registro é muito longo para o UDP:

  1. servidor responde com código de operação específico, para que o cliente mude para TCP
  2. servidor não responde e o cliente tenta novamente por TCP
  3. servidor abre a conexão TCP com o cliente (estúpido, se você contar NAT, mas quem sabe?)
  4. de alguma forma, o cliente (?) 'sabe' que a consulta especificada deve ser executada sobre TCP para que não se incomode com o UDP em primeiro lugar
  5. Os pixies do DNS transformam UDP em TCP quando necessário

Eu tenho procurado por toda a Internet a resposta, mas há muito barulho (veja acima), e não consigo escrever uma consulta adequada do Google para isso (nem consigo encontrar as informações nos RFCs). .

StanTastic
fonte
11
Tudo o que pude encontrar foi no RFC5966: "Um resolvedor DEVE enviar uma consulta UDP primeiro, mas PODE optar por enviar uma consulta TCP, se houver boas razões para esperar que a resposta seja truncada se for enviada por UDP (com ou sem EDNS0 ) ou por outros motivos operacionais, em particular, se ele já tiver uma conexão TCP aberta com o servidor. ". Quando o resolvedor deve "esperar" que a resposta será truncada?
21415 StanTastic #
6
Um exemplo óbvio seria se uma solicitação anterior para o mesmo registro fosse muito longa para caber em um datagrama UDP.
David Schwartz
11
Portanto, há um código de código que diz 'truncado', certo? E muda então - basicamente o que eu pensei, é a solução mais óbvia.
StanTastic
11
O caso (d) pode ser uma escolha sábia se a consulta contiver várias "perguntas" (endereços a serem resolvidos). Se você precisar resolver 100 endereços, não poderá ajustar a resposta em um único pacote UDP.
MSalters
11
1.e 4.ambos estão aproximadamente corretos (qual dos dois depende das circunstâncias).
kasperd

Respostas:

45

O cliente não sabe antecipadamente que a resposta será muito grande e, portanto, consultará o servidor via UDP.
O servidor responderá via UDP e incluirá o máximo possível e definirá o bit do cabeçalho truncado ("TC" http://www.networksorcery.com/enp/protocol/dns.htm ).
O cliente pode reenviar a solicitação via TCP e obter a resposta completa.

Veja também: https://tools.ietf.org/html/rfc5966

Na ausência do EDNS0 (Mecanismos de Extensão para DNS 0) (veja abaixo), o comportamento normal de qualquer servidor DNS que precise enviar uma resposta UDP que exceda o limite de 512 bytes é para o servidor truncar a resposta para que ela se encaixe dentro desse limite e defina o sinalizador TC no cabeçalho da resposta. Quando o cliente recebe essa resposta, recebe o sinalizador TC como uma indicação de que deve tentar novamente pelo TCP.

E: https://www.ietf.org/rfc/rfc2181.txt

E, como mencionado nos comentários, é claro que as transferências de zona DNS estão sempre usando o TCP.

falsificador
fonte
2
O RFC 5966 também observa que o TCP é sempre usado para transferências de zona.
Matt Nordhoff
@MattNordhoff Certo, isso é verdade e é bom mencionar. Isso foi mais direcionado ao 'como funciona a troca de UDP para TCP?' ângulo. Mas vou adicioná-lo à resposta.
faker
No entanto, se já existe uma conexão TCP ela só vai usar TCP
Jim B
Oh isso é interessante. Então, quando ele voltará ao UDP?
StanTastic
@ JimB Você tem certeza disso? Eu não acho que mantém uma conexão TCP persistente aberta.
Barmar