Ответ
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 ...
}