NKN客户端数据传输并发方案:提升可靠性和降低延迟


NKN客户端支持免费且以去中心化方式进行的端到端数据传输。在NKN之前,如果发送方(例如移动应用程序)想要将某些数据发送到接收方,则接收方需要可被公网访问的地址和端口,这对于一般的个人应用是不切实际的, 又或者需要发送和接收双方必须同时连接到同一个集中式服务器/平台(比如微信),这样也会引入额外的成本(比如构建集中化服务器及支付数据转发费用)和潜在的安全漏洞(比如用户数据暴露给了中心化服务器或第三方服务, 又或者集中化服务器的故障将导致整个系统瘫痪)。但现在得益于NKN公共区块链网络平台,使用NKN数据传输服务, 发送方和接收方可以在任何网络条件下保持数据的私密性,并且不需要集中式服务器或平台。数据将以去中心化的方式进行路由和传递,端到端加密且免费。

但是,天下没有免费的午餐。由NKN客户端发送的数据包会通过NKN网络(一个全球覆盖网络)进行路由以生成用于保障共识安全的签名链。通常,数据传输路径由公共因特网中的多跳组成,这增加了等待时间和数据包丢失概率。虽然我们已经设计并实现了最近路由和一些其他可以显著改善延迟和可靠性的机制,但在发送方和接收方彼此之间的距离不远的情况下,直接连接(假设它们可以直连)的传输延迟依然优于多跳转发。

幸运的是,通过利用NKN的覆盖层架构和更多带宽资源,有一种方法可以大大缩短延迟和提高可靠性。为了理解它是如何工作的,让我们首先回顾一下NKN客户端协议的相关部分:

  • 每个NKN客户端都有一个形式为identifier.publicKey的NKN地址,其中标识identifier是个随机字符串。
  • 每个NKN客户端连接到最接近于其NKN地址哈希的NKN节点,即hash(identifier.publicKey)。

现在可以描述一下我们的解决方案:发送方和接收方都可以通过向标识符添加额外的字符串来创建多个子客户端。例如,我们可以创建X个子客户端,而不是创建一个客户端nkn.publicKey,其中第i个客户端的地址是 __i __.nkn.publicKey。如果发送者想要向接收者发送数据,则其所有子客户端将同时发送相同的数据出去,其中第i个发送者客户端会将数据发送到第i个接收者客户端。无论哪个数据包首先到达都会触发接收者的数据到达事件,其余的将被忽略。

上述协议在NKN中运行良好,因为通过添加额外的标识符,我们创建了多个连接到不同的,不相关的NKN节点的独立客户端,因此数据包在几个独立的路径中同时发送。除非发送方或接收方的网络都有问题,否则即使某个路径上的节点有问题,也不会影响其他路径。因此,随着并发性的增加,丢包率呈指数级下降: p_multiple_loss = p_loss ^ X 并且延迟也以类似级别缩短:p_multiple(latency > t) = p(latency > t) ^ X

举例来说,如果单客户端丢包率为1%(不是实际数据,只是一个例子),而我们创建了3个子客户端,那么实际的丢包率将为0.0001%,即可靠性为99.9999%。

上述协议已在JavaScript中实现为nkn-multiclient-js。它是nkn-client-js的替代SDK,可以像nkn-client-js一样的调用。

降低延迟和提高可靠性的的代价就是使用更多的带宽,因此它更适合对延迟或可靠性敏感而对吞吐量要求不是很大的应用程序。比如D-chat,一个以Chrome /Firefox插件形式运行的非常棒的分布式聊天应用,已经在使用nkn-multiclient-js来提高消息可靠性和降低延迟。

对上述协议的潜在改进是使用Erasure编码来平衡传输时延和吞吐量。使用X个子客户端,我们可以使用Erasure编码让X个不同的子客户端发送X个不同的数据包,而不是使用X子客户端发送相同的数据包X次,这样一旦我们有X个数据包中的K,我们就可以解码原始数据包。这样,使用较小的K/X值, 我们可以得较低的延迟和相对较小的吞吐量,或者使用较大的K/X值来获得较高的吞吐量但相对较高的延迟。

有了NKN多个客户端并发模式的SDK,开发者可以根据他们应用程序在发包可靠性、时延和带宽几个需求之间选择一个整体的权衡,更优化地利用NKN网络来完成数据传输功能。

关于NKN

NKN是一个完全去中心化,基于网络传输量工作证明,可支持千万级规模节点共识的区块链系统。由NKN所构建的这样一个有经济模型所驱动,社区共建共享的新型点对点网络,为开发者提供了一个开放、便捷、高效和安全的网络连接传输平台。基于NKN开发的各种应用将给终端用户带来各种全新的网络体验。


主页: https://nkn.org
邮箱: [email protected]
论坛: https://forum.nkn.org
Telegram: https://t.me/nknorg
Twitter: https://twitter.com/NKN_ORG
Medium: https://medium.com/nknetwork
Discord: https://discord.gg/yVCWmkC

1 Like