跳到主要内容
项目档案库 / SDK

Nyarime/NRUP 开源库:用途、安装与使用指南

NRUP是基于nDTLS的可靠加密UDP传输协议,专为高丢包跨国链路与受限网络设计。通过FEC前向纠错+ARQ选择性重传实现零延迟恢复,支持AnyConnect/QUIC流量伪装、0-RTT会话恢复、BBR拥塞控制。本文涵盖架构、三档模式、安装使用指南、弱网性能数据及与TCP/QUIC对比。

143GoStar 于 2026年4月15日2026年9月10日 更新

AI 总结

NRUP是基于nDTLS的可靠加密UDP传输协议,通过FEC前向纠错与ARQ选择性重传,在高丢包、高延迟的跨国链路和受限网络中实现低延迟可靠通信,并提供AnyConnect/QUIC流量伪装能力。

中文项目介绍

NRUP是一个专为恶劣网络环境设计的可靠加密UDP传输协议,构建于nDTLS之上。它通过FEC(Reed-Solomon前向纠错)实现丢包的零延迟即时恢复,结合ARQ(SACK选择性重传)与动态小包冗余机制,在极端情况下仍能保证数据可靠交付,同时避免TCP的队头阻塞问题。 协议提供三档运行模式:公网过墙模式(AnyConnect伪装+AES-GCM加密,41字节开销)适用于跨国网络与审查环境;专线加速模式(无伪装、自动加密,28字节开销)适用于有旁路监听但无DPI的场景;内网传输模式(无加密无伪装,0字节开销)则面向LAN或游戏等对性能敏感的内部网络。所有模式均保留FEC、ARQ与BBR拥塞控制完整能力。 NRUP支持0-RTT会话恢复、连接迁移、PSK/Ed25519双向认证,并集成BBR拥塞控制算法优化高延迟链路吞吐。其流量伪装层可模拟AnyConnect DTLS或QUIC协议,有效绕过深度包检测(DPI)。项目提供完整的Go API与示例程序,已在70%丢包、500ms延迟的极端条件下验证可达63%以上送达率。

详细信息与使用说明

1. 项目定位与用途

NRUP是基于nDTLS的可靠加密UDP传输协议,定位为高丢包、高延迟网络环境下的稳定通信解决方案。它面向跨国链路、受限网络及需要绕过深度包检测(DPI)的场景,提供比TCP更低延迟、比QUIC更强伪装能力的传输层协议。核心用途是在不可靠的UDP基础上构建可靠、加密、可伪装的通信通道,适用于实时应用、文件传输、远程访问等对网络质量要求高但环境恶劣的用例。

2. 解决的问题

NRUP主要解决三大问题:一是传统TCP在高丢包高延迟下性能急剧下降且存在队头阻塞;二是QUIC虽基于UDP但流量特征明显易被识别封锁;三是KCP等UDP协议缺乏标准加密与流量伪装。通过FEC前向纠错实现丢包即时恢复(零延迟),ARQ选择性重传保证极端情况下的可靠性,结合AnyConnect/QUIC伪装层规避DPI检测,同时提供无加密内网模式满足低开销需求。对比表格显示NRUP在传输层基于UDP、支持加密、无队头阻塞、具备连接迁移与0-RTT,且独有的FEC+ARQ双重机制使其弱网恢复能力优于TCP/KCP/QUIC。

3. 适用场景

根据三档模式设计,适用场景可分为:公网过墙模式(默认)面向跨国网络与审查环境,通过AnyConnect伪装与自动加密穿透防火墙;专线加速模式适用于有旁路监听但无DPI的专线,提供加密同时减少伪装开销;内网传输模式面向LAN、游戏等内部网络,提供纯可靠UDP而无加密伪装开销。具体用例包括:跨国企业组网、移动网络或卫星链路通信、需要绕过DPI的实时流媒体、游戏状态同步、以及任何要求低延迟高可靠的数据传输场景。弱网测试表明在30%丢包+200ms延迟下仍可达100%送达率,70%丢包+500ms下可达63%送达率。

4. 安装方式

安装NRUP需要Go环境,版本要求为Go 1.22或更高(go.mod指定1.25.0)。使用以下命令获取最新版本:go get github.com/nyarime/[email protected]。依赖会自动管理,核心依赖包括github.com/klauspost/reedsolomon(提供Reed-Solomon FEC编码)和golang.org/x/crypto(提供加密原语)。安装后即可在Go代码中导入"github.com/nyarime/nrup"使用。仓库中未提供预编译二进制或非Go语言的安装方式。

5. 使用方式

基本使用分为服务端与客户端:服务端调用nrup.Listen(addr, cfg)监听,通过listener.Accept()接受连接,使用conn.Read/Write进行数据收发;客户端调用nrup.Dial(addr, cfg)发起连接,同样使用Read/Write操作。配置通过nrup.Config结构体调整,关键字段包括Disguise(伪装模式:"anyconnect"、"quic"、"none")、Cipher(加密模式:CipherAuto/AES-GCM/ChaCha20/CipherNone)、FECData/FECParity(FEC数据与冗余块数)、MaxBandwidthMbps等。高级功能包括:0-RTT会话恢复(首次连接获取SessionID,后续设置ResumeID)、连接迁移(conn.Migrate)、多路复用(nrup.NewMux)及认证模式切换(PSK默认或Ed25519)。示例程序涵盖echo(基础回显)、weaknet(弱网测试)与bench(性能基准)。

6. 补充说明与实现特点

NRUP采用分层架构:应用层→会话层(连接管理/0-RTT恢复)→可靠层(FEC即时恢复+ARQ选择性重传+小包冗余)→拥塞层(BBR:Pacing+CWND+ProbeRTT)→加密层(nDTLS:AES-GCM/ChaCha20/None)→伪装层(AnyConnect/QUIC/None)→UDP。v1.4.2版本优化包括SACK减少重传40-70%、FEC有效性反馈动态调整冗余、EWMA平滑参数(α=0.3)、连续丢包即时响应及Parity变化限幅。安全模型涵盖PSK/HMAC与Ed25519双向认证防MITM、64位滑动窗口防重放、X25519前向保密、HKDF密钥派生及HelloVerifyRequest防DoS。性能指标:nDTLS吞吐108,496 pps,端对端4,089 pps,FEC编码187 MB/s,AES-256-GCM 330 MB/s,ChaCha20 379 MB/s,BBR开销60ns/op且零内存分配。

思维导图

NRUP
应用层
会话层
连接管理
0-RTT恢复
连接迁移
可靠层
FEC (Reed-Solomon)
ARQ (SACK选择性重传)
小包冗余 (<256B)
拥塞层
BBR (Pacing+CWND+ProbeRTT)
加密层
nDTLS
AES-GCM
ChaCha20
None
伪装层
AnyConnect DTLS (默认)
QUIC v1
None (裸UDP)
UDP

常见问题

如何安装NRUP?有哪些版本要求?

使用命令:go get github.com/nyarime/[email protected]。要求Go环境版本≥1.22(go.mod指定1.25.0)。依赖reedsolomon与golang.org/x/crypto会自动下载。

NRUP与QUIC、TCP、KCP的主要区别是什么?

NRUP基于UDP+nDTLS,核心区别在于采用FEC+ARQ双重机制实现丢包恢复(QUIC仅重传),且支持AnyConnect/QUIC流量伪装(QUIC无伪装)。相比TCP无队头阻塞、支持连接迁移与0-RTT;相比KCP提供标准加密与更强伪装能力。

如何配置流量伪装和加密方式?

通过nrup.Config结构体设置:Disguise字段控制伪装模式("anyconnect"默认、"quic"、"none");Cipher字段控制加密(CipherAuto自动选择、AES-GCM、ChaCha20、CipherNone无加密)。三档模式已预设典型组合,也可自定义。

NRUP在弱网环境下的表现如何?

根据README弱网实测:1%丢包+50ms可达100%送达(FEC全恢复);10%丢包+100ms通过FEC+ARQ达100%;20%丢包+200ms通过SACK+动态冗余达100%;30%丢包+200ms通过FEC反馈闭环达100%。极端情况:40%丢包+200ms握手100%成功,最佳送达率87%;70%丢包+500ms送达率63%。

如何实现0-RTT会话恢复?

首次连接后调用conn.SessionID()获取会话标识并保存;后续连接时创建配置cfg := nrup.DefaultConfig(),设置cfg.ResumeID = 保存的sessionID,然后使用nrup.Dial(addr, cfg)即可实现0-RTT恢复,跳过完整握手过程。