到目前为止,Linux 中的命令“sysctl”会全局更改整个系统的拥塞控制算法。但是拥塞控制,其中 TCP 窗口大小和其他类似参数是变化的,通常是每个 TCP 连接完成的。所以我的问题是:
- 是否存在可以更改每个 TCP 连接使用的拥塞控制算法的方法?
还是我在这里遗漏了一些微不足道的东西?如果是这样,它是什么?
到目前为止,Linux 中的命令“sysctl”会全局更改整个系统的拥塞控制算法。但是拥塞控制,其中 TCP 窗口大小和其他类似参数是变化的,通常是每个 TCP 连接完成的。所以我的问题是:
还是我在这里遗漏了一些微不足道的东西?如果是这样,它是什么?
这就是它的实现方式(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 具有可插入的拥塞算法,可以动态更改使用的算法,但这是一个系统范围的设置,而不是每个连接。