链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践
正如《Understanding Multipath TCP: High availability for endpoints and the networking highway of the future》中所说的那样:
The days when you used a horse and buggy to travel to town along a dusty, wheel-rutted path are gone.
骑着马车尘士飞扬,沿着印满车轮小路进城的日子,已经一去不复返了。
如今的道路更加复杂,到达公司也有许多条路线可以走,其中最快的非高速公路莫属。
网络的发展也有点像道路系统的爆炸性增长,而多路径 TCP(MPTCP)则是未来的高速公路,提供了一种增强无线、互联网和数据中心网络性能的方法。
1.前言
有什么办法可以让网络传输时让链路叠加,以实现网络传输时的“更快更强”?
搜索一些资料后发现主要有以下技术:
- LACP(Link Aggregation Control Protocol,链路汇聚控制协议),一般使用支持LACP的设备进行链路汇聚
- linux bond,在具有多网口的linux服务器上配置bond,根据需求使用指定的bond类型实现链路汇聚
- MPTCP(MultiPath TCP),在现有的TCP协议上扩展实现的多路径传输协议,可将数据包拆分为多个子包传输
本文使用更偏向网络层的MPTCP进行实践,因其与LACP和Linux bond相比MPTCP更加灵活。关于MPTCP的细节可参见Multipath TCP for Linux 和RFC8684。
2.点到点链路聚合
2.1 拓扑
拓扑由client和server组成,中间使用2层交换机连接。左右两台机器均为ubuntu22.04
- client有两个网卡
- eth1,ip:192.168.140.231/24,出口限速:300Mbit/s
- eht2,ip:192.168.140.232/24,出口限速:200Mbit/s
- server有1个网卡
- eth0,ip:192.168.140.110/24,网口为2.5Gbit/s无限速
目标: 让client与server访问时实现链路聚合,300Mbit/s+200Mbit/s
2.1.1 client端限速配置(模拟限速)
client-eth1对应接口别名为:enp1s0,ip:192.168.140.231
client-eth2对应接口别名为:enp8s0,ip:192.168.140.232
使用tc模拟client端的出口限速,对enp1s0(eth1)限速,限速为300Mbit/s,配置命令如下:
# 删除任何现有的qdisc
sudo tc qdisc del dev enp1s0 root
# 查看当前qdisc策略
tc qdisc show dev enp1s0
# 添加策略
sudo tc qdisc add dev enp1s0 root handle 1: htb default 12
# 设置带宽,300bit
sudo tc class add dev enp1s0 parent 1:1 classid 1:12 htb rate 300mbit ceil 300mbit
# 查看qdisc策略
sudo tc qdisc show dev enp1s0
# 查看class策略
sudo tc class show dev enp1s0
对enp8s0(eth2)限速,限速为200Mbit/s,配置命令如下:
# 删除任何现有的qdisc
sudo tc qdisc del dev enp8s0 root
# 查看当前qdisc策略
tc qdisc show dev enp8s0
# 添加策略
sudo tc qdisc add dev enp8s0 root handle 1: htb default 12
# 设置带宽,300bit
sudo tc class add dev enp8s0 parent 1:1 classid 1:12 htb rate 200mbit ceil 200mbit
# 查看qdisc策略
sudo tc qdisc show dev enp8s0
# 查看class策略
sudo tc class show dev enp8s0
2.2 普通TCP速率验证
先使用普通tcp进行拉流验证,以方便后续进行结果对比。
使用到的测速工具为iperf3,安装命令为:apt install iperf3
2.2.1 server端配置
在server节点机器上运行iperf3服务端,等待client端发起连接
iperf3 -s
此时server进行监听状态,监听端口为5201
2.2.2 client端拉流测试
此时对server端进行拉流测试
iperf3 -c 192.168.140.110 -t 10
测试结果为190Mbit/s,原因为:流量会从最高优先级的网口发出,其对应的限速为200Mbit/s
3.MPTCP速率验证
接下来配置多链路MPTCP
我这里使用的ubuntu22.04内核版本为:6.8.0,默认已开启mptcp。
查看是否开启mptcp可使用以下命令确认,输出1则代表已开启:
sysctl net.mptcp.enabled
如发现尚未开启MPTCP,可参考《MultiPath TCP》官方提供的配置步骤手动让系统内核启用MPTCP。
3.1 mptcp使用说明
当系统支持并开启mptcp后,就可以使用mptcp来传输数据包了。
使用mptcp传输数据有多种方式,如用mptcpize run命令强制让普通tcp使用mptcp传输。
mptcpize run方式使能mptcp示例:
mptcpize run python -m http.server 9393
如果是软件开发人员,也可以在源码中使能mptcp功能,且在mptcp官方文档中也可以找到go、python、c的示例代码,GO片段如下:
import ("net" "context")
// Client
d := &net.Dialer{}
d.SetMultipathTCP(true)
c, err := d.Dial("tcp", *addr)
// Server
lc := &ListenConfig{}
lc.SetMultipathTCP(true)
ln, err := lc.Listen(context.Background(), "tcp", *addr)
defer ln.Close()
从代码来看还是比较简短的。
3.2 server端配置
为了和前文对比,这里仍以iperf3为例,使用mptcpize run
方式体验下mptcp。
运行mptcpize前需确保此工具已安装。
3.2.1 mptcpize安装
国内环境为加速安装,可切换apt源。如:
vi /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
之后再更新并安装:
sudo apt-get update
sudo apt-get upgrade
sudo apt install mptcpize
验证是否安装成功,可使用mptcpize -V
命令验证
3.2.2 运行iperf服务端
在server端输入以下命令,开启iperf3的server:
mptcpize run iperf3 -s
3.3 client端配置
在client端进行发包测试
mptcpize run iperf3 -c 192.168.140.110 -t 10
此时会发现速率并没有叠加,这是因为还没有向链路管理器中添加子链路(subflow),MPTCP的Path-Manager有说明。
为了让数据传输时走双链路,可使用ip mptcp endpoint add 命令添加子链路。如我这里需要客户端让另一个优先级低的网口也加入到发包链路中,在client机器执行以下命令:
ip mptcp endpoint add dev enp8s0 192.168.140.232 subflow
再次测试,则可以看到链路速率确实叠加了
通过wireshark抓包也可以看到相关的mptcp数据包
如需删除子链路,可使用ip mptcp endpoint delete id 进行删除,如:
ip mptcp endpoint delete id 1
3.4 mptcp监控(可选)
为验证mptcp是否正常使用,可使用ip mptcp monitor
进行查看
也可使用bmon工具查看linux的网络监控信息,如bmon -b
:
总结
通过本文中的示例,快速体验了下mptcp的使用方式,并进行了链路聚合,并实现了链路通信时的速率叠加。
下一篇文章将在此基础上对网络拓扑进行调整,实现一个更加贴切具体应用场景的示例。