IPFS P2P网络原理 以及 Bitswap的数据交互流程
关于IPFS的P2P网络相关分析是基于 v0.4.15
commit: 8671f7bb9f1409a60e97666422ff87017dc4cbfc
首先IPFS执行初始化, 先配置 IPFS_PATH
, 比方是当前目录
1 | $ export IPFS_PATH = $PWD |
初始化
1 | $ ipfs init |
IPFS初始化时会在本地生成一个默认的 config
文件
这个config文件会有一些ip和端口的配置,配置的就是本地的 host
然后在 builder.go
文件里的 setupNode
函数会调用 startOnlineServices
将配置文件中的相关信息传参,从而建立IPFS host
bitswap
是一个数据块交互的网络实现, 每个IPFS节点有一个bitswap网络。 通过wantmanager
进行管理, 而wantmanager
里面又实现了队列机制。 如果队列有消息需要发送的话,首先判断msgQueue
的sender
是否为nil,则会先建立连接,生成一个 sender
然后发送数据。
bitswap
的一些操作命令,基本都是查看数据交互过程的一些数据信息展示, 实际操作主要还是利用到 ipfs block get
等相关命令
ipfs block get
后面带着指定的块 cid
, 会先从本地blockstore
里面判断是否有指定的块,如果没有则根据当前网络连接的情况, 将所需要的 块 放在 wantlist
里面,形成一个 work
, 触发当前的 msgQueue
的事件循环机制doWork
去执行,发送bitswap
消息 从而从其他节点中获取到需要的块。
获取一个数据block
的时序图