荷叶边是一个完全管理的UDP库,旨在高性能和低潜伏期。
有许多RUDP库,例如ENET,Lidgren,Litenetlib。尽管其中许多人很棒,但荷叶边的目的是填补一个未填充的利基市场,而该利基是轻量级管理的图书馆。
与上面的示例相比,ENET真是太神奇了,几乎是荷叶边想要成为的事物,但它没有管理。 Lidgren,LiteNetlib和许多其他托管库可能会感到过于肿,并且包含许多不必要的功能,而且通常会慢得多。
荷叶边有许多其他Libs缺乏的功能。请参阅下面的摘要和详细说明。
荷叶边协议需要在建立连接之前完成挑战。当前,挑战是服务器提供的挑战,是由客户端解决并提交的野蛮力量。 (当前使用fowler-noll-vo哈希功能而不是sha1)。
通过需要非规模的连接消息大小来防止DOS扩增。此外,由于连接挑战,攻击第4层是不可行的。
荷叶边具有固定数量的连接插槽,可用于待处理连接,这限制了第4层的插槽填充攻击的可用性。待处理的连接具有固定的超时,可以解决计算昂贵的hashcash挑战,然后再被淘汰,在那之后将再次提供插槽。由于这唯一限制了插槽填充攻击,因此荷叶边还具有安全机制,其中必须在第一个消息中求解hashcash。该挑战是由客户端生成的,服务器将验证使用的日期是最新的,并且尚未使用IV,迫使客户每次想初始化握手时都会重新计算Hashcash挑战。
通过这些安全性缓解,将服务器降低的唯一方法是耗尽所有CPU资源。
荷叶边为您处理所有连接管理。这是一个完全以连接的协议,带有心跳keetalive数据包,以确保连接还活着。
荷叶边是完全无垃圾的,这是通过GC空间中的自定义内存分配器完成的。这样可以确保没有记忆泄漏给垃圾收集器,除非为了调整大小。这使荷叶边燃烧迅速。它还尽可能避免记忆副本。由于荷叶边仍然在GC空间中运行,因此垃圾收集器将处理荷叶边的任何内存泄漏,并且将通知用户,因为将内存的破坏者与最初分配泄漏的内存的堆栈一起称呼。请参阅实现。
当前有几种方式以荷叶边发送消息。这些类型是:
保证将交付所有消息,不能保证该订单,重复删除。使用固定的滑动窗口。
保证所有消息都可以通过订单也可以保证,删除了重复项。使用固定的滑动窗口。
保证所有消息都可以通过订单也可以保证,删除了重复项。使用固定的滑动窗口。允许大型消息分散。
交货不能保证,也不是订单。重复项被删除。
交货不能保证,但订单为。较旧的数据包和重复项被删除。
交货不能保证,也不是订单。重复不删除。
不需要连接的原始UDP数据包。
所有消息都不能保证传递。如果您发送多条消息,至少一条邮件是guranteed到达。如果您发送一条消息,则可以保证它到达。消息将始终为秩序。重复项被删除。
保证将交付所有消息,不能保证该订单,重复删除。使用固定的滑动窗口。允许大型消息分散。
荷叶边是本机的多线程,默认情况下使用后台工作线程来处理网络I/O。
荷叶边的所有公共API均设计为线程安全,并且可以从任何线程访问。
荷叶边是100%无依赖性的,因此非常便携,应该在大多数平台上运行。
荷叶边支持IPv6双插座模式。它通过使用绑定到同一端口的两个插座来完成此操作,从而完成用户看不见的完整双堆栈功能。
小数据包将延迟发送,这使它们可以合并为一个较大的数据包。可以按每个数据包禁用和启用。还可以配置延迟和最大合并大小。
可以将数据包发送为可靠的抛弃或可靠的剥离,这允许单个数据包的大小高达2^15*1450字节= 47513600字节= 47.5 megabyte。
ACK数据包被合并到Bitfields中,以使它们更加紧凑。
可以从连接中检索详细的统计信息,包括发送的字节,发送的数据包,往返时间等。
自动发现每个连接可能最大的MTU。
限制允许发送到连接的流量。自定义算法可以使用Ibandwidthtracker接口进行调整。
这是我想要的东西,并计划添加
这是考虑但未决定的功能。这是为了防止膨胀。
当前,碎片通道的ACK重新升级没有任何流速。
由于统一错误,违约的荷叶边在IL2CPP中无法正常工作。据报道该错误是团结的。如果您需要使用IL2CPP运行荷叶边,请使用这已经修补。随时在您的项目中使用IL2CPP。MILLISECONDS_SELECT定义进行编译。这将使套接字。选择方法使用基于毫秒的超时而不是微秒。