OPENPPP2 网络驱动模式

OPENPPP2 网络驱动模式

一、概述

OPENPPP2 实现了两种网络传输架构模式:半双工模式全双工模式(VMUX),这是该项目的核心技术特点之一。

二、半双工模式

2.1 核心设计原理

半双工模式采用一对一映射 机制:每个TCP连接对应一个独立的VNP隧道进行转发。这种模式通过 VirtualEthernetTcpipConnection 类实现。

每个连接实例维护:

  • socket_: 本地TCP套接字
  • transmission_: VNP隧道传输对象(支持三种协议)

2.2 支持的隧道协议

系统支持三种隧道传输协议:

  • ppp:// - 原生TCP直连(默认端口20000)
  • ws:// - WebSocket明文传输(默认端口20080)
  • wss:// - SSL加密WebSocket(默认端口20443)

2.3 半双工模式示意图

目标服务器
VNP服务端
VNP隧道层
VNP客户端 - 半双工模式
客户端应用层
双向转发

ForwardSocketToTransmission

ForwardTransmissionToSocket
TCP连接1
TCP连接2
TCP连接N
VirtualEthernetTcpipConnection1

socket_ + transmission_
VirtualEthernetTcpipConnection2

socket_ + transmission_
VirtualEthernetTcpipConnectionN

socket_ + transmission_
隧道1

ppp:// / ws:// / wss://
隧道2

ppp:// / ws:// / wss://
隧道N

ppp:// / ws:// / wss://
服务端连接1
服务端连接2
服务端连接N
目标服务器1
目标服务器2
目标服务器N

三、全双工模式(VMUX)

3.1 VMUX核心技术

VMUX(Virtual Multiplexing)是一种带宽聚合技术,通过建立多条物理链路层连接(linklayer),实现多个虚拟TCP连接的复用传输。

3.2 关键组件

3.2.1 vmux_net - 多路复用管理器

负责管理整个VMUX会话,包括:

  • 链路层管理 :维护多条物理连接(vmux_linklayer
  • 虚拟连接管理 :管理所有虚拟套接字(vmux_skt
  • 包序列化 :通过 seqack 机制确保数据包顺序
  • 心跳机制:保持链路活性
3.2.2 vmux_linklayer - 物理链路层

每条物理链路包含:

  • connection: VirtualEthernetTcpipConnection 对象
  • server: 服务端连接对象(服务端模式)
3.2.3 vmux_skt - 虚拟套接字

代表通过VMUX隧道建立的单个虚拟TCP连接,支持:

  • 连接建立和关闭
  • 数据收发
  • 拥塞控制
  • 加速模式 8
3.2.4 vmux_hdr - 数据包头部

每个VMUX数据包包含:

  • seq: 序列号(32位)
  • cmd: 命令类型(SYN, PUSH, FIN等)
  • connection_id: 连接标识符(32位)

3.3 VMUX全双工模式示意图

目标服务器
VNP服务端 - VMUX
VNP隧道层
数据包处理
VNP客户端 - VMUX全双工模式
客户端应用层
物理链路层 max_connections=4
虚拟套接字层
带宽聚合
包重排序

packet_less
TCP连接1
TCP连接2
TCP连接3
TCP连接N
vmux_net

多路复用管理器
vmux_skt1

connection_id=1
vmux_skt2

connection_id=2
vmux_skt3

connection_id=3
vmux_sktN

connection_id=N
vmux_linklayer1

物理连接1
vmux_linklayer2

物理连接2
vmux_linklayer3

物理连接3
vmux_linklayer4

物理连接4
vmux_hdr

seq + cmd + connection_id
tx_queue

发送队列
rx_queue

接收队列

包重排序
隧道1
隧道2
隧道3
隧道4
vmux_net

服务端多路复用
linklayer1
linklayer2
linklayer3
linklayer4
目标服务器1
目标服务器2
目标服务器3
目标服务器N

3.4 VMUX数据流处理机制

服务端vmux_net vmux_linklayer 发送队列 vmux_net vmux_skt 应用程序 服务端vmux_net vmux_linklayer 发送队列 vmux_net vmux_skt 应用程序 封装vmux_hdr seq++, cmd=push, conn_id 负载均衡选择链路 检查seq,放入rx_queue 按序取出数据包 packet_less排序 send_to_peer_yield(data) post(cmd_push, data, connection_id) 加入发送队列 underlyin_sent() 物理传输 packet_input_unorder() packet_input() 转发到目标服务器

3.5 帧重排序机制

VMUX使用 packet_less 比较器确保数据包按序处理:

通过 rx_packet_ssqueue 实现有序队列:

四、两种模式对比

4.1 性能特点对比

特性 半双工模式 全双工模式(VMUX)
连接映射 1:1(每连接一隧道) N:M(多连接复用多链路)
带宽利用 单隧道带宽 聚合带宽(4-16条链路)
CPU开销 ⭐ 最低 ⭐⭐⭐⭐ 较高
延迟 单链路延迟 优化后延迟接近直连
突发性能 受单链路限制 ⭐⭐⭐⭐⭐ 极佳
复杂度 简单 复杂(序列化、重排序)
适用场景 稳定网络、高带宽 不稳定网络、跨洲连接

4.2 网络模式选择

跨洲连接

本地/邻近


客户端
服务端
双向
选择网络模式
网络延迟

是否>100ms?
CPU资源

是否充足?
选择半双工模式

最大化带宽
选择VMUX全双工

--tun-mux 4-16
选择半双工模式

降低CPU负担
启用加速模式?
--tun-mux-acceleration client
--tun-mux-acceleration server
--tun-mux-acceleration both
部署完成

五、实现细节

5.1 客户端VMUX初始化

客户端通过 VEthernetExchanger 类的 DoMuxEvents() 方法初始化VMUX多路复用:

5.2 服务端VMUX响应

服务端通过 VirtualEthernetExchanger 类的 OnMux() 方法处理VMUX连接请求:

5.3 传输层抽象

所有隧道协议都实现 ITransmission 接口,提供统一的读写API:

Notes

技术点总结

  1. 半双工模式优势在于简单高效,每个TCP连接独立转发,CPU开销最小,适合香港到大陆等低延迟稳定网络场景。

  2. VMUX全双工模式通过多链路带宽聚合显著提升跨洲连接体验(如中国到美国),但会增加CPU负担用于数据包序列化和重排序处理。

  3. 包序列号机制(seq/ack)是VMUX核心,确保跨多条物理链路传输的数据包能正确重组,实现类似TCP的可靠传输。

  4. 加速模式分为标准、客户端加速、服务端加速、双向加速四种,可根据网络瓶颈点灵活配置。

  5. 系统支持三种隧道协议(ppp://, ws://, wss://),可根据网络环境选择,wss://支持CDN转发更隐蔽。

相关推荐
tzy2332 小时前
分享一个 HTTP(S) 代理&抓包工具,拦截和Mock Web客户端请求和服务端响应
前端·网络协议·http
mjhcsp2 小时前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
huihuihuanhuan.xin2 小时前
后端八股之java并发编程
java·开发语言
寻星探路2 小时前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针
崇山峻岭之间2 小时前
Matlab学习记录32
开发语言·学习·matlab
向上的车轮2 小时前
如何选择Python IDE?
开发语言·ide·python
Bruce_Liuxiaowei2 小时前
内网探测常用技术方法整理
网络·安全·网络安全
爱吃生蚝的于勒2 小时前
【Linux】进程间通信之匿名管道
linux·运维·服务器·c语言·数据结构·c++·vim
隐退山林2 小时前
JavaEE:多线程初阶(二)
java·开发语言·jvm