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) - 包序列化 :通过
seq和ack机制确保数据包顺序 - 心跳机制:保持链路活性
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
技术点总结
-
半双工模式优势在于简单高效,每个TCP连接独立转发,CPU开销最小,适合香港到大陆等低延迟稳定网络场景。
-
VMUX全双工模式通过多链路带宽聚合显著提升跨洲连接体验(如中国到美国),但会增加CPU负担用于数据包序列化和重排序处理。
-
包序列号机制(seq/ack)是VMUX核心,确保跨多条物理链路传输的数据包能正确重组,实现类似TCP的可靠传输。
-
加速模式分为标准、客户端加速、服务端加速、双向加速四种,可根据网络瓶颈点灵活配置。
-
系统支持三种隧道协议(ppp://, ws://, wss://),可根据网络环境选择,wss://支持CDN转发更隐蔽。