Эффект TCP_CORK

#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, но в других операционных системах есть другие варианты.