🍋 Почему ваши мелкие TCP-пакеты не отправляются сразу?



Отправляете данные через send(), а они висят в буфере 200мс? Это не баг — это Nagle's algorithm, и он работает с 1984 года.

❓ Как это работает

Когда вы пишете в TCP-сокет небольшие порции данных (например, по 10 байт), ядро не отправляет их сразу. Вместо этого алгоритм Nagle ждёт:

• Либо пока накопится достаточно данных
• Либо пока придёт ACK на предыдущий пакет
• Либо истечёт таймаут (~200мс)

// Отправка без Nagle — каждый send() = отдельный пакет
int flag = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));

// Теперь send(sock, "A", 1) уходит немедленно

🍴 Зачем он нужен?

В эпоху медленных каналов накладные расходы TCP/IP заголовков (40 байт) на каждый байт полезных данных убивали пропускную способность. Nagle агрегирует данные, снижая оверхед до приемлемых значений.

✏️ Подробнее в статье https://clc.to/3hWLcQ
Просмотры: 310
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти