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

news2025/1/7 9:33:52

1.前言

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

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

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

mptcp-apps

2.目标拓扑

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

应用场景:

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

3.网关基础配置

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

3.1 系统开启mptcp

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

确保mptcp已开启
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",
    "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",
    "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节点的信息,mptcp设为true以开启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节点接入网络后,就可以使用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 mptcp endpoint,输出为空,此时会根据系统路由走单路径发送数据包。
ip-mptcp-endpoint

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

5.2.2 双路径验证

gw1节点添加子链路:

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

此时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-bbr

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

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

bbr-test

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

7.总结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商Google广告:2025年提升转化率的5种策略

展望 2025 年,Google 广告领域将迎来一系列显著变化,这些趋势对于提升广告转化率至关重要,值得我们提前关注与布局。 智能化程度持续加深,用户搜索习惯愈发精细,广告格式推陈出新,视频广告势头正猛...那么…

基于Java的敬老院管理系统的设计和实现【源码+文档+部署讲解】

基于Java的敬老院管理系统设计和实现 摘 要 新世纪以来,互联网与计算机技术的快速发展,我国也迈进网络化、集成化的信息大数据时代。对于大众而言,单机应用早已成为过去,传统模式早已满足不了当下办公生活等多种领域的需求,在一台电脑上不联网的软件少之又少&#x…

如何使用OpenCV进行抓图-多线程

前言 需求: 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求,之前就有做了,但是由于出现了一个问题,人家摄像头的帧率目前都可以达到60帧/s 了,而我的程序…

Unity 中计算射线和平面相交距离的原理

有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积,如果大于等于0,则说明射线和平面没有相交,否则,说明射线和平面相交…

C 语言的整型提升问题

目录 引言 一、什么是整型提升 二、为什么会有整型提升 三、整型提升的规则 四、整型提升的影响 五、如何避免整型提升带来的问题 六、总结 引言 在 C 语言中,整型提升(Integer Promotion)是一个常常被忽视但却非常重要的概念。理解整…

LangChain4j 框架探索

LangChain4j 框架探索 Get Started核心概念1 - Message核心概念2 - Model核心概念3 - Ai Services核心概念4 - Structured Output核心概念5 - Chat Memory核心概念6 - Tool (Function Calling)核心概念7 - RAG(Retrieval-Augmented Generation)核心 RAG APIs使用示例 总结 Get …

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】

区块链安全常见的攻击分析——Unprotected callback - ERC721 SafeMint reentrancy【8】 1.1 漏洞分析1.2 漏洞合约1.3 攻击分析1.4 攻击合约 重点:MaxMint721 漏洞合约的 mint 函数调用了 ERC721 合约中的 _checkOnERC721Received 函数,触发 to 地址中实…

特殊版的专业工具,支持批量处理!

今天给大家推荐一个图片压缩的软件,这个软件最厉害的地方在于它是一个无损压缩软件,十分好用,强烈推荐给大家。 Caesium Image Compressor 图片压缩 Caesium Image Compressor是可以保证图片原有画质不变的前提下,对图片进行无损…

ESP32-C3环境搭建

参考第二讲 ubuntu下的ESP-IDF开发环境搭建_哔哩哔哩_bilibili 宸芯IOT中的资料搭建 因为我买的板子是ESP32C3,所以没有完全按照教程去设置环境,但是也成功。 一、下载ubuntu系统以及esp-idf https://cn.ubuntu.com/download/server/step1 在以上链接…

使用Apache Mahout制作 推荐引擎

目录 创建工程 基本概念 关键概念 基于用户与基于项目的分析 计算相似度的方法 协同过滤 基于内容的过滤 混合方法 创建一个推荐引擎 图书评分数据集 加载数据 从文件加载数据 从数据库加载数据 内存数据库 协同过滤 基于用户的过滤 基于项目的过滤 添加自定…

提升汽车金融租赁系统的效率与风险管理策略探讨

内容概要 在汽车金融租赁系统这个复杂的生态中,提升整体效率是每个企业都渴望达成的目标。首先,优化业务流程是实现高效运行的基础。通过分析目前的流程,找出冗余环节并进行简化,能够帮助企业缩短审批时间,提高客户满…

3、蓝牙打印机按键 - GPIO输入控制

1、硬件 1.1、看原理图 初始高电平,按键按下导通处于低电平状态。 PB8号引脚。 1.2、看手册 a、看系统架构 GPIOB号端口有APB2总线控制 b、RCC使能 RCC->APB2ENR的第3位控制GPIOB使能。 c、GPIOB寄存器配置 浮空输入模式下,I/O的电平状态是不确定…

1.C语言教程:历史、特点、版本与入门示例

目录 1.历史2.特点3.版本4.编译5.Hello World 示例 1.历史 本篇原文为:C语言教程:历史、特点、版本与入门示例。 更多C进阶、rust、python、逆向等等教程,可去此站查看:酷程网 C 语言的诞生源于 Unix 系统的开发需求。 1969 年…

基层医联体医院患者历史检验检查数据的快速Python编程分析

​​​​​​​ 一、引言 1.1 研究背景与意义 在当今数字化医疗时代,医疗数据呈爆炸式增长,涵盖患者的基本信息、病史、检验检查结果、治疗方案等各个维度。这些海量且复杂的数据蕴含着巨大价值,为精准医疗决策提供了关键依据。通过对患者历史检验检查数据的深入对比分析…

智慧工地解决方案 1

建设背景与挑战 工地施工现场环境复杂,人员管理难度大,多工种交叉作业导致管理混乱,事故频发。传统管理方式难以实现科学、有效、集中式的管理,特别是在环境复杂、地点分散的情况下,监管困难,取证复杂。施…

笔上云世界微服务版

目录 一、项目背景 二、项目功能 一功能介绍 三、环境准备 • 需要开发的端口 • Mysql 导入数据库 ​编辑 • Redis ​编辑 • RabbitMQ ​编辑 在创建blog虚拟主机(方法如下) • Nacos • Nginx 四、前端部署 五、后端部署 六、测试计划操作 一功能测试 二…

SQL Server 数据库 忘记密码

1、先用windows 身份验证 连接 2、安全性--登录名 3、设置 身份验证 4、重启电脑 5、登录 登陆成功!!! ------------------------------------------------------------------ --1、查询登录账号信息 ------------------------------------------------------------------ -- …

windows安装并配置Maven

Maven官网下载 https://maven.apache.org 将下载好的解压到自己想要存放的路径中(路径中不要有中文或者影响环境的字符) 在此目录内新建一个名为repository的文件夹,此文件的目的是作为本地Maven的仓库来使用 配置环境变量 按下windows加r键…

Huginn - 构建代理、执行自动化任务

文章目录 一、关于 Huginn什么是Huginn?Huginn 功能加入Huginn展示 二、安装1、Docker2、本地安装3、开发 三、使用Huginn代理gems四、部署1、Heroku2、OpenShiftOpenShift 在线 3、在任何服务器上手动安装4、可选设置4.1 私人开发设置4.2 启用WeatherAgent4.3 禁用…

Android Glide判断当前运行环境是否为主线程的工具方法,Kotlin

Android Glide判断当前运行环境是否为主线程的工具方法,Kotlin private fun assertMainThread() {if (!isOnMainThread()) {throw IllegalArgumentException("You must call this method on the main thread");}}private fun isOnMainThread(): Boolean {…