Назад | Перейти на главную страницу

Как протокол DNS переключается с UDP на TCP?

Прежде чем кто-нибудь спросит: я видел Когда DNS-запросы используют TCP вместо UDP? и это не отвечает на мой вопрос.

Все, что я слышу, это "если ответ будет слишком длинным, DNS будет использовать TCP". Однако это не объясняет, как это происходит.

Итак, вот ситуация: DNS-клиент запрашивает разрешение записи с помощью UDP. Запись слишком длинная для UDP:

  1. сервер отвечает определенным кодом операции, чтобы клиент переключился на TCP
  2. сервер вообще не отвечает, и клиент пытается повторно использовать TCP
  3. сервер открывает TCP соединение с клиентом (глупо, если считать NAT, но кто знает?)
  4. клиент каким-то образом (?) 'знает', что данный запрос должен выполняться через TCP, поэтому он не беспокоится о UDP в первую очередь
  5. DNS-пикси волшебным образом превращают UDP в TCP, когда это необходимо

Я искал ответ по всему Интернету, но там много шума (см. Выше), и я не могу написать правильный запрос Google для этого (и я не могу найти информацию в RFC, если на то пошло) .

Клиент заранее не знает, что ответ будет слишком большим, поэтому он будет запрашивать сервер через UDP.
Сервер ответит через UDP, включит как можно больше и установит бит усеченного заголовка («TC» http://www.networksorcery.com/enp/protocol/dns.htm).
Затем клиент может повторно отправить запрос через TCP и получить полный ответ.

Смотрите также: https://tools.ietf.org/html/rfc5966

В отсутствие EDNS0 (механизмы расширения для DNS 0) (см. Ниже) нормальное поведение любого DNS-сервера, которому необходимо отправить ответ UDP, превышающий предел в 512 байт, заключается в том, что сервер усекает ответ, чтобы он соответствовал в пределах этого лимита, а затем установите флаг TC в заголовке ответа. Когда клиент получает такой ответ, он принимает флаг TC как указание на то, что вместо этого он должен повторить попытку по TCP.

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

И, как упоминалось в комментариях, конечно, передача зон DNS всегда использует TCP.