当前位置: 首页 > article >正文

链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践

mptcp-flow
正如《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.前言

有什么办法可以让网络传输时让链路叠加,以实现网络传输时的“更快更强”?

搜索一些资料后发现主要有以下技术:

  1. LACP(Link Aggregation Control Protocol,链路汇聚控制协议),一般使用支持LACP的设备进行链路汇聚
  2. linux bond,在具有多网口的linux服务器上配置bond,根据需求使用指定的bond类型实现链路汇聚
  3. MPTCP(MultiPath TCP),在现有的TCP协议上扩展实现的多路径传输协议,可将数据包拆分为多个子包传输

本文使用更偏向网络层的MPTCP进行实践,因其与LACP和Linux bond相比MPTCP更加灵活。关于MPTCP的细节可参见Multipath TCP for Linux 和RFC8684。

2.点到点链路聚合

2.1 拓扑

topo

拓扑由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
iperf3-s

此时server进行监听状态,监听端口为5201

2.2.2 client端拉流测试

此时对server端进行拉流测试

iperf3 -c 192.168.140.110 -t 10

iperf3 -c

测试结果为190Mbit/s,原因为:流量会从最高优先级的网口发出,其对应的限速为200Mbit/s

3.MPTCP速率验证

接下来配置多链路MPTCP

mptcp-subflows
我这里使用的ubuntu22.04内核版本为:6.8.0,默认已开启mptcp。

查看是否开启mptcp可使用以下命令确认,输出1则代表已开启:

sysctl net.mptcp.enabled

mptcp-show
如发现尚未开启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命令验证

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

iperf3-c-with-mptcp

此时会发现速率并没有叠加,这是因为还没有向链路管理器中添加子链路(subflow),MPTCP的Path-Manager有说明。

path-manager

为了让数据传输时走双链路,可使用ip mptcp endpoint add 命令添加子链路。如我这里需要客户端让另一个优先级低的网口也加入到发包链路中,在client机器执行以下命令:

ip mptcp endpoint add dev enp8s0 192.168.140.232 subflow

再次测试,则可以看到链路速率确实叠加了
mptcp-result

通过wireshark抓包也可以看到相关的mptcp数据包
mptcp-wireshark

如需删除子链路,可使用ip mptcp endpoint delete id 进行删除,如:

ip mptcp endpoint delete id 1

3.4 mptcp监控(可选)

为验证mptcp是否正常使用,可使用ip mptcp monitor进行查看

ip-mptcp-monitor

也可使用bmon工具查看linux的网络监控信息,如bmon -b
bmon-b

总结

通过本文中的示例,快速体验了下mptcp的使用方式,并进行了链路聚合,并实现了链路通信时的速率叠加。

下一篇文章将在此基础上对网络拓扑进行调整,实现一个更加贴切具体应用场景的示例。


http://www.kler.cn/a/464835.html

相关文章:

  • 《量子比特大阅兵:不同类型量子比特在人工智能领域的优劣势剖析》
  • 智慧工地解决方案 1
  • 明源地产ERP VisitorWeb_XMLHTTP.aspx SQL注入漏洞复现
  • 更改element-plus的table样式
  • 网络安全 | 信息安全管理体系(ISMS)认证与实施
  • 【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
  • 【C++项目实战】贪吃蛇小游戏
  • Pytorch使用手册-空间变换网络指南(专题十五)
  • Excel 面试 02 逻辑函数 AND
  • JUC学习
  • mysql报错2059
  • IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥
  • 【Infineon AURIX】AURIX缓存(CACHE)变量访问指南
  • 大数据组件(二)快速入门数据集成平台SeaTunnel
  • 建造者模式 Builder Pattern
  • docker下载redis,zookeeper,kafka超时time out
  • 软件工程大复习(五) 需求工程与需求分析
  • Linux系统安装es详细教程
  • 【IEEE冠名会议】2025年IEEE第二届深度学习与计算机视觉国际会议(DLCV 2025)
  • Go recover的执行时机
  • 剪映--关键帧教程:制作视频文字说明,文字动态划线,透明文字,虚拟触控,画面旋转缩小退出
  • TCP IP 网络协议基础入门 1
  • 加速开发体验:为 Android Studio 设置国内镜像源
  • VSCode函数调用关系图插件开发(d3-graphviz)
  • Git核心概念总结
  • 2022浙江大学信号与系统笔记