我们知道,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 在接近上一次拥塞事件时实际上是线性的。