Назовите протоколы, используемые DNS, и объясните, в каких случаях применяется каждый из них.

Ответ

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