【发布时间】:2011-06-09 00:05:20
【问题描述】:
Linux 中的命令 'sysctl' 现在会全局更改整个系统的拥塞控制算法。但是拥塞控制,其中 TCP 窗口大小和其他类似参数是变化的,通常是每个 TCP 连接完成的。所以我的问题是:
- 是否有一种方法可以更改每个 TCP 连接使用的拥塞控制算法?
或者我在这里遗漏了一些微不足道的东西?如果有,是什么?
【问题讨论】:
标签: linux sysctl congestion-control
Linux 中的命令 'sysctl' 现在会全局更改整个系统的拥塞控制算法。但是拥塞控制,其中 TCP 窗口大小和其他类似参数是变化的,通常是每个 TCP 连接完成的。所以我的问题是:
或者我在这里遗漏了一些微不足道的东西?如果有,是什么?
【问题讨论】:
标签: linux sysctl congestion-control
这是在 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 是一个字符串,其中包含要使用的算法的名称
【讨论】:
这似乎可以通过 get/setsockopt 实现。我找到的唯一文档是: http://lkml.indiana.edu/hypermail/linux/net/0811.2/00020.html
【讨论】:
在较新版本的 Linux 中,可以使用 ip route ... congctl 为特定目的地设置拥塞控制。
如果有人熟悉这种方法,请编辑这篇文章。
【讨论】:
Linux 有 pluggable congestion algorithms 可以动态更改使用的算法,但这是一个系统范围的设置,不是每个连接。
【讨论】: