UDP — протокол транспортного уровня. Большая часть DNS-запросов (и много других быстрых вещей) работает поверх UDP.
### Зачем нужны уровни
* **Прикладной уровень** — это само приложение (например, dig или DNS-сервер named).
* **Транспортный уровень** — доставляет данные точно в нужный процесс на нужном порту.
DNS-сервер почти всегда слушает порт **53**.
### Как это работает
Клиент (например, dig):
* Берёт данные DNS-запроса
* Через sendto отдаёт ядру
* Ядро автоматически ставит случайный порт источника (>1024) и порт назначения 53
* Отправляет дальше
Сервер:
* Получает пакет
* Смотрит порт 53
* Кладёт данные в буфер процесса DNS-сервера (через recvfrom)
Это и есть **мультиплексирование** (сверху вниз) и **демультиплексирование** (снизу вверх). Всё, что делает UDP.
UDP — самый лёгкий протокол. Он **ничего больше не делает**: нет надёжной доставки, нет контроля перегрузки. Если приложению это нужно — оно само должно это реализовать.
TCP делает всё это за тебя, но он тяжелее и медленнее.
### Где SRE использует знания про UDP
1. **Медленная сеть** Приложение делает sendto, но ядро не успевает отправлять — вызов зависает. Решение: увеличить буфер отправкиBash
```
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.wmem_default=16777216
```
2. **Медленный получатель** Сервер не успевает читать из буфера → ядро начинает дропать пакеты UDP. Пакеты теряются навсегда (UDP не пересылает). Решение: увеличить буфер приёмаBash
```
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.rmem_default=16777216
```