Antes que alguém pergunte: eu vi Quando as consultas DNS usam TCP em vez de UDP? e não responde a minha pergunta.
Tudo o que ouço é " 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 UDP:
- respostas do servidor com opcode específico, para que o cliente mude para TCP
- o servidor não responde e o cliente tenta novamente pelo TCP
- servidor abre conexão TCP com cliente (estúpido, se você contar NAT, mas quem sabe?)
- o cliente de alguma forma (?) 'sabe' que determinada consulta deve ser executada sobre TCP, para que não se incomode com o UDP em primeiro lugar
- DNS pixies transformam magicamente UDP em TCP quando necessário
Procurei a resposta em toda a Internet, mas há muito ruído (veja acima) e não consigo escrever uma consulta adequada do Google para isso (nem consigo encontrar as informações em RFCs, nesse caso) .
O cliente não sabe de antemão que a resposta será muito grande, então ele consultará o servidor via UDP.
O servidor responderá via UDP e incluirá o máximo possível e definirá o bit de 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://www.rfc-editor.org/rfc/rfc5966
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 TCP.