Ответ
TCP (Transmission Control Protocol) и UDP (User Datagram Protocol) — это транспортные протоколы стека TCP/IP с фундаментально разными моделями.
TCP — надежный, с установкой соединения (connection-oriented):
- Гарантии: Обеспечивает доставку данных без потерь, в правильном порядке и без дубликатов.
- Управление потоком и перегрузкой: Адаптирует скорость отправки в зависимости от возможностей получателя и загруженности сети.
- Установка соединения: Использует трехэтапное рукопожатие (SYN, SYN-ACK, ACK).
- Накладные расходы: Выше из-за заголовков, подтверждений (ACK) и механизмов контроля.
UDP — ненадежный, без установки соединения (connectionless):
- Гарантии: Не гарантирует доставку, порядок пакетов или защиту от дубликатов. Пакеты могут быть потеряны.
- Отсутствие контроля: Нет встроенного управления потоком или перегрузкой.
- Накладные расходы: Минимальные. Заголовок фиксированного размера (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 с выборочными гарантиями.