Ответ
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-запросы.