Отправляете данные через 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 агрегирует данные, снижая оверхед до приемлемых значений.
✏️ Подробнее в статье...
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом