更改每个连接的拥塞控制算法

Posted

技术标签:

【中文标题】更改每个连接的拥塞控制算法【英文标题】:Change congestion control algorithms per connection 【发布时间】:2011-06-09 00:05:20 【问题描述】:

Linux 中的命令 'sysctl' 现在会全局更改整个系统的拥塞控制算法。但是拥塞控制,其中 TCP 窗口大小和其他类似参数是变化的,通常是每个 TCP 连接完成的。所以我的问题是:

是否有一种方法可以更改每个 TCP 连接使用的拥塞控制算法?

或者我在这里遗漏了一些微不足道的东西?如果有,是什么?

【问题讨论】:

【参考方案1】:

这是在 iperf 中使用 -Z 选项完成的 - 补丁是 here。

这就是它的实现方式(PerfSocket.cpp,第 93 行):

    if ( isCongestionControl( inSettings ) ) 
#ifdef TCP_CONGESTION
    Socklen_t len = strlen( inSettings->mCongestion ) + 1;
    int rc = setsockopt( inSettings->mSock, IPPROTO_TCP, TCP_CONGESTION,
                 inSettings->mCongestion, len);
    if (rc == SOCKET_ERROR ) 
        fprintf(stderr, "Attempt to set '%s' congestion control failed: %s\n",
            inSettings->mCongestion, strerror(errno));
        exit(1);
    
#else
    fprintf( stderr, "The -Z option is not available on this operating system\n");
#endif

其中 mCongestion 是一个字符串,其中包含要使用的算法的名称

【讨论】:

【参考方案2】:

这似乎可以通过 get/setsockopt 实现。我找到的唯一文档是: http://lkml.indiana.edu/hypermail/linux/net/0811.2/00020.html

【讨论】:

【参考方案3】:

在较新版本的 Linux 中,可以使用 ip route ... congctl 为特定目的地设置拥塞控制。

如果有人熟悉这种方法,请编辑这篇文章。

【讨论】:

【参考方案4】:

Linux 有 pluggable congestion algorithms 可以动态更改使用的算法,但这是一个系统范围的设置,不是每个连接。

【讨论】:

是的,我知道这一点。 "$ sudo modprobe tcp_" 会将指定的算法添加为 /proc/sys/net/ipv4/tcp_available_congestion_control 中的条目。但我的问题是关于特定于连接的设置。 那不是每个连接,查找每个连接会很慢。 默认设置在 /proc/.../tcp_congestion_control。可通过 setsockopt 选择的算法在 tcp_available_congestion_control 中。还有另一个文件包含内核中安装的所有算法。然而,在同一台设备上混合不同的拥塞控制算法通常会导致一个窃取大部分带宽(reno 几乎总是丢失)

以上是关于更改每个连接的拥塞控制算法的主要内容,如果未能解决你的问题,请参考以下文章

简述拥塞控制的四种基本算法

BBR拥塞控制算法

让人很容易误解的TCP拥塞控制算法

让人非常easy误解的TCP拥塞控制算法

TCP拥塞控制算法 优缺点 适用环境 性能分析

周末闲聊TCP加速和拥塞控制