改变 TCP 滑动窗口行为

改变 TCP 滑动窗口行为

我们知道,TCP 的拥塞控制在调整滑动窗口大小时,是采用加法(线性)增加,乘法减少的,有没有办法改成“线性减少”呢?

当数据包丢失时,TCP 会认为链路已拥塞,因此会将滑动窗口的大小减半。我想通过让滑动窗口减小 1 MSS(最大段大小)来改变此行为。

我不知道在 OS X 或 Windows 等闭源操作系统中是否可以实现,但在开源操作系统中应该可以实现,因为这不是一个可以切换的选项,所以我想我必须更改操作系统中 TCP 实现的源代码。

优先考虑 OS X 的解决方案,但是 Linux(Ubuntu)也可以。

答案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

要使用一个,你只需 modprobe 相关模块并修改 /proc/sys 如下:

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

维基百科有一个页面漂亮、清晰、信息丰富拥塞控制算法。特别是 Linux 的默认 CCA,

  # 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] ... 是 BIC TCP 的一个不那么激进、更系统的衍生品,其中窗口是自上次拥塞事件以来时间的立方函数,拐点设置为事件发生前的窗口。

拐点是曲线改变曲​​率符号的地方,IE它从凹到凸,反之亦然。这意味着,接近这个点,曲线是几乎完全是线性的,第一个校正项如上所述消失。

因此,以下说法不正确:

TCP 的拥塞控制使用...调整滑动窗口大小时乘性减少

这取决于 CCA。此外,Linux 中的标准算法 TCP-Cubic 在接近上一次拥塞事件时实际上是线性的。

相关内容