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