5

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

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

还是我在这里遗漏了一些微不足道的东西?如果是这样,它是什么?

4

4 回答 4

6

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

这就是它的实现方式(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是一个字符串,其中包含要使用的算法的名称

于 2011-06-07T19:46:36.357 回答
2

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

于 2011-03-17T11:19:15.540 回答
1

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

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

于 2018-08-17T08:19:28.430 回答
-1

Linux 具有可插入的拥塞算法,可以动态更改使用的算法,但这是一个系统范围的设置,而不是每个连接。

于 2011-01-14T08:43:15.933 回答