警告
RNL 包括其密码学代码到目前为止尚未经过审计,因此 RNL 仅适用于实时游戏和多媒体应用程序,而不处理任何关键数据,但不适用于具有关键数据的严肃应用程序!
描述
RNL 代表“实时网络库”
RNL 是一个基于 UDP 的网络库,用于实时应用程序和游戏,其灵感来自于 ENet、yojimbo、libgren 等。
RNL 是围绕实时游戏中使用的常见模式设计的,这些模式是模拟绑定的,而不是 I/O 绑定的,并且完全有状态,因此异步 IO 没有多大意义。因此RNL核心设计是单线程的,而不是多线程的。但是您可以在多个不同的线程中使用多个 TRNLHost 实例(每个线程只有一个到很少的实例),这样您就可以在同一台机器上托管多个网络游戏比赛,只要这台机器足够强大且速度足够快,可以托管多个网络游戏比赛网络游戏同时进行比赛。
在游戏客户端,如果可能的话,整个网络的东西应该在自己的(如果可能的话,CPU 核心固定的)线程中运行,以减少可能的干扰和其他类似问题。 (题外话:这同样适用于音频线程,除非人们喜欢可能的音频缓冲区欠载问题等,因为它在正确的时间点没有获得足够的 CPU 时间。:-) )
对于在单个游戏世界中拥有大量客户端的大型游戏,您应该使用多个细分的 TRNLHost 实例,以便每个 TRNLHost 必须在多个线程中仅处理少数连接的客户端,并且依次在多个物理专用服务器上,这也依次可以互相交流以模仿单个非常大的游戏世界的印象。至少一个 TRNLHost 实例是为典型的低客户端数量而设计的,因为这些是自我射击游戏、赛车游戏等的典型情况。或者换句话说,对于拥有大量客户端的大型游戏世界:分而治之(例如,部分扇区边界重叠的游戏世界扇区仅作为分而治之概念想法的示例)
支持我
在 Patreon 支持我
特征
- 大部分是完全面向对象的代码设计
- IPv6支持
- 跨平台
- Windows(使用 FreePascal 和 Delphi)
- Linux(使用 FreePascal)
- *BSD(使用 FreePascal)
- Android(使用 FreePascal 和 Delphi)
- Darwin(MacOS(X) 和 iOS)(使用 FreePascal 和 Delphi)
- 基于UDP的协议
- 测序
- 渠道
- 可靠性
- 碎片与重组
- 聚合
- 适应性
- 可移植性
- 可以使用对等模型,甚至是混合的对等和客户端/服务器混合模型,而不是仅使用纯客户端/服务器模型,当然也可以使用经典的客户端/服务器模型
- 加密安全伪随机数生成器 (CSPRNG)
- 基于 arc4random 但以 ChaCha20 代替 RC4 作为基本构建块
- 多个熵源(因为你永远不应该信任单个熵源,因为它可能有后门)
- 包括在较新的 x86 处理器上使用 rdseed/rdrand 指令作为可选的附加基于准硬件的熵源(如果当前运行的处理器支持这些指令)
- 相互认证
- 基于类似站到站 (STS) 的协议,该协议假设各方拥有签名密钥,用于对消息进行签名,从而提供针对中间人攻击的小型化安全性,这与基本的普通 Diffie 不同Hellman 方法没有任何此类扩展。
- 长期私钥/公钥是 ED25519 密钥,仅用于签名目的
- 使用椭圆曲线短暂 Diffie-Hellman 的前向保密(曲线 25519)
- 与其他事实一起的结果是,每个连接双方总是有新的不同的私钥和公钥,因此也有新的共享秘密短期密钥
- 短期私钥/公钥是 X25519 密钥,短期共享密钥仅用于基于 AEAD 的加密目的
- 带有关联数据的身份验证加密 (AEAD) 数据包加密
- 基于ChaCha20作为密码和Poly1305作为密码消息认证码
- 应用包数据重放保护
- 基于连接建立阶段的各种保护机制和加密的数据包序列号
- 延迟连接建立机制作为附加攻击面缩小机制
- 连接和身份验证令牌(作为可选选项,您应该有一个单独的带外通信通道,例如用于生成和处理这些内容的基于 HTTPS 的主后端)作为针对 DDoS 放大的附加攻击面缩小机制攻击
- 连接令牌以明文形式传输,以便在连接尝试的第一个数据包时以快速方式检查它们,而无需在检查令牌之前先解密连接令牌,因此为了在这一点上节省CPU时间。此选项主要用于防御 DDoS 放大攻击,这意味着如果连接尝试的第一个数据包中的连接令牌不匹配,服务器将不会立即响应,因此 DDoS 放大攻击将简单地进入没有什么。因此,这些令牌应该只在短时间内有效,这也适用于基础设施的主后端。
- 在成功处理私钥/公钥交换、共享密钥生成等之后,身份验证令牌将被加密传输。与连接令牌相比,身份验证令牌不是针对 DDoS 类别攻击的对策,而是身份验证令牌,顾名思义,仅用于单独的带外通信通道身份验证目的,换句话说,作为附加防止未经授权的连接,您可以在“客户端”连接到真正的服务器(所有实际操作发生的地方)之前,在基础设施的主后端端更详细地检查它。
- 连接尝试速率限制器
- 可配置的带宽速率限制器
- 可选的虚拟网络功能(例如,用于单人游戏匹配的快速无网络 API 的本地环回解决方案,该解决方案仍应基于服务器/客户端概念)
- 网络干扰模拟器(例如用于测试用例等)
- 可配置的模拟数据包丢失概率(分别针对传入和传出数据包)
- 可配置的模拟延迟(每个针对传入和传出数据包)
- 可配置的模拟抖动(分别针对传入和传出数据包)
- 可配置的模拟重复数据包概率(分别针对传入和传出数据包)
- 动态连接挑战请求响应难度调整机制
- 可配置因子值
- 基于历史平滑每秒帧数样式的确定机制,但只是每秒帧数、每秒连接尝试次数
- 更多压缩算法可供选择
- Deflate(zlib 位流兼容的 LZ77 和规范霍夫曼混合体,在此实现中压缩器端仅固定静态规范霍夫曼,但解压器端功能齐全)
- LZBRRC(LZ77 式压缩器以及熵范围编码器后端)
- BRRC(纯 0 阶熵范围编码器)
- CRC32C 代替 CRC32(末尾不带 C)
- 还有很多更多的东西。 。 。
按优先级随机顺序排列的计划功能(又名 Todo)
代码贡献者的一般准则
代码贡献者的一般准则
执照
zlib许可证
IRC频道
Freenode 上的 IRC 频道 #rnl
谢谢
- 感谢 ENet 的 Lee Salzman 作为基本 API 设计实现思路的灵感
- 感谢 Glenn Fiedler 为面向安全的实施想法提供灵感
- 感谢 Sergey Ignatchenko(“No Bugs”Hare)为我们提供了面向安全的实施想法的灵感