Linux 内核中的 TCP BBR 拥塞控制模块源码,它不能像普通用户态程序那样用 gcc bbr.c 直接编译。
它必须在内核源码树环境下,以外部模块 或内建模块的方式编译,且依赖运行内核的版本和头文件。
1. 编译为独立内核模块(针对当前运行的内核)
假设你的系统已安装了内核头文件(linux-headers-$(uname -r)),可以按以下步骤操作:
步骤 1:创建工作目录并放入源码
bash
mkdir -p ~/bbr_module
cp tcp_bbr.c ~/bbr_module/ # 源码文件重命名或保持原名
cd ~/bbr_module
如果你习惯使用
bbr.c,可以:
cp tcp_bbr.c bbr.c但模块名称仍由源码中的
tcp_congestion_ops .name = "bbr"决定,不影响最终模块名。
步骤 2:编写 Makefile
创建 Makefile 文件,内容如下:
makefile
obj-m := tcp_bbr.o
# 如果文件已重命名为 bbr.c,则改为 obj-m := bbr.o
如果保持文件名为
tcp_bbr.c,模块对象会自动是tcp_bbr.o。模块最终会被编译为
tcp_bbr.ko,加载时使用的名称是tcp_bbr。
步骤 3:编译模块
bash
# 一般用下述方法编译即可:
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
# 开启-O3编译(需要优化):
# make -C /lib/modules/$(uname -r)/build M=$(pwd) modules EXTRA_CFLAGS="-O3"
-C指向当前内核的构建目录(由linux-headers包提供)。M=$(pwd)指定模块源码所在目录。
如果成功,会生成 tcp_bbr.ko。
步骤 4:加载/测试模块
bash
sudo modprobe tcp_bbr # 或 insmod tcp_bbr.ko
sysctl net.ipv4.tcp_congestion_control=bbr # 启用 BBR
2. 常见问题说明
| 问题 | 原因 | 解决 |
|---|---|---|
提示缺少 net/tcp.h 等头文件 |
直接 gcc 编译会失败 |
必须使用内核构建系统(make -C /lib/modules/...) |
| 头文件版本不匹配 | 内核版本与头文件不一致 | 安装正确版本的 linux-headers: sudo apt install linux-headers-$(uname -r) |
| 需要修改内核配置才能使用 | 当前内核可能已有 BBR 模块 | 如果有,直接 modprobe tcp_bbr 即可,无需编译 |
多数现代 Linux 发行版已内置 BBR 模块,你只需:
bash
sudo modprobe tcp_bbr
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr