本文目录导读:

net.ipv4.tcp_allowed_congestion 这个参数在标准的 Linux 内核中 并不存在,你很可能想查询的是 net.ipv4.tcp_congestion_control(设置当前使用的拥塞控制算法)以及 net.ipv4.tcp_available_congestion_control(查看当前内核支持的算法)。
如果你确实是在寻找如何允许或禁止某个特定的拥塞控制算法被内核加载和使用(即将其放入“许可列表”),对应的内核参数是:
net.ipv4.tcp_allowed_congestion_control
(注意:末尾有 _control)
这个参数控制哪些拥塞控制算法可以被非特权进程(非 root 用户)使用,它是一个字符串列表,包含允许使用的算法名称。
如何检查和修改(以 bbr 为例)
-
查看当前允许的算法:
sysctl net.ipv4.tcp_allowed_congestion_control # 或 cat /proc/sys/net/ipv4/tcp_allowed_congestion_control
输出示例:
bbr cubic reno(表示允许使用 bbr, cubic, reno 三种算法) -
临时允许某个算法: 如果你想允许
bbr,可以这样写:sudo sysctl -w net.ipv4.tcp_allowed_congestion_control="bbr cubic reno"
注意: 你不能只写一个算法名(比如只写
bbr),它基本会覆盖掉列表,导致之前允许的cubic或reno被移除,通常做法是完整列出你想要保留的所有算法。 -
永久允许(写入配置文件): 编辑
/etc/sysctl.conf或/etc/sysctl.d/下的文件(如99-ckock.conf):net.ipv4.tcp_allowed_congestion_control = bbr cubic reno然后应用:
sudo sysctl -p
关键区别与注意事项
| 参数名 | 作用 | 影响范围 |
|---|---|---|
tcp_congestion_control |
当前正在使用的算法 | 直接决定新连接的拥塞控制行为 |
tcp_available_congestion_control |
内核编译时支持或已加载模块的算法列表 | 只读,不能修改 |
tcp_allowed_congestion_control |
允许非 root 用户/进程使用的算法 | 限制哪些算法可以被普通用户程序调用 |
核心点:
- 如果你用
root运行程序,tcp_allowed_congestion_control限制基本无效,root 可以通过setsockopt()使用任何已加载的算法。 - 如果你用普通用户运行程序(例如容器场景或非特权网络),则需要确保目标算法在
allowed列表中。
常见错误场景
如果你执行 sysctl net.ipv4.tcp_allowed_congestion(少了末尾的_control),系统会提示:
error: "net.ipv4.tcp_allowed_congestion" is an unknown key
请确认你的参数完整名称是 net.ipv4.tcp_allowed_congestion_control。
要允许某个拥塞控制算法(如 bbr),你需要:
- 确认内核已加载该算法(见
tcp_available_congestion_control)。 - 将该算法名称添加到
net.ipv4.tcp_allowed_congestion_control的列表中,并保留你需要的其他算法(如 cubic, reno)。 - 最后通过
net.ipv4.tcp_congestion_control切换到该算法。
标签: dctcp