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

OPENPPP2 —— VMUX_NET 多路复用原理剖析

在阅读本文之前,必先了解以下几个概念:

1、MUX(Multiplexer):合并多个信号到单一通道。

2、DEMUX(Demultiplexer):从单一通道分离出多个信号。

3、单一通道,可汇聚多个通道。

MUX 在网络编程之中得应用,例如:TCP/IP、QUIC/CONN

即为:一个网络链接(模式),可承载并映射多个网络链接(模式)得通信数据。

注意:TCP/QUIC链接均为模式链接,真实通信中不存在链接,它是一个逻辑概念。

其结构为:(* 以TCP & MUX为例子)

上述为一个典型的 “MUX多路复用” 网络通信程序结构,多个TCP链接经过MUX交换机,在单一的TCP链接之中复用通信,并经过互联网进行传输。

注意:MUX为双向通信结构,所以不需要区分流程箭头方向。

好的,经过上述的概念理解,我们在来剖析 OPENPPP2(PPP PRIVATE NETWORK™ 2)之中的 VMUX_NET 的网络通信结构。

浅显的初略结构图,大约是这样:

从上述图示之中,可以了解到它与上述的MUX多路复用存在一定的差异,其:VMux linklaye 与 VMux Connection 是多对对的关系。

一个很有意思的疑问点是:为什么 OPENPPP2 之中 VMUX_NET 被设计为多对多的关系呢?

这是源于以下几个点:

1、单一TCP链路,或会受到来自 “IDC、ASN、ISP” 的高级QOS策略宽频限制,故而导致难以达到或逼近 POINT-TO-POINT(点对点)网络链路的瓶颈带宽。

2、单一TCP链路,在应用程式保证有序的前提下,难以把产生的CPU的计算负载压力分摊到其它线程之中,这可能导致在宽频交换的高压状态,某一个CPU核心的负载压力过大。

3、关于拥塞控制协议大多存在的 “慢启动(ssthresh)”,从初衷是好的,但在大流、突发场景之中,或许并不一定都是好事。

拥塞控制协议大多包含动态调整 ssthresh,即会根据实况动态的上调与下调,当单一链接上调时启速会比较慢,会导致网络宽频突发不足(RTT时延越大越明显),但若多个链接同时处于慢启上调,那么基于指数效应在探测瓶颈带宽初期,亦可以获得不错的宽频吞吐速度。

这源于:

控制协议除特殊之外,几乎都是对具体逻辑连接,进行拥塞逻辑控制的,所以,在多个链接并行收发时,可以获得更高的网络宽频吞吐效率。

所以:

多对多MUX多路复用,可为人们带来以下几个优势:

1、可获更优良单链接宽频吞吐能效

2、对流媒体链接速度有一定的加成

3、相对低一些的网络抖动(Jetter)

4、相对低一些的首帧RTT时延

缺陷:

1、更高的开发及维护的复杂性,与DEV调试的复杂性。

2、可在多个线程/CPU核上处理,但MUX核心交换机仍仅同一个时间轮片之中为线性交换(可以理解为逻辑上的单核/单线程处理)。

以下,让我们捕捉一部分 VMUX_NET 的代码并分别阐述,其的设计实现意图:

RX收:

openppp2/ppp/app/mux/vmux_net.cpp at main · liulilittle/openppp2 

vmux_net::packet_input_unorder 函数是处于来自多个不同线程、不同链接输入过来的 “VMUX FRAME”(帧)。

openppp2 是建立在 TCP/IP 协议簇上方的,而每个 TCP/IP 协议簇,每个有序数据的交付到达是有序的,但多个不同 TCP/IP 链接并不是有序的。

举一例子:同时向 www.baidu.com 443 建立了两条TCP链接,A与B链接。

A向服务器发送数据,B也向服务器发送数据,两个是同时发送过去:那么服务器可能先收到A发送的数据,也能先收到B向服务器发送的数据。

这是源于:A/B可能会在发送到服务器时产生丢包,或因为网络波动(如TTL沿途跃点的路由)、OS内核事件排队等等,导致两个链接包发送到服务器先后顺序是不同的,在UDP之中乱序问题一直是不可避免地,回归TCP的本质协议实现,UDP存在的问题TCP协议本身也存在,只是大家基于逻辑链接开发,并不能从上层感知这种问题而已,但这并非是不存在。

TX发:

 openppp2/ppp/app/mux/vmux_net.cpp at main · liulilittle/openppp2

在 VMUX_NET 的实现之中,TX、RX两部分是核心实现,但:TX部分是重中之重,这关乎MUX的网络收发吞吐能效。

在 OPENPPP2 之中为了提高大流量发送能效,VMUX_NET 实现确保可以同时N个链接飞行流量(TX Inflation)。

openppp2/ppp/app/mux/vmux_net.cpp at main · liulilittle/openppp2

 

举个例子:

VMUX_NET 向MUX对端发送数据时,会尽可能让N个链接同时发送(N为最大通道数量:如4 or 8)。

例如:“假定4个通道分别为:A,B,C,D”

A通道正在发送数据,同一个MUX链接刚刚交付数据发送并重新接收数据再次发送,那么本次交付的数据将有B链路进行发送,当然如果A链路已经交付也不会由A链接在交付本次,它会被插入到可发送通道队列的尾部。(一个链表)

这可以获得以下几个优势:

1、保持MUX通道链接活性

2、减缓MUX通道链接浮动 ssthresh【突发】

此外:

前提:MUX通道都是同一个服务器,中途每一个MUX通道都不会经过其它转发服务器。

否则:每个MUX通道都由不同的服务器进行转发,则应当插入到链表头部。

VMUX_NET 多路复用MUX;四通道(4*TCP CONN)单服务器网络宽频吞吐监测。

能效表现:

INTEL™ ATOM X5-Z8300/1.44GHz, OPENPPP2-VMUX_NET + LINUX ROUTER FOWARD


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

相关文章:

  • 数据结构 前缀中缀后缀
  • 【四川乡镇界面】图层shp格式arcgis数据乡镇名称和编码2020年wgs84无偏移内容测评
  • WordPress使用(1)
  • 计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设
  • ES2021+新特性、常用函数
  • 二进制安卓清单 binary AndroidManifest - XCTF apk 逆向-2
  • DeepSeek R1功能设计涉及的几个关键词
  • 数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)
  • Spring Boot基本项目结构
  • sizeof和strlen的对比与一些杂记
  • 【multi-agent-system】ubuntu24.04 安装uv python包管理器及安装依赖
  • Windows程序设计10:文件指针及目录的创建与删除
  • 【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解
  • CSS 图像、媒体和表单元素的样式化指南
  • 音视频多媒体编解码器基础-codec
  • windows部署deepseek之方法(The Method of Deploying DeepSeek on Windows)
  • mysql中in和exists的区别?
  • 晴,初三,年已过
  • CPU 100% 出现系统中断 怎么解决
  • appmatrix平台(一个汇集原创web APP的平台)服务规划
  • 网络安全实战指南:攻防技术与防御策略
  • 洛谷P1572 计算分数
  • 3.7 audit审计功能说明和源码解读
  • C++中常用的十大排序方法之4——希尔排序
  • HTB:UnderPass[WriteUP]
  • 企业微信SCRM推动企业数字化转型实现高效客户管理与营销效益提升