Ваш стек TCP реализует алгоритм Nagle, пытающийся повысить эффективность за счет буферизации данных.Это обычная оптимизация, где целью является амортизация стоимости заголовка 40+ байт (TCP + IP).Вместо того, чтобы отправлять несколько небольших пакетов, стек буферизует данные и объединяет их в более крупный пакет, тем самым уменьшая издержки заголовка.
Стеки TCP не буферизуют бесконечно.Пока в соединении есть некоторые неподтвержденные отправленные данные, отправитель продолжает буферизовать.Следующий пакет отправляется, когда:
- Полный пакет данных доступен для отправки ИЛИ
- Все ранее отправленные данные подтверждены получателем
Обычно это можно отключить, установив параметр сокета TCP_NODELAY
.
setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));