В чем ключевые различия между протоколами TCP и UDP?

Ответ

TCP (Transmission Control Protocol) и UDP (User Datagram Protocol) — это два основных транспортных протокола в стеке TCP/IP, но они служат разным целям и имеют фундаментальные различия.

Основное отличие: TCP — это протокол, ориентированный на установление соединения и гарантирующий надежную доставку данных, в то время как UDP — протокол без установления соединения, который отдает приоритет скорости, а не надежности.

Сравнительная таблица

ХарактеристикаTCP (Transmission Control Protocol)UDP (User Datagram Protocol)
НадежностьВысокая. Гарантирует доставку пакетов.Низкая. Доставка пакетов не гарантируется.
Установка соединенияОбязательна (через "тройное рукопожатие").Отсутствует. Пакеты отправляются без предварительной договоренности.
Порядок пакетовГарантируется. Пакеты собираются в правильной последовательности.Не гарантируется. Пакеты могут прийти в любом порядке.
Контроль потокаЕсть. Управляет скоростью передачи, чтобы не перегрузить получателя.Отсутствует.
СкоростьМедленнее из-за накладных расходов на надежность.Быстрее, так как нет проверок, подтверждений и установки соединения.
Накладные расходыВысокие (заголовок 20-60 байт).Низкие (заголовок 8 байт).
Примеры использованияВеб-трафик (HTTP/HTTPS), почта (SMTP), передача файлов (FTP).Видео- и аудиостриминг, онлайн-игры, DNS, VoIP.

Примеры реализации сервера в Go:

// TCP сервер (надежный, с установкой соединения)
func runTCPServer() {
    listener, _ := net.Listen("tcp", ":8080")
    defer listener.Close()
    conn, _ := listener.Accept() // Блокирует до подключения клиента
    // ... работа с conn ...
}

// UDP сервер (быстрый, без соединения)
func runUDPServer() {
    conn, _ := net.ListenPacket("udp", ":8080")
    defer conn.Close()
    buffer := make([]byte, 1024)
    // Блокирует до получения пакета
    _, addr, _ := conn.ReadFrom(buffer) 
    // ... работа с buffer и addr ...
}