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

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

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

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

【问题讨论】:

    标签: linux sysctl congestion-control


    【解决方案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 几乎总是丢失)
          猜你喜欢
          • 2019-02-25
          • 1970-01-01
          • 2015-03-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多