Ответ 1
Этот флаг (TCP_NODELAY
) - это опция, которая может быть включена для каждого сокета и применяется при создании сокета TCP. Это делается с определенной целью: алгоритм Nagle обычно полезен и помогает справляться с перегрузкой сети. Я сомневаюсь, что вы хотите отключить его в системе, так как ваша система, вероятно, пострадает от этой деактивации.
Чтобы отключить его для данного сокета, вы можете применить опцию TCP_NODELAY
, как описано здесь и здесь в C:
int flag = 1;
int result = setsockopt(sock, /* socket affected */
IPPROTO_TCP, /* set option at TCP level */
TCP_NODELAY, /* name of option */
(char *) &flag, /* the cast is historical cruft */
sizeof(int)); /* length of option value */
if (result < 0)
... handle the error ...
Возможно, вам придется адаптироваться к вашему языку программирования, но в основном он устанавливает флаг TCP_NODELAY
в сокет sock
, эффективно отключая алгоритм Nagle. Это справедливо для любой ОС с сокетами, поддерживающими стандарт TCP.
Если вы все еще хотите отключить алгоритм Нагле в рамках всей системы, доступны два варианта. Во-первых, вы можете перекомпилировать ваше ядро с помощью соответствующего флага (см. Руководство по распространению для этого). Второй вариант - создать программное обеспечение, которое устанавливает флаг TCP_NODELAY
для каждого существующего соединения, подобно этот код. Последний вариант должен выполняться каждый раз, когда в системе создается новое TCP-соединение.
Немного чище было бы активировать режим низкой латентности TCP:
echo 1 > /proc/sys/net/ipv4/tcp_low_latency
Это даст подсказку стеку TCP о том, какие решения необходимо предпринять, чтобы снизить задержку (что, я думаю, это то, чего вы пытаетесь достичь, отключив алгоритм Нагле). По умолчанию он настроен на оптимизацию полосы пропускания ( "0" будет считаться с /proc/sys/net/ipv4/tcp_low_latency
).