Транспортные протоколы — это правила, по которым данные передаются между приложениями на разных устройствах поверх сети. Они работают на транспортном уровне (уровень 4) модели OSI и стека TCP/IP. Два основных протокола этого уровня — TCP (Transmission Control Protocol) и UDP (User Datagram Protocol). Ниже разберем, чем они отличаются, что такое порты и сокеты, как проходит установление TCP-соединения и где вместо TCP берут UDP или QUIC.
Содержание
Что делает транспортный уровень
Сетевой уровень (IP) умеет доставить пакет от одного хоста к другому по адресу, но не различает приложения на этих хостах и не гарантирует доставку. Транспортный уровень достраивает поверх IP две вещи:
- Адресацию приложений через порты. На одном IP-адресе одновременно работают браузер, почта, мессенджер. Порт — это 16-битное число (от 0 до 65535), которое указывает, какому приложению отдать данные.
- Модель доставки. TCP дает надежный упорядоченный поток байтов, UDP — быструю доставку отдельных сообщений без гарантий.
Важно не путать единицы данных на разных уровнях. Блок TCP называют сегментом, блок UDP — датаграммой, а то, во что их упаковывает уровень IP, — пакетом. Дальше сегмент или датаграмма едет внутри IP-пакета.
Порты и сокеты
Порт отвечает на вопрос «какому приложению». Сокет — это конкретная точка соединения, пара «IP-адрес + порт» (например, 93.184.216.34:443). Соединение TCP однозначно определяется четверкой: IP и порт источника плюс IP и порт назначения.
Диапазон портов делят на три части (по классификации IANA):
- 0-1023 — системные (well-known): 80 — HTTP, 443 — HTTPS, 22 — SSH, 53 — DNS.
- 1024-49151 — зарегистрированные за конкретными сервисами.
- 49152-65535 — динамические (ephemeral), их временно занимает клиент на время соединения.
Посмотреть, какие порты слушает система, можно так:
ss -tuln
Флаги: -t — TCP, -u — UDP, -l — только слушающие сокеты, -n — не резолвить имена в номера. В выводе строка вида LISTEN 0 128 0.0.0.0:22 означает, что на порту 22 (SSH) кто-то ждет входящих TCP-соединений.
TCP: надежный поток с установлением соединения
TCP дает приложению надежный поток байтов: данные придут полностью, без дублей и в том порядке, в котором были отправлены. За это платят задержкой на установление соединения и служебными данными в заголовке.
Трехэтапное рукопожатие
Перед передачей данных стороны договариваются через трехэтапное рукопожатие (three-way handshake). В нем согласуются начальные номера последовательности (sequence number), с которых стороны нумеруют байты:
- Клиент шлет серверу сегмент с флагом SYN и своим начальным номером.
- Сервер отвечает сегментом SYN-ACK: подтверждает номер клиента и присылает свой.
- Клиент отвечает ACK, подтверждая номер сервера. Соединение установлено.
Закрывают соединение отдельно, обычно в четыре шага: каждая сторона шлет свой FIN и получает на него ACK. Направления закрываются независимо.
Надежность, порядок, контроль потока
Что именно обеспечивает надежность TCP:
- Нумерация и подтверждения. Каждый байт потока пронумерован. Получатель подтверждает принятые данные через ACK. Если подтверждение не пришло за время тайм-аута, сегмент отправляется повторно.
- Контрольная сумма. Заголовок и данные покрыты контрольной суммой; сегмент с искажением отбрасывается и переотправляется.
- Восстановление порядка. IP-пакеты могут прийти вперемешку — TCP выстраивает их обратно по номерам.
- Контроль потока (flow control). Через поле Window Size получатель сообщает, сколько байтов он готов принять в свой буфер. Отправитель не выходит за это окно — так медленный получатель не захлебывается от быстрого отправителя.
- Контроль перегрузки (congestion control). Это отдельный механизм: он ограничивает темп отправки, ориентируясь не на буфер получателя, а на состояние сети. Отправитель наращивает нагрузку постепенно (фаза slow start) и сбрасывает темп при потерях пакетов.
Контроль потока и контроль перегрузки легко спутать: первый защищает получателя от переполнения, второй — саму сеть от перегрузки. Работают они одновременно.
UDP: быстрая доставка без гарантий
UDP не устанавливает соединение и не хранит его состояние. Приложение просто отправляет датаграмму на адрес и порт — и все. Датаграмма может потеряться, продублироваться или прийти не в том порядке; UDP этого не заметит и не исправит.
Что дает такой отказ от гарантий:
- Меньше задержка. Нет рукопожатия и ожидания подтверждений — данные уходят сразу.
- Компактный заголовок. У UDP он всего 8 байт против минимум 20 байт у TCP.
- Broadcast и multicast. UDP умеет рассылку многим получателям, TCP — только соединение «точка-точка».
Где это уместно, если единичные потери не критичны, а важнее скорость:
- DNS — короткий запрос-ответ, дешевле переспросить, чем держать соединение.
- Онлайн-игры и VoIP — устаревший кадр или слог уже не нужен, ждать его переотправку смысла нет.
- Потоковое видео и стриминг — плавность важнее абсолютной полноты.
Если при этом нужна какая-то надежность, ее добавляют в самом приложении поверх UDP — именно так устроен QUIC.
QUIC и HTTP/3
QUIC — транспортный протокол, который работает поверх UDP и переносит механизмы TCP (установление соединения, надежность, контроль перегрузки) в пространство приложения, добавляя встроенное шифрование. На нем построен HTTP/3.
Зачем это понадобилось: QUIC объединяет установление соединения и TLS-рукопожатие, поэтому старт быстрее, чем у связки TCP + TLS. Он также убирает проблему head-of-line blocking между потоками: потеря одного пакета не тормозит остальные независимые потоки внутри соединения. Базовая спецификация QUIC — RFC 9000, HTTP/3 — RFC 9114.
TCP или UDP: сравнение
| Параметр | TCP | UDP |
|---|---|---|
| Соединение | Устанавливается (рукопожатие) | Нет, шлется сразу |
| Единица данных | Сегмент | Датаграмма |
| Гарантия доставки | Есть (подтверждения, переотправка) | Нет |
| Порядок доставки | Восстанавливается | Не гарантируется |
| Контроль потока и перегрузки | Есть | Нет |
| Размер заголовка | От 20 байт | 8 байт |
| Рассылка many-to-many | Нет | Broadcast, multicast |
| Скорость и задержка | Ниже из-за служебной работы | Выше |
| Типичное применение | HTTP/HTTPS, SMTP, SSH, FTP | DNS, VoIP, игры, стриминг |
Простой ориентир для выбора: нужна целостность и порядок данных (страница, файл, письмо, транзакция) — берут TCP. Нужна минимальная задержка, а редкие потери терпимы (голос, видео, игровой трафик) — берут UDP или построенный поверх него протокол вроде QUIC.
Выводы
- Транспортный уровень (уровень 4 OSI) адресует данные конкретным приложениям через порты и задает модель доставки — надежную у TCP или без гарантий у UDP.
- TCP устанавливает соединение трехэтапным рукопожатием SYN / SYN-ACK / ACK и обеспечивает порядок, подтверждения, контроль потока и контроль перегрузки.
- UDP не хранит состояние соединения: он быстрее и компактнее, но доставку, порядок и целостность при необходимости добирает само приложение.
- Сокет — это пара «IP + порт»; порты 0-1023 закреплены за системными сервисами, а клиент берет временный порт из динамического диапазона.
- QUIC переносит надежность в пространство приложения поверх UDP и лежит в основе HTTP/3.
Где применяется / связь с практикой
Понимание транспортных протоколов — базовый навык сетевого инженера: без него не диагностировать, почему сервис недоступен (закрытый порт, потеря сегментов, переполнение окна), и не настроить корректно фаервол или балансировщик. На практике это чтение вывода ss, tcpdump, анализ рукопожатий и подбор TCP или UDP под задачу сервиса.
Освойте тему на практике
Разобрать транспортный уровень вместе с маршрутизацией, коммутацией и диагностикой сети можно на курсе Сетевой инженер. Basic. Посмотреть формат занятий и темы вживую помогают открытые уроки Otus.
FAQ
Может ли одно приложение использовать и TCP, и UDP одновременно?
Да. Классический пример — DNS: короткие запросы идут по UDP на порту 53, а передача зоны или ответы больше лимита датаграммы — по TCP на том же порту. Номер порта может совпадать, потому что TCP и UDP — разные протоколы и их порты независимы.
Порт 80 у TCP и порт 80 у UDP — это один порт?
Нет. Пространства портов TCP и UDP раздельны. Сокет однозначно задается тройкой «протокол + IP + порт», поэтому TCP:80 и UDP:80 — две разные точки.
Чем сегмент отличается от пакета и датаграммы?
Сегмент — единица данных TCP, датаграмма — единица UDP, оба они инкапсулируются в IP-пакет на сетевом уровне. Слово «пакет» часто используют как общее бытовое название, но на транспортном уровне корректнее говорить «сегмент» и «датаграмма».



