Практически любое современное приложение взаимодействует с сетью. Когда вы смотрите стрим на YouTube, играете в онлайн-игру, совершаете видеозвонок или отправляете DNS-запрос, за передачу данных отвечает один из транспортных протоколов - TCP или UDP.

Если TCP делает ставку на надежность и гарантированную доставку, то UDP (User Datagram Protocol) ориентирован на максимальную скорость и минимальные задержки. Благодаря своей простоте UDP остается одним из самых востребованных транспортных протоколов Интернета спустя десятилетия после своего появления.

UDP (User Datagram Protocol) - это транспортный протокол семейства TCP/IP, который обеспечивает передачу данных между приложениями без предварительного установления соединения.

Главная идея UDP заключается в следующем:

Просто отправь пакет получателю. Если он потеряется - это не проблема самого протокола.

UDP не пытается:

  • установить соединение;
  • подтвердить получение пакетов;
  • повторно отправить потерянные данные;
  • гарантировать порядок доставки.

Благодаря этому протокол получается очень быстрым и практически не добавляет накладных расходов.


Немного истории

В конце 1970-х годов активно развивалась сеть ARPANET - предшественник современного Интернета. Уже существовал надежный транспортный протокол TCP, однако инженеры столкнулись с проблемой.

Не всем приложениям была нужна надежность.

Например:

  • голосовая связь;
  • потоковое видео;
  • телеметрия;
  • игровые серверы.

Для подобных задач гораздо важнее получить актуальную информацию прямо сейчас, чем ждать повторной передачи потерянного пакета.

В 1980 году американский инженер David P. Reed предложил новый транспортный протокол, который получил название User Datagram Protocol. Спустя несколько месяцев был опубликован документ RFC 768, официально описывающий UDP. Именно этот стандарт используется и сегодня практически без изменений.


Принцип работы UDP

В отличие от TCP, UDP является Connectionless-протоколом.

Это означает, что перед передачей данных не происходит никакого "рукопожатия" (Three-Way Handshake).

Процесс выглядит максимально просто:

  1. Приложение формирует сообщение.
  2. UDP добавляет небольшой заголовок.
  3. Датаграмма передается IP.
  4. IP пытается доставить пакет адресату.
  5. На стороне получателя пакет сразу передается приложению.

На этом обязанности UDP заканчиваются.

Если пакет потеряется - отправитель об этом даже не узнает.


Основные особенности UDP

UDP обладает несколькими важными характеристиками.

- Нет установки соединения

Передача начинается сразу после отправки первого пакета. Это позволяет значительно уменьшить задержку.

Нет подтверждения доставки

Получатель не сообщает отправителю:

  • получил ли пакет;
  • был ли пакет поврежден;
  • дошел ли пакет вообще.

Нет повторной передачи

Если пакет потерян где-то по пути, UDP не будет пытаться отправить его повторно. Если приложению необходима такая функциональность, оно должно реализовать ее самостоятельно.

Нет контроля порядка

Пакеты могут прийти:

  • в правильном порядке;
  • в обратном порядке;
  • с пропусками;
  • с дубликатами.

UDP никак это не контролирует.

Минимальные накладные расходы

Заголовок UDP занимает всего 8 байт.

Для сравнения:

  • UDP - 8 байт;
  • TCP - минимум 20 байт.

Именно поэтому UDP считается очень "легким" протоколом.


Формат заголовка UDP

Заголовок UDP состоит всего из четырех полей.

  • Source Port - 16 бит - Порт отправителя
  • Destination Port - 16 бит - Порт получателя
  • Length - 16 бит - Размер всей UDP-датаграммы
  • Checksum - 16 бит - Контрольная сумма

Общий размер заголовка: 8 байт.

- Source Port

Номер порта приложения-отправителя.

Например:

  • браузер;
  • DNS-клиент;
  • игровой клиент.

Иногда может быть равен 0.

- Destination Port

Порт приложения, которое должно принять пакет.

Например:

  • DNS - 53;
  • DHCP - 67/68;
  • NTP - 123.

- Length

Содержит длину всей UDP-датаграммы:

  • заголовок;
  • полезная нагрузка.

Минимальное значение - 8 байт.

- Checksum

Используется для проверки целостности данных. Если контрольная сумма не совпадает, пакет считается поврежденным и отбрасывается. Следует отметить, что контрольная сумма не гарантирует доставку, а лишь помогает обнаружить ошибки передачи.


Области применения UDP

Из-за отсутствия подтверждений доставки UDP идеально подходит там, где скорость важнее надежности.

DNS

Когда браузер запрашивает IP-адрес сайта, почти всегда используется UDP. Причина проста: DNS-запрос очень маленький. Если пакет потеряется, клиент просто отправит новый запрос.

Онлайн-игры

Практически все современные мультиплеерные игры используют UDP. Игроку важнее получить актуальные координаты противника через 20 мс, чем старые координаты спустя 300 мс после повторной передачи.

Видеозвонки

Во время разговора потеря одного кадра практически незаметна. Зато задержка в несколько секунд сделает разговор невозможным. Поэтому многие технологии передачи аудио и видео используют UDP.

Потоковое видео

Во многих системах IPTV, видеоконференций и прямых трансляций применяется UDP. Небольшая потеря кадров значительно менее заметна, чем длительные остановки воспроизведения.

VoIP

IP-телефония также использует UDP. Во время телефонного разговора важнее слышать собеседника с минимальной задержкой, чем ожидать повторной доставки потерянного аудиопакета.

DHCP

При получении IP-адреса компьютер еще не имеет полноценной сетевой конфигурации. Поэтому протокол DHCP использует UDP.

NTP

Протокол синхронизации времени также построен поверх UDP. Передаются небольшие сообщения, поэтому надежное соединение не требуется.


Source: Orkhan Alishov's notes