Ответ
DNS использует как UDP, так и TCP, оба по порту 53.
-
UDP — основной протокол. Он используется для большинства стандартных запросов (например, разрешение имени в IP-адрес), так как он быстрый и не требует установки соединения, что снижает накладные расходы.
-
TCP используется в следующих случаях:
- Когда размер ответа DNS-сервера превышает 512 байт.
- Для трансфера зон (AXFR), когда вторичный DNS-сервер запрашивает у первичного полную копию данных о зоне. TCP гарантирует полную и корректную передачу большого объема данных.
- Для расширений, которые требуют надежной доставки, например, DNS-over-TCP.
В Go для разрешения имен обычно используются высокоуровневые функции из пакета net, которые абстрагируют детали протокола:
package main
import (
"fmt"
"log"
"net"
)
func main() {
// Поиск IP-адресов, связанных с хостом
ips, err := net.LookupHost("google.com")
if err != nil {
log.Fatalf("Ошибка при поиске хоста: %v", err)
}
fmt.Println("IP-адреса для google.com:", ips)
}
Также существуют современные зашифрованные протоколы, повышающие приватность и безопасность:
- DNS-over-TLS (DoT): шифрует DNS-запросы с помощью TLS.
- DNS-over-HTTPS (DoH): инкапсулирует DNS-трафик в HTTPS-запросы.
Ответ 18+ 🔞
А, слушай, вот эта вся история с DNS — она, блядь, как два стула, только протоколы. Сидит себе на порту 53, такой хитрожопый, и решает, кому что дать.
Основная его работа — это UDP, быстрый и резвый, как мартышка на кофеине. Запрос-ответ, нахуй, без всяких там рукопожатий и соплей. 99% всех "эй, дай IP для google.com" летают именно так. Потому что быстро, ёпта!
Но иногда случается пиздец. Например, ответ не влезает в стандартные 512 байт — ну, там зона большая, записи дохуя. UDP такой: "ой, всё". И тут в дело вступает TCP, этакий здоровый бугай с гарантированной доставкой. "Не поместилось? Щас я, сука, соединение установлю и притащу тебе весь этот объёмистый ответ, хоть мегабайт, хоть два". Или когда нужно целиком зону перетащить (этот процесс зовётся AXFR) — тут только TCP, ибо доверия ебать ноль к UDP с такими объёмами.
В Go, кстати, обычно об этом не паришься. Берёшь высокоуровневую функцию из net — и она сама, хитрая жопа, решит, как там под капотом запрос слать.
package main
import (
"fmt"
"log"
"net"
)
func main() {
// Поиск IP-адресов, связанных с хостом
ips, err := net.LookupHost("google.com")
if err != nil {
log.Fatalf("Ошибка при поиске хоста: %v", err)
}
fmt.Println("IP-адреса для google.com:", ips)
}
А ещё, блядь, есть модные штуки, потому что всем надоело, что дядя из провайдера видит, какие ты сайты ищешь. Вот и придумали шифровать эту всю движуху.
- DNS-over-TLS (DoT): Заворачиваем запрос в TLS, как в бронежилет. Без ключа — нихуя не прочтёшь.
- DNS-over-HTTPS (DoH): А это вообще, блядь, маскировка под обычный веб-трафик. DNS-запросы прячут в HTTPS, и со стороны выглядит, будто ты просто картинки грузишь, а не "где там пиратский торрент" ищешь. Хитро, сука!
Вот так-то. UDP — для скорости, TCP — когда размер имеет значение, а новые протоколы — чтобы от любопытных глаз спрятаться. Всё гениальное, блядь, просто.