C - отправлять только TCP-пакет, если MTU превышен - PullRequest
0 голосов
/ 07 февраля 2011

есть ли встроенная функциональность (флаг, параметр, что угодно ...) для отправки пакета TCP только тогда, когда его MTU (почти) заполнен?Я согласен с моим предположением, что данные отправляются всегда, и не имеет значения, сколько данных они содержат (пытались выяснить это с помощью wireshark).

Ответы [ 3 ]

6 голосов
/ 07 февраля 2011

Надеюсь, я прав с моим предположением, что данные отправляются всегда

Нет, стек TCP обычно связывает данные и отправляет большие сегменты (хотя он не ждет вечно, часто просто ненадолго) - обычно Алгоритм Наглса или какой-либо другой вариант.

Могут быть и другие проблемы, влияющие на буферизацию и отправку данных, например, насколько перегружена сеть. Как правило, стек TCP очень хорош в достижении максимальной пропускной способности, и обычно вам не следует пытаться перехитрить его.

Если вам нужна меньшая задержка, вы можете отключить алгоритм Nagle, установив опцию сокета TCP_NODELAY

int ndelay = 1;
setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(char *)&ndelay ,sizeof(ndelay));

Linux также предоставляет опозитив, возможно, ближе к тому, что вы просите, с помощью TCP_CORK.

TCP_CORK Если установлено, не отправлять частичные кадры. Все в очереди частичное кадры отправляются, когда опция очищается снова. Это полезно для предварительные заголовки перед вызовом sendfile (2) или для пропускной способности оптимизация. Как в настоящее время реализовано, есть 200 потолок миллисекунды на время для какой вывод укупорен TCP_CORK. Если этот потолок достигнут, затем поставлен в очередь данные автоматически передаются. Эта опция может быть объединена с TCP_NODELAY только начиная с Linux 2.5.71. Эта опция не должна использоваться в коде предназначен для переноски.

0 голосов
/ 07 февраля 2011

TCP имеет опцию SO_SNDLOWAT, которая приближается к тому, что вы хотите.Хотя он не реализован в Linux и никак не гарантирует пакетирование.

0 голосов
/ 07 февраля 2011

Нет, нет.Вы должны скомпилировать собственный сетевой драйвер для реализации чего-то подобного.В этом также нет необходимости, поскольку в современных сетях MTU больше не играют важной роли (если вообще).

...