Как протокол DNS переключается с UDP на TCP?
Прежде чем кто-нибудь спросит: я видел, когда DNS-запросы используют TCP вместо UDP? и это не отвечает на мой вопрос.
Все, что я продолжаю слышать, это "если ответ слишком длинный, DNS будет использовать TCP". Это не объясняет, как это происходит, хотя.
Итак, вот ситуация: DNS-клиент запрашивает разрешение записи с использованием UDP. Запись слишком длинная для UDP:
- сервер отвечает определенным кодом операции, чтобы клиент переключился на TCP
- сервер не отвечает вообще, а клиент пытается через TCP
- Сервер открывает TCP-соединение с клиентом (глупо, если вы считаете NAT, но кто знает?)
- клиент каким-то образом (?) "знает", что данный запрос должен выполняться по TCP, чтобы он не беспокоился о UDP в первую очередь
- DNS-феи волшебным образом превращают UDP в TCP при необходимости
Я искал ответ по всему Интернету, но там много шума (см. Выше), и я не могу написать правильный запрос Google для этого (и при этом я не могу найти информацию в RFC),
1 ответ
Клиент заранее не знает, что ответ будет слишком большим, поэтому он будет запрашивать сервер через 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.