使用MPTCP+BBR进行数据传输,让网络又快又稳

news/2025/1/8 1:58:04/

1.前言

在前文《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》中我们使用tcp>mptcpize run命令实现了两个节点间通信使用MPTCP协议进行传输,并实现了传输速率的聚合。

实际应用中更推荐原生支持tcp>mptcp的应用,在MPTCP官网中可以看到如TCPDump、VLC、CURL这些软件的较新版本均已支持MPTCP。

本文将以技术实践落地的角度出发,记录一个具有更高普适性的MPTCP通信场景。

<a class=tcp>mptcp-apps" />

2.目标拓扑

topo
目标:让左右两边的设备通信时使用MPTCP通信

应用场景:

  1. 企业多线组网,链路冗余与加速
  2. 家庭宽带多线路上网
  3. 链路聚合路由器
  4. ……

3.网关基础配置

本例中左右网关节点均为ubuntu22.04

tcp>mptcp_21">3.1 系统开启tcp>mptcp

左右网络的边界节点均开启tcp>mptcp,此部分参考上一篇文章3.0章节。

确保tcp>mptcp已开启
<a class=tcp>mptcp-enable" />

3.2 系统开启ip转发

网关节点均启用IPV4转发

echo 1 > /proc/sys/net/ipv4/ip_forward

3.2 透明代理软件安装

tunnel
在拓扑图中的两个网关节点均安装支持MPTCP的透明代理软件。这里选择已屏蔽敏感词的新版——已屏蔽敏感词-rust

安装命令:

sudo apt update
sudo apt install snapd
sudo snap install 已屏蔽敏感词-rust

为方便使用,再配置环境变量:

vi /etc/profile

export PATH="$PATH:/snap/已屏蔽敏感词-rust/1512/bin"

安装后使用ssservice -V命令判断是否安装成功
ssservice-v

4.gateway节点配置

4.1 server端tun配置

拓扑图中的gw2作为server端,ip地址为:192.168.3.222

在server端创建配置文件存放目录

mkdir -p /root/ss && cd /root/ss

生成一个密钥:

ssservice genkey -m “chacha20-ietf-poly1305”

yWroi1LpQpL+mK84mGTpo6yb6rZlHCDhjIlbIuvez2A=

#创建并编辑配置文件
vi /root/ss/ss_server.json

{"fast_open": true,"method": "chacha20-ietf-poly1305","tcp>mptcp": true,"no_delay": true,"password": "yWroi1LpQpL+mK84mGTpo6yb6rZlHCDhjIlbIuvez2A=","reuse_port": true,"server": "0.0.0.0","server_port": 65101
}

运行ssserver,进入等待连接状态

ssserver -c /root/ss/ss_server.json &

ssserver

4.2 client端tun配置

拓扑图中的gw1作为client端,有以下网口信息:

  • eth1,ip:192.168.3.101
  • eth2,ip:192.168.3.102
  • eth0,ip:192.168.140.3

192.168.3.0/24网段用于隧道通信192.168.140.0/24网段用于左侧内网通信使用

4.2.1 ss-redir配置

与server端类似的,创建配置文件存放目录

mkdir -p /root/ss && cd /root/ss

#创建并编辑配置文件
vi /root/ss/ss_redir.json

{"fast_open": true,"ipv6_first": true,"local_address": "0.0.0.0","local_port": 1100,"method": "chacha20-ietf-poly1305","mode": "tcp_and_udp","tcp>mptcp": true,"no_delay": true,"password": "yWroi1LpQpL+mK84mGTpo6yb6rZlHCDhjIlbIuvez2A=","protocol": "redir","reuse_port": true,"keep_alive": 15,"server": "192.168.3.222","server_port": 65101,"use_syslog": true
}

其中的serverserver_port填入gw2节点的信息,tcp>mptcp设为true以开启tcp>mptcp,protocol设为redir以使用透明代理方式接入对端gw2节点

之后启动ss-redir

sslocal -c /root/ss/ss_redir.json &

ss_redir
如需要快速关闭ss-redir,执行:

kill -9 $(pidof sslocal) &>/dev/null

4.2.2 iptables配置

透明代理正常工作需要搭配系统的Netfilter规则,使用iptables命令对Netfilter规则进行管理。

配置内容如下:

# Create new chain
iptables -t nat -N MYMPTCPS
iptables -t mangle -N MYMPTCPS
# Ignore your MYMPTCPS server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A MYMPTCPS -d 192.168.3.222 -j RETURN# Ignore LANs and any other addresses you'd like to bypass the proxy
# See Wikipedia and RFC5735 for full list of reserved networks.
# See ashi009/bestroutetb for a highly optimized CHN route list.
iptables -t nat -A MYMPTCPS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A MYMPTCPS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A MYMPTCPS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A MYMPTCPS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A MYMPTCPS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A MYMPTCPS -d 192.168.110.0/24 -j RETURN
iptables -t nat -A MYMPTCPS -d 192.168.14.0/24 -j RETURN
iptables -t nat -A MYMPTCPS -d 192.168.200.0/24 -j RETURN
iptables -t nat -A MYMPTCPS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A MYMPTCPS -d 240.0.0.0/4 -j RETURN# Anything else should be redirected to MYMPTCPS's local port
iptables -t nat -A MYMPTCPS -p tcp -j REDIRECT --to-ports 1100# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j MYMPTCPS 
iptables -t mangle -A PREROUTING -j MYMPTCPS 

配置项参考:[ss-redir requires netfilter’s NAT function]

使用iptables -t nat -L命令查看当前已有的nat规则

如需要删除上面iptables的配置项,执行以下命令:

#    iptables -t mangle -D MYMPTCPS -p udp -m mark --mark 0x1/0x1 -j TPROXY --on-ip 127.0.0.1 --on-port 1100 &>/dev/null    
iptables -t nat -D MYMPTCPS -p tcp -j REDIRECT --to-ports 1100 &>/dev/null   iptables -F    
iptables -X    
iptables -t nat -F    
iptables -t nat -X    
iptables -t mangle -F    
iptables -t mangle -X    
iptables -P INPUT ACCEPT    
iptables -P OUTPUT ACCEPT    
iptables -P FORWARD ACCEPT

此时两台gateway的配置就完成了。

5.主机接入验证

当拓扑图左侧的主机通过gw1节点接入网络后,就可以使用tcp>mptcp协议访问对端网络了。

5.1 网口模拟限速

gw1节点模拟限速,配置参考client端限速配置(模拟限速)部分。在gw1节点执行如下命令:

# 删除任何现有的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
# 删除任何现有的qdisc
sudo tc qdisc del dev enp7s0 root
# 查看当前qdisc策略
tc qdisc show dev enp7s0
# 添加策略
sudo tc qdisc add dev enp7s0 root handle 1: htb default 12
# 设置带宽,300bit
sudo tc class add dev enp7s0 parent 1:1 classid 1:12 htb rate 200mbit ceil 200mbit
# 查看qdisc策略
sudo tc qdisc show dev enp7s0
# 查看class策略
sudo tc class show dev enp7s0

其中:

  • enp1s0为192.168.3.101的网口,限速为300mbit
  • enp7s0为192.168.3.102的网口,限速为200mbit

ifconfig

使用bmon -b也可以看到对应的限速策略信息
bmon-b

5.2 host-pc配置

如接入主机的ip地址为192.168.140.2,在这台主机上配置访问对应网络的网关地址gw1节点的ip

linux主机时,添加静态路由命令:

route add -net 192.168.3.0/24 gw 192.168.140.3

windows主机时,添加静态路由命令:

route ADD 192.168.3.0 MASK 255.255.255.0 192.168.140.3

使用route print |findstr "192.168.3.0"命令验证
win-route-print

5.2 发包验证

在拓扑图右侧的任意主机启动一个http服务,如服务主机的ip地址为192.168.3.221,运行一个SpeedTest测速软件:

sudo docker run -e MODE=standalone -e WEBPORT=8999 -e restart=always --net=host ghcr.io/librespeed/speedtest

5.2.1 单路径验证

gw1节点输入ip tcp>mptcp endpoint,输出为空,此时会根据系统路由走单路径发送数据包。
ip-<a class=tcp>mptcp-endpoint" />

测速结果如下:
single
与所配置的限速基本一致:200Mbit/s

5.2.2 双路径验证

gw1节点添加子链路:

ip tcp>mptcp endpoint add dev enp1s0 192.168.3.101 subflow
ip tcp>mptcp endpoint add dev enp8s0 192.168.3.102 subflow

此时tcp>mptcp中就有2条可用的链路了:
subflows
再次测速:
cubic
速率平均达到了463Mbit/s,但存在一定的网络抖动

不过从结果来看也速率确实进行了叠加,200+300=500Mbit/s

此时用netstat -anlp|grep 65101观察当前网络连接情况,也可以看到gw-2节点与gw-1节点建立了多个tcp连接,且所连接的目的地址中有192.168.3.101192.168.3.102

netstat

6.网络稳定性优化

从上面的测试结果可以看出,当前网络的最大传输速率还存在一定的波动。
链路聚合后,最大上行速率为390~520Mbit/s,有抖动的情况。

6.1 拥塞控制算法查看

在两个gw节点使用如下命令进行查看:

ss -nti ‘( dport :65101 )’

从图片结果可知:当前使用的tcp拥塞控制算法为cubic
cubic

sysctl net.ipv4.tcp_available_congestion_control

reno-cubic

6.2 开启BBR

为了提升数据通信时的稳定性,将系统中的拥塞控制算法修改为BRR。

BBR的开启方式需要linux的内核版本大于4.9。
uname-r
由于我这里使用的系统为ubuntu22.04,其默认内核版本已支持bbr,则直接修改配置即可。

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

sysctl -p

add-<a class=bbr" />

之后再进行拉流测试,并观察ss -nti '( dport :65101 )'监控数据
ss-test

可以看到此时的tcp拥塞控制算法已使用bbr

<a class=bbr-test" />

且从测试结果可以看出,TCP的拥塞控制算法调整为BBR后,带宽的平均速率也有了一定的提高。

7.总结

通过对前文《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》和本文的综合应用,相信对于MPTCP的配置和实践有了一定的了解,体验下来后也会感悟到MPTCP的应用领域还是比较多的。

与LACP与BOND相比,MPTCP在数据传输时不会因子路径增加而新开辟单独的TCP连接,这种底层协议级的链路聚合也具有更好的性能表现。在开源产品方面,基于MPTCP的链路聚合路由器OpenMPTCProuter也获得了不错的好评。

愿网络越来越快,越来越稳~


http://www.ppmy.cn/news/1561429.html

相关文章

多模态论文笔记——GLIDE(DALL·E 2模型核心部件)

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍了OpenAI的DALLE 2模型中重要的组成部分&#xff0c;用于图像生成的GLIDE模型及其论文。 文章目录 论文背景扩散模型&#xff08;Diffusion Models&…

会员制电商创新:开源 AI 智能名片与 2+1 链动模式的协同赋能

摘要&#xff1a;本文聚焦于电商领域会员制的关键作用&#xff0c;深入探讨在传统交易模式向数字化转型过程中&#xff0c;如何借助开源 AI 智能名片以及 21 链动模式商城小程序&#xff0c;实现对会员数据的精准挖掘与高效利用&#xff0c;进而提升企业的营销效能与客户洞察能…

commit 错分支的一些补救操作

使用 git reset 撤销提交 使用 git reset 命令撤销提交&#xff0c;并将文件恢复到暂存区或工作目录。 如果你希望完全撤销提交并清空暂存区&#xff08;即撤销本地更改&#xff09;&#xff0c;可以使用 --hard&#xff1a; 复制代码 方案1:git reset --hard HEAD~1 # 撤销…

基于 GPUTasker 的 GPU 使用情况钉钉推送机器人实现

引言 https://github.com/cnstark/gputasker 随着 AI 模型的广泛应用&#xff0c;GPU 成为团队中最重要的资源之一。然而&#xff0c;如何实时监控 GPU 的使用情况并及时通知团队是一个值得关注的问题。为了更好地管理显卡资源&#xff0c;本文基于 GPUTasker&#xff0c;实现了…

最新版Chrome浏览器加载ActiveX控件之SolidWorks 3D控件

背景 SolidWorks Composer Player 是一个免费应用程序&#xff0c;它允许内容创作者将 Composer 内容分发给任何最终用户。Composer Player 与 Composer 一样具有高性能。Composer Player 绝不仅仅是一个简单的查看器&#xff0c;内容使用者可以在产品可交付内容中获得深入的互…

neo4j学习笔记

图数据库 图数据库是基于图论实现的一种NoSQL数据库&#xff0c;其数据存储结构和数据查询方式都是图论为基础的&#xff0c;图数据库主要用于存储更多的连接数据。 图论&#xff08;GraphTheory&#xff09;是数学的一个分支。图论以图为研究对象&#xff0c;图论的图是由若干…

【doris】单节点搭建doris,极简

drois-download 检查服务器是否支持avx2 cat /proc/cpuinfo | grep avx2 如果空&#xff0c;则不只支持avx2。 不为空如下图&#xff1a; 根据是否支持avx2和cpu类型选择版本&#xff0c;尽量不要自己编译很费劲&#xff0c;即使采用docker编译的方式也失败&#xff0c;具体不…

c语言中GHashTable的使用

前言:最近在c代码中需要用到键值对的存储&#xff0c;由于没有map&#xff0c;需要自己实现或者使用库函数&#xff0c;g_hash_table_new是GLib中的库函数&#xff0c;但使用起来会有很多坑&#xff0c;记录一下 构建hash表g_hash_table_new GHashTable* g_hash_table_new(GH…