考试复习期间,不想复习,搞搞其他东西散散心,发现shadowsocks 有关于 TCP Fast Open 的更新,看说明的过程还发现了官方的速度优化指南,尝试优化自己的 ss 速度,然而报错。
执行到这一步时运行出错
sysctl --system
...
sysctl: setting key "net.ipv4.tcp_congestion_control": No such file or directory
net.ipv4.tcp_congestion_control = hybla
* Applying /etc/sysctl.conf ...
Google 一番后发现是缺少 tcp_hybla 模块,需要自己手动编译。引用一下 https://plus.google.com/+BoluoKING/posts/dLyYhBf3mwp 的科普
中美之间的线路质量不是很好,rtt较长且时常丢包。TCP的设计目的是解决不可靠线路上可靠传输的问题,即为了解决丢包,但丢包却使TCP传输速度大幅下降。HTTP协议在传输层使用的是TCP协议,所以网页下载的速度就取决于TCP单线程下载的速度(因为网页就是单线程下载的)。丢包使得TCP传输速度大幅下降的主要原因是丢包重传机制,控制这一机制的就是TCP拥塞控制算法。
Linux内核中提供了若干套TCP拥塞控制算法,这些算法各自适用于不同的环境。1)reno是最基本的拥塞控制算法,也是TCP协议的实验原型。
2)bic适用于rtt较高但丢包极为罕见的情况,比如北美和欧洲之间的线路,这是2.6.8到2.6.18之间的Linux内核的默认算法。
3)cubic是修改版的bic,适用环境比bic广泛一点,它是2.6.19之后的linux内核的默认算法。
4)hybla适用于高延时、高丢包率的网络,比如卫星链路——同样适用于中美之间的链路。
我们需要做的工作就是将TCP拥塞控制算法改为hybla算法,并且优化TCP参数。
于是又开始找 hybla 模块的编译指南,参考了这两篇文章,并且修改了一下不太明确的地方,写个修改版的指南吧。
编译过程
查看自己 vps 内核版本:
$ uname -a
4.8.3-x86_64-linode76
下载对应版本的内核源码
在这里下载 https://www.kernel.org/pub/linux/kernel/
我这里是 4.8.3
,于是进入 v4.x
目录,向下翻即找到了,复制文件地址,在vps上 wget
下载下来
mkdir kernel
cd kernel
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.8.3.tar.gz
tar xzvf linux-4.8.3.tar.gz
注意修改对应的下载地址和文件名
安装内核编译和工具
apt-get install build-essential libncurses5-dev module-init-tools
配置内核编译文件
cd linux-4.8.3
zcat /proc/config.gz > .config
然后用你喜欢的编辑器编辑 .config
文件,查找 CONFIG_TCP_CONG_CUBIC=y
,在这一行下面增加一行
CONFIG_TCP_CONG_HYBLA=y
然后编译
make
编译耗时约15~20分钟
准备编译模块
cd net/ipv4/
mv Makefile Makefile.old
vi Makefile
以下是 hybla
所用的 Makefile
# Makefile for tcp_hybla.ko
obj-m := tcp_hybla.o
KDIR := /tmp/kernel/linux-4.8.3
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
注意上面第三行 KDIR := /root/kernel/linux-3.11.6
要修改成自己解压的目录,并且最后一行必须以 tab
开头,不可以用空格,不可以用空格。不懂Makefile的规则,我在这里踩了坑。
开始编译模块
这里退回到 linux-4.8.3
目录,我是放在 /tmp/kernel
内的,后面目录相关的就不提示了
cd /tmp/kernel/linux-4.8.3
make modules
加载模块
cd /tmp/kernel/linux-4.8.3/net/ipv4
insmod ./tcp_hybla.ko
如果遇到command not found: insmod则需要手动安装
apt-get install module-init-tools
如果编译的时候如果出现如下错误
scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory
需要源安装libssl-dev就可以了
后记
至此就装好了hybla 模块,后面继续按照 优化指南 优化去了