PCP: 一个P2P文件传输工具

PCP:Peer Copy

1. PCP简介

基于libp2p实现的,完全去中心化的p2p文件传输工具。
传统的p2p文件传输工具,比如croc和magic-wormhole都需要一个公网固定IP的中继服务器,来进行p2p节点的互相发现、数据中转、NAT穿透。这样的p2p应用,仍然避免不了单点故障、受运营者监管的问题。

2. PCP工作原理

PCP的使用方法非常简单,主要思想就是发送方和接收方可以分别独立生成相同的标识符,然后双方在DHT表中通过这个标识符来 碰头。下面分别从发送方与接收方进行介绍。

发送方:

  1. 运行 pcp send $FILE 命令,就会出现四个随机的单词。使用四个随机单词的idea来自比特币第39号改进提案:BIP39
  2. 第一个单词会被翻译成由整数表示的Channel ID,范围从0-2047。PCP通过mDNS, 将/pcp/{unix-timestamp}/{channel-id}作为discovery ID,广播到局域网中。并且将这个discovery ID的Hash(IPFS CID)传到IPFS的DHT当中,作为Provider ID。实现局域网以及广域网的p2p节点发现。 {unix-timestamp}是由当前的时间减去五分钟而来 (It's truncated to the most recent 5-minutes time slot),为了减少碰撞、网络延迟、节点间时钟不统一、DHT节点间通信、网络延迟等问题的影响。一般来说,Provider ID可以在DHT中保留24小时。/PCP是IPFS中的协议前缀。

接收方:

  1. 运行 pcp receive four-words-from-above命令。接收方会采用第一个单词以及时间戳,来生成一个相同的discovery ID。为了缓解时钟不同步、网络延迟等问题的影响,接收方会并行地向DHT查询,过去5分钟时间间隙内的所有 (queries the DHT in parallel for the previous 5 minutes time slot)。查询DHT中的其他peer节点;同时也会通过mDNS在局域网中查询。

完成 碰头 后,即接收方在DHT中查询到了对应的Discovery ID:

  1. p2p节点连接:这一步完全通过Libp2p实现。
  2. 鉴权:双方完成一次PAKE协议,将四个单词组成的弱密码,替换成一个安全性高的会话密钥。
  3. 文件传输:发送方先传输文件的大小、名称等信息,待接收方确认后,进行文件传输。

3. PCP使用示例

发送方:

$ pcp send my_file
Code is:  bubble-enemy-result-increase
On the other machine run:
    pcp receive bubble-enemy-result-increase

接收方:

$ pcp receive bubble-enemy-result-increase
Looking for peer bubble-enemy-result-increase...

4. PCP现阶段弊端以及未来改进

  1. DHT查询的速度很慢,通常会花费2-3分钟
  2. libp2p对于NAT的处理并不优秀,不能很好的穿透NAT后面的节点。
  3. 未来将考虑利用本地IPFS节点,来加速peer间 碰头 的问题

你可能感兴趣的:(PCP: 一个P2P文件传输工具)