#udp #实时 #事件驱动 #消息传递 #可靠的 #应用 #数据传输

bin+lib redpine

面向连接的 UDP 数据传输,适用于实时应用

3 个不稳定版本

0.2.1 2024 年 4 月 14 日
0.2.0 2024 年 4 月 14 日
0.1.0 2024 年 1 月 23 日

#1351 in 网络编程

MIT/Apache

230KB
5K SLoC

decoration.png

redpine-rs

Redpine 是一个面向连接的 UDP 消息库。它为实时互联网应用提供了自动分片、可靠投递、拥塞避免和健壮的连接管理。

尽管底层协议是从头开发的,但 Redpine 基于古老的 ENet 拥有一个事件驱动 API,并且是根据其前辈 UFlow 开发过程中学到的经验编写的。特别是,Redpine 对 UFlow 做了四个关键改进

事件驱动,可选阻塞实现

用户不再需要不断调用 service(...) 来交换数据,服务器也不再迭代连接客户端的列表。相反,Redpine 通过安排计时器和在内部套接字上阻塞时自动唤醒来生成 API 事件。仍提供了一个基于轮询的不阻塞调用。

简化拥塞控制

不使用数学繁重的 TFRC 实现,而使用轻量级的拥塞避免算法,类似于 TCP Reno。这和前面的点应该会增加服务器可以处理的并发连接数,并且可能会总体上提高 TCP 友好性。未来将考虑基于 TCP CUBIC 的算法。

简化数据包流模型

Redpine 不再使用许多支持发送模式混合的虚拟数据包通道。相反,数据包片段从两个发送队列中的一个按轮询方式发送:一个包含可靠数据包数据的队列,另一个包含不可靠数据包数据的队列。对于不可靠队列中的数据包,用户指定数据包在过期前可以持续多长时间。

认为这种模型足以满足大多数实时互联网应用。然而,用于减轻可靠队列中头阻塞的面向通道的方法仍在考虑之中。(坦白说,考虑到在应用级别总会有一些重新排序,我无法想出一个合理化先前序列化模型复杂性的用例。)

4 向,SipHash 验证握手

当服务器收到客户端的初始握手时,服务器不会分配任何资源,而是回复将要保存的数据,并用SipHash MAC进行签名。一旦客户端重复发送此数据+MAC,向服务器证明已发送之前的握手帧,并且客户端处于它所声称的地址,连接就会建立。通过这种方式防止地址欺骗,Redpine对DDoS攻击的抵抗力更强。

待办事项

  • 在MTU中考虑IPv6头部大小

  • 公开MTU的配置

  • 找出数据限制的拥塞避免方法

  • 在文档中添加概述

依赖关系

~2–11MB
~128K SLoC