使用MPTCP+BBR进行数据传输,让网络又快又稳
1.前言
在前文《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》中我们使用mptcpize run
命令实现了两个节点间通信使用MPTCP协议进行传输,并实现了传输速率的聚合。
实际应用中更推荐原生支持mptcp的应用,在MPTCP官网中可以看到如TCPDump、VLC、CURL这些软件的较新版本均已支持MPTCP。
本文将以技术实践落地的角度出发,记录一个具有更高普适性的MPTCP通信场景。
2.目标拓扑
目标:让左右两边的设备通信时使用MPTCP通信
应用场景:
- 企业多线组网,链路冗余与加速
- 家庭宽带多线路上网
- 链路聚合路由器
- ……
3.网关基础配置
本例中左右网关节点均为ubuntu22.04
3.1 系统开启mptcp
左右网络的边界节点均开启mptcp,此部分参考上一篇文章3.0章节。
确保mptcp已开启
3.2 系统开启ip转发
网关节点均启用IPV4转发
echo 1 > /proc/sys/net/ipv4/ip_forward
3.2 透明代理软件安装
在拓扑图中的两个网关节点均安装支持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
命令判断是否安装成功
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 &
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
}
其中的server和server_port填入gw2节点的信息,mptcp设为true以开启mptcp,protocol设为redir以使用透明代理方式接入对端gw2节点
之后启动ss-redir
sslocal -c /root/ss/ss_redir.json &
如需要快速关闭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
使用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"
命令验证
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
,输出为空,此时会根据系统路由走单路径发送数据包。
测速结果如下:
与所配置的限速基本一致: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条可用的链路了:
再次测速:
速率平均达到了463Mbit/s,但存在一定的网络抖动。
不过从结果来看也速率确实进行了叠加,200+300=500Mbit/s
此时用netstat -anlp|grep 65101
观察当前网络连接情况,也可以看到gw-2节点与gw-1节点建立了多个tcp连接,且所连接的目的地址中有192.168.3.101和192.168.3.102。
6.网络稳定性优化
从上面的测试结果可以看出,当前网络的最大传输速率还存在一定的波动。
当链路聚合后,最大上行速率为390~520Mbit/s,有抖动的情况。
6.1 拥塞控制算法查看
在两个gw节点使用如下命令进行查看:
ss -nti ‘( dport :65101 )’
从图片结果可知:当前使用的tcp拥塞控制算法为cubic。
sysctl net.ipv4.tcp_available_congestion_control
6.2 开启BBR
为了提升数据通信时的稳定性,将系统中的拥塞控制算法修改为BRR。
BBR的开启方式需要linux的内核版本大于4.9。
由于我这里使用的系统为ubuntu22.04,其默认内核版本已支持bbr,则直接修改配置即可。
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
之后再进行拉流测试,并观察ss -nti '( dport :65101 )'
监控数据
可以看到此时的tcp拥塞控制算法已使用bbr。
且从测试结果可以看出,TCP的拥塞控制算法调整为BBR后,带宽的平均速率也有了一定的提高。
7.总结
通过对前文《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》和本文的综合应用,相信对于MPTCP的配置和实践有了一定的了解,体验下来后也会感悟到MPTCP的应用领域还是比较多的。
与LACP与BOND相比,MPTCP在数据传输时不会因子路径的增加而新开辟单独的TCP连接,这种底层协议级的链路聚合也具有更好的性能表现。在开源产品方面,基于MPTCP的链路聚合路由器OpenMPTCProuter也获得了不错的好评。
愿网络越来越快,越来越稳~
相关文章:

使用MPTCP+BBR进行数据传输,让网络又快又稳
1.前言 在前文《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》中我们使用mptcpize run命令实现了两个节点间通信使用MPTCP协议进行传输,并实现了传输速率的聚合。 实际应用中更推荐原生支持mptcp的应用,在MPTCP官网中可以看到如TCPDump、…...

滴滴数据分析80道面试题及参考答案
如何衡量分类好坏? 衡量分类好坏有多种方法,常用的有准确率、精确率、召回率、F1 值、ROC 曲线与 AUC 值等。 准确率:是指分类正确的样本数占总样本数的比例,计算公式为:准确率 = (分类正确的样本数)/(总样本数)。准确率越高,说明分类器整体的分类效果越好,但在正负…...

基于物联网疫苗冷链物流监测系统设计
1. 项目开发背景 随着全球对疫苗运输要求的提高,特别是针对温度敏感型药品(如疫苗)的冷链管理,如何保证疫苗在运输过程中的温度、湿度、震动等环境因素的稳定性已成为亟需解决的问题。疫苗运输过程中,任何温度或湿度的…...

计算机网络基础(7)中科大郑铨老师笔记
应用层 目标: 网络应用的 原理:网络应用协议的概念和实现方面 传输层的服务模型 客户-服务器模式 对等模式(peerto-peer) 内容分发网络 网络应用的 实例:互联网流行的应用层协 议 HTTP FTP SMTP / POP3 / IMAP DNS…...

GOGOGO 抽象
抽象其实也算面向对象特征之一 抽象 含义:当多个子类中的共性向上提取,父类中不知道如何写具体实现,因为提取的共性并不一定能解决子类中实现的功能【同结构不一定同实现代码体】,就需要抽象概念 作用 父类只抽取结构ÿ…...

STM32-笔记26-WWDG窗口看门狗
一、简介 窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。 窗口看门狗的本质是一个能产生系统复位信号和提前唤醒中断的6位计数器(有的地方说7位。其实都无所谓࿰…...

10.装饰器
装饰器的基本用法创建简单的装饰器带参数的装饰器装饰器链类装饰器内置装饰器 定义:装饰器是一个函数,它接受另一个函数作为参数,并返回一个新的函数。装饰器通常用于在函数执行前后添加额外的功能,如日志记录、权限检查、性能测试等。 1.基…...

uniapp H5页面实现懒加载
在 uniapp 中,要在小的 view 内实现列表懒加载,可以通过以下步骤来实现: 使用 scroll-view 组件来创建一个可滚动的区域。在 scroll-view内 部放置一个list组件,用于显示数据列表。监听 scroll-view 的滚动事件,当滚动…...

STM32使用UART发送字符串与printf输出重定向
首先我们先看STM32F103C8T6的电路图 由图可知,其PA9和PA10引脚分别为UART的TX和RX(注意:这个电路图是错误的,应该是PA9是X而PA9是RX,我们看下图的官方文件可以看出),那么接下来我们应该找到该引脚的定义是什么…...

NLP初识
目录 0简介一、自然语言概述1. 什么是NLP?2. NLP常用工具0简介 NLP系列开始更新了!!!这个系列主要会介绍一些NLP的基础概念,比如RNN、LSTM、GRU等内容,重头戏放在大语言模型的基础讲解上,其中大语言模型的分享主要由两个方面:1.基础结构(Seq2Seq,Attention,Transfor…...

解決當前IP地址僅適用於本地網路
想要解決“當前IP地址僅適用於本地網路”其實並不困難。本篇文章將介紹其發生的原因以及如何解決。 “僅限本地網路”是什麼意思? 當IP地址為“僅限本地網路”時,意味著設備正在使用私人網路內部IP地址,但無法連接到互聯網。如果將本地IP視…...

Eplan 项目结构(高层代号、安装地点、位置代号)
Eplan中的项目结构分为3个层次: (1)功能面结构。指明这个系统的功能,有什么用途。在EPlan中,指的就是"高层代号()"。 一般指的是线体。 (2)位置面结构。指明该…...

文献分享集:跨模态的最邻近查询RoarGraph
文章目录 1. \textbf{1. } 1. 导论 1.1. \textbf{1.1. } 1.1. 研究背景 1.2. \textbf{1.2. } 1.2. 本文的研究 1.3. \textbf{1.3. } 1.3. 有关工作 2. \textbf{2. } 2. 对 OOD \textbf{OOD} OOD负载的分析与验证 2.1. \textbf{2.1. } 2.1. 初步的背景及其验证 2.1.1. \textbf{2…...

xdoj 判断字符串子串
判断字符串子串 问题描述 编写程序: 判断一个不大于 20 个字符的字符串是否是另一个不大于 20 个字符的字符串的子 串,如果是,则输出子串在父串的起始位置, 如果不是子串,则输出 No!。 输入说明 输入分 2 行: 第…...

n8n - AI自动化工作流
文章目录 一、关于 n8n关键能力n8n 是什么意思 二、快速上手 一、关于 n8n n8n是一个具有原生AI功能的工作流自动化平台,它为技术团队提供了代码的灵活性和无代码的速度。凭借400多种集成、原生人工智能功能和公平代码许可证,n8n可让您构建强大的自动化…...

asp.net core 属性路由和约定路由
在 ASP.NET Core 中,Web API 中的路由(Route)用于确定客户端请求的 URL 与服务器端处理逻辑之间的映射关系。路由机制在 Web API 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。 1. 路由概述 …...

【PS不常见教程】实操篇之通道抠图-抠黑色背景的图片
观前小提示:本文内容为我原创成果,若您需要转载或引用其中图片或文字内容,请记得标注来源是“璞子的家”哦,感谢您的尊重,理解与支持,谢谢啦! 如果没看过之前的文章,可以先看之前的两…...

电子电气架构 --- 整车整车网络管理浅析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

【数据结构05】排序
系列文章目录 【数据结构05】排序 . 【算法思想04】二分查找 文章目录 系列文章目录[toc] 1. 基本思想与实现1.1 插入类排序1.1.1 直接插入排序(*)1.1.2 折半插入排序1.1.3 希尔排序(*) 1.2 交换类排序1.2.1 冒泡排序(…...

推荐系统的三道菜
推荐系统的本质就是在有太多展示内容的情况下,对内容的呈现进行排序。 它的排序依据主要有三个方面: 1. 用户信息 排序的主要依据就是用户感兴趣的程度。 要获知用户的兴趣点,就要搜集“用户信息”,比如用户的历史行为、身份信息、…...

ModuleNotFoundError: No module named XXX
我们在安装了某个包之后,还是提示找不到包 方法一: python -m pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple 方法二: conda install 包名 如果还是找不到包: 请检查环境:...

JAVA:HashMap在1.8做了哪些优化的详细解析
1、简述 HashMap 是 Java 中最常用的数据结构之一,它以键值对的形式存储数据,允许快速的插入、删除和查找操作。在 JDK 1.8 之前,HashMap 主要是基于数组加链表的结构实现的。然而,在面对大量哈希冲突时(即多个键的哈…...

jest使用__mocks__设置模拟函数不生效 解决方案
模拟文件 // __mocks__/axios.js const axios jest.fn(); axios.get jest.fn(); axios.get.mockResolvedValue({data: {undoList: [get data],}, }); export default axios; 测试文件 jest.mock(axios); import Axios from axios;test(mytest, () > {console.log("…...

javaEE-网络原理-1初识
目录 一.网络发展史 1.独立模式 2.网络互联 二.局域网LAN 1.基于网线直连: 2.基于集线器组件: 3.基于交换机组件: 4.基于交换机和路由器组件 编辑 三、广域网WAN 四、网络通信基础 1.ip地址 2.端口号: 3.协议 4.五…...

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

linux安装redis及Python操作redis
目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…...

node.js内置模块之---stream 模块
stream 模块的作用 在 Node.js 中,stream 模块是一个用于处理流(stream)的核心模块。流是一种处理数据的抽象方式,允许程序处理大量数据时不会一次性将所有数据加载到内存中,从而提高性能和内存效率。通过流࿰…...

《learn_the_architecture_-_aarch64_exception_model》学习笔记
1.当发生异常时,异常级别可以增加或保持不变,永远无法通过异常来转移到较低的权限级别。从异常返回时,异常级别可能会降低或保持不变,永远无法通过从异常返回来移动到更高的权限级别。EL0级不进行异常处理,异常必须在比…...

【C++项目实战】贪吃蛇小游戏
一、引言 贪吃蛇,这款经典的电子游戏,自1976年诞生以来,一直受到全球玩家的喜爱。它的规则简单,玩法直观,但同时也充满了挑战性。在这篇文章中,我们将一起探索如何开发一个贪吃蛇游戏,无论是作为…...

Python基于matplotlib实现树形图的绘制
在Python中,你可以使用matplotlib库来绘制树形图(Tree Diagram)。虽然matplotlib本身没有专门的树形图绘制函数,但你可以通过组合不同的图形元素(如线条和文本)来实现这一点。 以下是一个简单的示例&#…...