В чем разница между протоколами TCP и UDP?

«В чем разница между протоколами TCP и UDP?» — вопрос из категории Сети, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

TCP — надежный, с установкой соединения (connection-oriented):

  1. Гарантии: Обеспечивает доставку данных без потерь, в правильном порядке и без дубликатов.
  2. Управление потоком и перегрузкой: Адаптирует скорость отправки в зависимости от возможностей получателя и загруженности сети.
  3. Установка соединения: Использует трехэтапное рукопожатие (SYN, SYN-ACK, ACK).
  4. Накладные расходы: Выше из-за заголовков, подтверждений (ACK) и механизмов контроля.

UDP — ненадежный, без установки соединения (connectionless):

  1. Гарантии: Не гарантирует доставку, порядок пакетов или защиту от дубликатов. Пакеты могут быть потеряны.
  2. Отсутствие контроля: Нет встроенного управления потоком или перегрузкой.
  3. Накладные расходы: Минимальные. Заголовок фиксированного размера (8 байт).

Пример использования сокетов в C++ (упрощенно):

// TCP-клиент (SOCK_STREAM)
#include <sys/socket.h>
int tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
// Далее connect(), send(), recv()

// UDP-клиент (SOCK_DGRAM)
int udp_sock = socket(AF_INET, SOCK_DGRAM, 0);
// Далее sendto(), recvfrom() - без предварительного connect()

Когда что использовать:

  • TCP: Веб-браузинг (HTTP/HTTPS), электронная почта (SMTP), передача файлов (FTP), удаленный доступ (SSH). Там, где важна целостность данных.
  • UDP: Стриминг видео/аудио (потеря нескольких пакетов незаметна), VoIP, онлайн-игры (низкая задержка критична), DNS-запросы. Там, где важна низкая задержка, а потери допустимы.

В современных системах поверх UDP часто строят свои протоколы надежности (например, QUIC для HTTP/3), комбинируя скорость UDP с выборочными гарантиями.