linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Сеть: L4 и выше/udp-basics

kb/network-l4 ── Сеть: L4 и выше ── beginner

UDP - User Datagram Protocol

UDP - простой протокол доставки датаграмм без установки соединения, без ретрансмитов, без гарантии порядка. Заголовок 8 байт. Применение: DNS, DHCP, QUIC, VoIP, любой случай когда задержка важнее надёжности.

view as markdownaka: udp, udp-protocol, datagram

Что делает UDP

port плюс контрольная сумма - вот и весь UDP. В отличие от [[tcp-handshake|TCP]], UDP не открывает соединение, не нумерует пакеты, не подтверждает доставку. Просто берёт твои данные, оборачивает в datagram с src/dst-портами и кидает в [[ipv4-addressing|IP]]-сеть.

Заголовок UDP - 8 байт

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     src port    |     dst port    |
+--------+--------+--------+--------+
|     length      |    checksum     |
+--------+--------+--------+--------+
|              data ...              |
  • src/dst port - 16 бит, 0-65535 (как у TCP)
  • length - длина UDP-заголовка + payload в байтах
  • checksum - 16-битная сумма заголовка + payload (опциональна в IPv4, обязательна в IPv6)

Сравни с TCP, где заголовок минимум 20 байт + опции - UDP легче в 2.5 раза.

Когда выбирать UDP

СценарийПочему UDP
DNS-запрос (один query, один ответ)TCP-handshake = 1.5×RTT накладных, не нужен
DHCP (broadcast, новый клиент)TCP не работает по broadcast
VoIP / видеозвонкипотеря 1-2 пакета < перезапрос; ретрансмит вреден
NTP (sync времени)ретрансмит ломает точность
QUIC (HTTP/3)контроль доставки в user-space, не в ядре
Стриминг (RTP)потерю кадра проще пропустить
Игры (real-time)актуальное состояние важнее старого

Когда нельзя UDP

  • Большие данные где порядок важен (HTTP/1-2, SSH, базы) - нужен TCP
  • Reliability на уровне приложения - либо ты пишешь свой ack/retry поверх UDP (как QUIC), либо не используй UDP

Размер пакета и фрагментация

Теоретический максимум UDP-payload = 65 507 байт (65535 - IP-заголовок 20 - UDP-заголовок 8). Но MTU Ethernet = 1500, и UDP > MTU → IP-фрагментация на уровне сети. Это плохо:

  • Если хоть один фрагмент потерялся - весь datagram дропается
  • Многие firewall'ы дропают фрагменты по дефолту
  • На пути MTU может быть меньше 1500 (тоннели, VPN)

Поэтому в UDP-приложениях держат payload под 1472 байта (1500 - IP - UDP). DNS исторически ограничен 512 байтами в UDP, для больших ответов переключается на TCP (или EDNS0 расширяет до 4096).

UDP-сокет на Linux

python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # UDP = SOCK_DGRAM
s.bind(("0.0.0.0", 5353))
data, addr = s.recvfrom(4096)  # blocking read одного датаграма
s.sendto(b"pong", addr)        # ответ конкретному клиенту

Никаких listen()/accept()/connect() - сразу bind() и recvfrom().

Что видно в tcpdump

IP 10.0.0.1.55321 > 8.8.8.8.53: UDP, length 32
IP 8.8.8.8.53 > 10.0.0.1.55321: UDP, length 64

Никаких флагов SYN/ACK - просто два независимых датаграма. По одному пакету tcpdump не скажет, связаны они или нет (нет state).

Заметки про conntrack

Хотя у UDP нет state, [[conntrack|netfilter conntrack]] всё равно создаёт «псевдо-соединение» по 5-tuple (src-ip, src-port, dst-ip, dst-port, proto=UDP) и держит его 30 секунд после последнего пакета. Это нужно чтобы [[nat|NAT]] работал и чтобы ответный пакет проходил RELATED,ESTABLISHED.

Когда что-то пошло не так

  • No response - UDP не сообщит об ошибке. Если порт закрыт - ядро может прислать ICMP unreachable, но это best-effort
  • Out-of-order delivery - UDP не сортирует. Приложение должно само разбираться через свой sequence-number
  • Duplicate packets - могут быть. Опять, приложение само
  • Большой пакет → TIMEOUT - вероятно фрагмент потерялся; шли меньше

§ команды

bash
ss -unlp

Все UDP-сокеты в LISTEN: -u UDP, -n числа, -l listen, -p процессы

bash
tcpdump -i any -nn 'udp port 53' -c 5

Первые 5 DNS-запросов/ответов - чистый UDP

bash
nc -u 8.8.8.8 53

Открыть UDP-сокет в netcat - можно попробовать вручную послать байты

bash
echo 'ping' | nc -u -w1 1.2.3.4 5353

Послать UDP-датаграмм и подождать секунду ответ (-w1)

bash
iperf3 -u -c host -b 100M -t 10

Замерить UDP-throughput с генерацией 100Mbit/s в течение 10с

§ см. также

  • tcp-handshakeTCP three-way handshakeTCP-соединение открывается тремя пакетами: SYN от клиента, SYN-ACK от сервера, ACK от клиента. После - соединение Established, можно слать данные.
  • portПорт - как несколько сервисов делят один IP16-битное число (0-65535), идентифицирует **процесс-получатель** на хосте. IP говорит куда (хост), порт - кому (процессу). 80 - HTTP, 443 - HTTPS, 22 - SSH.
  • coapCoAP - REST для constrained-устройств поверх UDPCoAP - REST поверх UDP для маломощных IoT-устройств. 4-байтный header, GET/POST/PUT/DELETE, response codes как HTTP. Observe для notifications. DTLS для security. Применяется в LwM2M, Thread.
  • conntrackConntrack - память Linux о всех сетевых соединенияхПодсистема ядра Linux, которая помнит каждое активное соединение. Без неё NAT не развернёт ответ на нужный приватный IP, а фаервол не отличит «новый коннект» от «уже установленного». Видна в `/proc/net/nf_conntrack`.
  • cmd-digdig - DNS-разведка с подробностямиdig - DNS-разведка. Запросить любую запись у любого сервера. +short - компактно, +trace - путь от корня, +dnssec - показать подписи. Современная замена nslookup для отладки.
  • cmd-iperf3iperf3 - измерение bandwidth`iperf3` - стандартный инструмент замера throughput TCP/UDP между двумя точками. Запускается парой server + client. Не для прода, а для теста сети.
  • quic-http3QUIC и HTTP/3 - современный транспорт поверх UDPQUIC - транспорт поверх UDP. TLS 1.3 встроен (1 RTT, 0-RTT для resume). Multiplexing без head-of-line blocking. Connection migration (Wi-Fi → 4G без drop). HTTP/3 = HTTP-семантика поверх QUIC.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки