#sockets #tcp #size #ip
#сокеты #tcp #размер #ip
Вопрос:
У меня есть вариант использования, когда я отправляю данные через TCP / IP в одном направлении. Я делаю это с помощью множественных send()
вызовов с очень маленькими (по отношению к размеру кадра Ethernet) полезными нагрузками (без каких-либо флагов для send()
-call). Чтобы предотвратить раздувание моих небольших пакетов полезной нагрузки до размера полного кадра Ethernet, я подумал, что было бы неплохо использовать опцию TCP_CORK
сокета. Это работает, но при фактическом сравнении ситуации до и после использования TCP_CORK
я заметил, что такого рода агрегация уже была выполнена. Почему это так? Как я уже сказал, я не использую никаких флагов для send()
(like MSG_MORE
) или других параметров сокета, поэтому я ожидал, что мое первоначальное решение будет расточительным.
Ответ №1:
Если вы отправляете сообщения очень быстро, возможно, вы видите алгоритм Нейгла в действии. Вы должны отключить его явно. Iirc в Linux вы должны установить TCP_NODELAY, но в других операционных системах есть другие варианты.