Назовите протоколы, используемые 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-запросы.

Ответ 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 — когда размер имеет значение, а новые протоколы — чтобы от любопытных глаз спрятаться. Всё гениальное, блядь, просто.