SSL/TLS 控制面加密
URPC 支持基于 OpenSSL 的控制面加密:
- 通过
urpc_ssl_config_set配置 SSL 参数(PSK 模式或证书模式) - 支持 TLS 1.2 / TLS 1.3
- 可配置 cipher list 和 cipher suites
- Server 和 Client 各自维护 SSL 上下文
数据面 AES-GCM 加密
flowchart TB
N0[ctx, sge, sge_num, hdr_index, first_sge_offset]
N1[ctx]
N2[ctx, EVP_aes_256_gcm(]
N3[EVP_CTRL_GCM_GET_TAG, 16, tag]
扩展机制(Ext Ops)
URPC 提供 ext_ops_t 扩展接口,允许用户自定义:
// dp.h: ext_ops_t
typedef struct ext_ops {
int (*rx_req_process)(ext_call_ctx_t *, req_ctx_t **, urpc_poll_msg_t *);
int (*tx_read_process)(ext_call_ctx_t *, urpc_poll_msg_t *);
int (*tx_read_err_process)(ext_call_ctx_t *, urpc_poll_msg_t *);
void (*ext_proto_fill_extra_info)(urpc_req_head_t *, queue_local_t *, queue_remote_t *);
bool (*timeout_create_process)(urpc_call_wr_t *, req_entry_t *);
int (*encrypt)(urpc_hdr_type_t, urpc_cipher_t *, urpc_sge_t *, uint32_t);
int (*decrypt)(urpc_hdr_type_t, urpc_cipher_t *, urpc_sge_t *, uint32_t);
int (*stream_send_process)(void *, uint32_t, uint32_t, uint32_t);
int (*rx_rsp_process)(ext_call_ctx_t *, urpc_poll_msg_t *);
} ext_ops_t;
Token 策略
UMQ 实现了可选的 token 策略(UMQ_FEATURE_ENABLE_TOKEN_POLICY):
- 启用时,Jetty 和 segment token 通过
urpc_rand_generate生成随机值 - 禁用时,使用
get_timestamp()作为 token(低安全场景) - Token 在 bind 信息交换时传递给对端,确保只有持有正确 token 的远端能访问本端内存
Summary Table: URPC 在 UB 上的增量功能总览
| 层级 | UB 原生能力 | URPC/UMQ 增量功能 | 核心价值 |
|---|---|---|---|
| 传输模式 | 单一 UB 原生 (64KB) | 8 种传输模式(UB/UB_PLUS/IB/UCP/IPC/UBMM 等) | 一套 API 覆盖跨节点、同节点、同进程全场景 |
| 大块传输 | 64KB 最大消息 | UB_PLUS 反向拉取扩展到 10MB | 存储/训练大块数据零分片传输 |
| 流控 | 无 | 基于 immediate 的窗口流控 + 统计查询 | 防止接收端溢出,支持大规模部署 |
| 内存管理 | 单次 import | 多内存池导入协议 + EID 拓扑管理 | 支持多 EID、多 segment 并发 |
| RPC 协议 | 无 | REQ/ACK/RSP 状态机 + 三种参数传递 | 函数调用语义,引用传参零拷贝 |
| 连接管理 | 无 | Keepalive + 控制面协议 + Channel 抽象 | 生产级可靠性与可运维性 |
| 安全 | Token(可选) | SSL/TLS 控制面 + AES-GCM 数据面 | 端到端加密,多租户安全隔离 |
| 事件模型 | Async event | 中断/轮询双模式 + Pro API 精细控制 | 适应延迟敏感与吞吐优先两种场景 |
| DFX | 无 | Perf 时延统计 + Stats 报文统计 + Flowctl 统计 | 可观测、可调试、可优化 |
| 扩展性 | 固定流程 | ext_ops 注册 + func_defined 自定义模块 | 适配 DataNet、存储等异构场景 |
Conclusion
URPC 在 UB 总线上构建了一套完整的"从硬件原语到函数调用语义"的技术栈。通过本次深度代码分析,我们揭示了以下关键洞察:
- 分层抽象:URMA → UMQ/URPC Framework → 公共 API,每层只关注本层职责,通过 ops 接口实现多态
- 带内控制:利用 immediate 数据编码流控、内存导入、反向拉取等控制协议,不占用数据通道
- 并发安全:tx_ctx 双次释放、req_entry hash+线性探测、读写锁分离等精细并发控制
- 资源复用:JFR/JFC 通过 ref_cnt 在多个队列间共享
- 用户可选:每一层增量功能都是可选的(feature flag),适应不同场景
- 生产级特性:Keepalive、DFX、SSL/TLS、300K 并发 Channel
从架构视角看,URPC 的设计遵循了"分层抽象、带内控制、用户可选"的原则——既能以最小开销运行在延迟敏感的推理场景,也能以全功能模式运行在需要流控和加密的训练/存储场景。
References
- UMDK README —
umdk/README.md、umdk/README.ch.md - URPC Framework API —
umdk/src/urpc/include/framework/urpc_framework_api.h - URPC Framework Types —
umdk/src/urpc/include/framework/urpc_framework_types.h - UMQ API —
umdk/src/urpc/include/umq/umq_api.h - UMQ Types —
umdk/src/urpc/include/umq/umq_types.h - URPC Protocol —
umdk/src/urpc/framework/protocol/protocol.h - URPC Datapath —
umdk/src/urpc/framework/lib/datapath/dp.c(2,094 行) - URPC Control Plane —
umdk/src/urpc/framework/lib/control/cp.c(3,014 行) - Channel 管理 —
umdk/src/urpc/framework/core/channel/channel.c(1,471 行) - Queue Send/Recv —
umdk/src/urpc/framework/core/queue/jetty/queue_send_recv.c(1,533 行) - Jetty Provider —
umdk/src/urpc/framework/core/queue/jetty/provider_ops_jetty.c - Jetty Public Func —
umdk/src/urpc/framework/core/queue/jetty/jetty_public_func.c(1,533 行) - UMQ UB Core —
umdk/src/urpc/umq/umq_ub/core/private/umq_ub.c(2,163 行) - UMQ UB Impl —
umdk/src/urpc/umq/umq_ub/core/umq_ub_impl.c(1,485 行) - UMQ UB Flow Control —
umdk/src/urpc/umq/umq_ub/core/flow_control/umq_ub_flow_control.c - UMQ UB Imm Data —
umdk/src/urpc/umq/umq_ub/core/umq_ub_imm_data.h - Keepalive Task —
umdk/src/urpc/framework/lib/manager/keepalive_task.c(922 行) - Keepalive Probe —
umdk/src/urpc/framework/lib/manager/keepalive_probe.c - Crypto —
umdk/src/urpc/framework/lib/control/crypto/crypto.c - Control Plane IP Transport —
umdk/src/urpc/framework/lib/control/ip/transport.c(1,548 行) - UMDK 中文文档 —
umdk/doc/ch/urpc/