Транспортные протоколы: TCP и UDP простыми словами

Транспортные протоколы: TCP и UDP простыми словами Полезное

Транспортные протоколы — это правила, по которым данные передаются между приложениями на разных устройствах поверх сети. Они работают на транспортном уровне (уровень 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), с которых стороны нумеруют байты:

  1. Клиент шлет серверу сегмент с флагом SYN и своим начальным номером.
  2. Сервер отвечает сегментом SYN-ACK: подтверждает номер клиента и присылает свой.
  3. Клиент отвечает 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-пакет на сетевом уровне. Слово «пакет» часто используют как общее бытовое название, но на транспортном уровне корректнее говорить «сегмент» и «датаграмма».

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)