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 ```