NKN客户端支持免费且以去中心化方式进行的端到端数据传输。在NKN之前,如果发送方(例如移动应用程序)想要将某些数据发送到接收方,则接收方需要可被公网访问的地址和端口,这对于一般的个人应用是不切实际的, 又或者需要发送和接收双方必须同时连接到同一个集中式服务器/平台(比如微信),这样也会引入额外的成本(比如构建集中化服务器及支付数据转发费用)和潜在的安全漏洞(比如用户数据暴露给了中心化服务器或第三方服务, 又或者集中化服务器的故障将导致整个系统瘫痪)。但现在使用NKN数据传输服务,得益于NKN公共区块链网络平台, 发送方和接收方可以在任何网络条件下保持数据的私密性,并且不需要集中式服务器或平台。数据将以去中心化的方式进行路由和传递,端到端加密且免费。
NKN客户端使用非常相对简单的协议(类似于UDP):每个数据包仅包含有源地址、终点地址、有效负载数据的信息,以及一些其它与签名链有关的必要信息。最轻量级的NKN客户端既不创建或管理链接会话/流,也不保证包排序,ACK或重传。这样简单的协议在某些应用中效果很好,例如消息传递,实时游戏等。但是,如果有人想使用NKN客户端传输大尺寸文件,则还需要解决一些其他问题:比如提高吞吐量,数据包排序和重新传输等。这听起来很耳熟,因为这基本上就是TCP的功能。
实现上述目标的方法不止一种,用何种方法最好的一种取决于应用程序类型。作为第一步,我们创建了nkn-file-transfer,这是一个基于NKN客户端的简单应用程序/库,可以在客户端之间快速,安全地发送和接收文件,而无需任何集中式服务器。它使用Golang编写,使用nkn-sdk-go,类似于nkn-multiclient-js 1的多个并发客户端以及简单的类似TCP的流控制。
NKN文件传输有4种模式:发送(send),接收(receive),获取(get),host。发送模式应与接收模式配对以将文件发送到对端,而获取模式应与host模式配对以从对端获取文件。在后台,发送者和接收者都通过向NKN地址的标识添加某些前缀字符串来创建多个客户端。发送文件时,首先将其切成许多小块(默认情况下,每个块为1024字节),每个块都用序列号标记。然后,发送方使用不同的路径同时发送块,并等待接收方对返回每个块的回执ACK。任何时候(滑动窗口)都只能发送一定大小的未确认数据块。如果又超时后的未确认块,则将使用其他路径重新发送该块。在接收方,当他接收到一个数据块时,他会将该数据块的ACK返还给发送方。
结合这些模式,可以将nkn-file-transfer 应用到一些非常实用的场景中:
1. 使用发送/接收模式,您可以免费将大型文件或敏感文件发送给地球另一端的某人。速度很快而且内容是端到端加密的,整个系统的每一部分都是去中心化式的。
2. 在一侧(例如A)使用获取+发送模式,在另一侧(例如B)使用接收+host模式,A可以从B获取文件或将文件放入B,就像标准文件服务器一样。
3. 还有一个HTTP模式可以与host和接收模式一起启用。它可以接受带有路由remoteAddr / fileName的HTTP GET / PUT / HEAD请求。它接受带有Range标头的HTTP GET请求,因此浏览器可以在下载的同时播放视频流媒体(延迟相对会高一些,不过可以获得更好的速度)。
4. 它可以在其他应用程序中用作Golang库。
通过nkn-file-transfer,您通常可以达到平均接近10mbps的洲际间文件传输速度。我们通过从美国(加州)向中国(北京)发送32MB文件来测试NKN文件传输的吞吐量,并将其与中国最大的支持文件传输的两个IM(微信和QQ)进行了比较。NKN文件传输的速度是微信的4.6倍(微信使用集中式服务器存储文件)、QQ的1.6倍(QQ使用集中式服务器转发数据但不存储文件)。
nkn-file-transfer也是开源的,网址为:https://github.com/nknorg/nkn-file-transfer
值得一提的是,目前其实现只使用一种非常简单的流控制算法来展示如何使用NKN客户端来创建高速率的去中心化的应用程序。在这个方面还有很大提升空间,可以使用更优化的算法来获得更好的性能。
关于NKN
NKN是一个完全去中心化,基于网络传输量工作证明,可支持千万级规模节点共识的区块链系统。由NKN所构建的这样一个有经济模型所驱动,社区共建共享的新型点对点网络,为开发者提供了一个开放、便捷、高效和安全的网络连接传输平台。基于NKN开发的各种应用将给终端用户带来各种全新的网络体验。