1

Все мы знаем, что в TCP для контроля перегрузки используется аддитивное (линейное) увеличение и мультипликативное уменьшение при настройке размера скользящего окна. Есть ли способ изменить его на "линейное уменьшение"?

Когда пакет потерян, TCP предполагает, что ссылка перегружена, поэтому он сокращает размер скользящего окна пополам. Я хочу изменить это поведение, уменьшив скользящее окно на 1 MSS (максимальный размер сегмента).

Я не знаю, возможно ли это в операционных системах с закрытым исходным кодом, таких как OS X или Windows, но это должно быть возможно в операционных системах с открытым исходным кодом, так как это не вариант, который можно переключать, я думаю, мне нужно изменить исходный код реализации TCP в ОС.

Решения для OS X предпочтительнее, но Linux (Ubuntu) тоже подойдет.

1 ответ1

1

Я не знаю много о Mac, но ... проверка выходных

   sysctl -a | grep net.inet.tcp

показал, что он знает о существовании алгоритмов контроля заторов:

   net.inet.tcp.rfc1323: 1

явно позволяет реализовать RFC1323, директиву IEEE об улучшении TCP. Тем не менее, нет никакого поля, касающегося выбора CCA, что, в свою очередь, предполагает, что LEDBAT является единственным доступным выбором.

В Linux вместо этого хранятся доступные алгоритмы управления перегрузкой:

 $ ls /lib/modules/`uname -r`/kernel/net/ipv4/
   ah4.ko        ip_gre.ko     tcp_bic.ko        tcp_illinois.ko  tcp_veno.ko      xfrm4_mode_beet.ko
   esp4.ko       ipip.ko       tcp_diag.ko       tcp_lp.ko        tcp_westwood.ko  xfrm4_mode_transport.ko
   gre.ko        ip_tunnel.ko  tcp_highspeed.ko  tcp_probe.ko     tcp_yeah.ko      xfrm4_mode_tunnel.ko
   inet_diag.ko  ip_vti.ko     tcp_htcp.ko       tcp_scalable.ko  tunnel4.ko       xfrm4_tunnel.ko
   ipcomp.ko     netfilter     tcp_hybla.ko      tcp_vegas.ko     udp_diag.ko

Чтобы использовать один из них, вы просто запустите соответствующий модуль и измените /proc /sys следующим образом:

  echo "westwood" > /proc/sys/net/ipv4/tcp_congestion_control 

В Википедии есть хорошая, кристально чистая, информативная страница, посвященная алгоритмам контроля заторов. В частности, CCA по умолчанию в Linux,

  # sysctl -a | grep net.ipv4 | grep congestion
  net.ipv4.tcp_allowed_congestion_control = cubic reno
  net.ipv4.tcp_available_congestion_control = cubic reno
  net.ipv4.tcp_congestion_control = cubic

TCP-Cubic, хорошо описано здесь.

В отношении вашего вопроса указано, что:

[CUBIC] ... является менее агрессивной и более систематической производной TCP BIC, в которой окно является кубической функцией времени с момента последнего события перегрузки, с точкой перегиба, установленной в окне до события.

Точка перегиба - это место, где кривая меняет знак кривизны, то есть она переходит от вогнутой к выпуклой или наоборот. Это означает, что вблизи этой точки кривая почти точно линейная, а первый поправочный член исчезает, как описано выше.

Таким образом, это не правда, что

Контроль перегрузки TCP использует ... мультипликативное уменьшение при настройке размера скользящего окна

Это зависит от ОСО. Кроме того, стандартный в Linux, TCP-Cubic, практически линейно близок к последнему событию перегрузки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .