前言
本文主要介绍IPFS底层的协议栈,包括IPFS的七层结构。
一、IPFS协议概述
??和HTTP类似,IPFS是基于TCP/IP的应用层协议。IPFS协议栈也是由七层负责不同功能的子协议构成。如下图所示: 1.身份层:管理节点身份生成和验证。 2.网络层:管理与其他节点的连接。 3.路由层:以DHT维护路由信息以定位特定的对等节点和对象,用以响应本地和远端节点发出的查询请求。 4.交换层:基于BitSwap(比特交换协议),模拟可信市场,弱化数据复制,防止作弊。 5.对象层:基于Merkle DAG ,具有内容寻址,防冗余等特性。 6.文件层:类似于Git的版本文件系统,支持blob,list,tree 等结构体。 7.命名层:具有自验特性的可变名称系统。 那么,下面我将对七层结构一一作介绍:
二、身份层
??在IPFS网络中,所有的节点通过唯一的NodeId进行标识,与比特币的地址类似,NodeId也是一个公钥的哈希。每个节点在IPFS代码中都由Node结构体来表示,其中只包含NodeId及一组公私钥对。
type NodeId Multihash
type Multihash []byte
type PublicKey []byte
type PrivateKey []byte
type Node struct {
NodeId NodeID
PubKey PublicKey
PriKey PrivateKey
}
身份系统的主要功能是标识IPFS网络中的节点。类似于用户信息的生成。在节点首次建立连接时,节点之间首先交换公钥,并且进行身份验证。
三、网络层
IPFS网络堆栈具有以下特点: 1.传输:IPFS兼容现有的主流传输协议,包含WebRTC DataChannels,uTP等传输协议。 2.可靠性:使用uTP和sctp来保障,用以动态调整网络状态。 3.可连接性:使用ICE来实现广域网的可连接性。 4.完整性:使用哈希校验检查数据完整性。IPFS网络中所有数据块都具有唯一的哈希值。 5.可验证性:使用数据发送者的公钥及HMAC消息认证码来检查消息的真实性。
四、 路由层
IPFS路由层数据结构使用基于S/Kademlia和Coral技术的分布式松散 哈希表(DSHT),主要用于实现内容路由、节点路由及数据存储等三种基本功能。IPFS的DHT结构会根据所存储数据的大小进行区分:小的值直接存储在DHT上,一般不过1KB;更大的值,DHT只存储值索引,这个索引是一个NodeId。
五、交换层
??IPFS的交换层借助BitSwap协议,主要功能是利用信用机制在节点之间进行数据交换,并且每个节点在下载的同时不断向其他节点上传已下载的数据。在IPFS中,数据的分发和交换都是使用的BitSwap协议。 BitSwap协议主要负责两件事情: 1.向其他节点请求需要的数据块列表 2.为其他节点提供已有的数据块列表。
BitSwap数据交换的生命周期经历4个状态: 1.状态开发(Open):对等节点间开发待发送BitSwap账单状态,直到建立连接。 2.数据发送(Sending):节点间发送want_list和数据块。 3.连接关闭(Close):节点发送完数据后断开连接。 4.节点忽略:节点因为超时、自定义、信用分过低等因素被忽略。
六、对象层
??IPFS对象层主要是使用Merkle DAG技术构建了一个有向无环图数据结构,用来存储对象数据。 Merkle DAG 为 IPFS提供了一些比较有用的属性,包括: 1.内容寻址:所有内容由多重哈希校验并唯一标识。 2.防止篡改:在IPFS网络中如果数据被篡改或损坏,可以通过哈希验证检测到。 3.重复数据删除:保存完全相同内容的所有对象都是相同的,并且只存储一次。
七、文件层
?? IPFS还定义了一组对象,用于在Merkle DAG之上对版本文件系统进行建模。 1.块(block):一个可变大小的数据块。 2.列表(list):一个块或者其他列表的集合。 3.树(tree):块、列表或其他树的集合 4.提交(commit):树版本历史记录中的快照。
八、命名层
??在命名层,协议实验室团队为IPFS设计了IPNS星际文件命令系统模块。 在其中采用的是自验证命名的方式。该模式如下: 1.通过NodeId =hash(node.Pubkey),生成IPFS节点信息 2.给每个用户分配一个可变的命名空间,由之前的生成的节点ID信息作为地址名称,在此路径下:/ipns/。 3.一个用户可以在此路径下发布一个用自己私钥签名的对象。 比如:/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/ 4.当其他用户获取对象时,可以检测签名是否与公钥和节点信息相匹配,从而验证用户发布对象的真实性。
另外,IPFS还使用了一些技术,用来增加IPNS的用户友好度。 1.对等节点链接 用户可以将其他用户节点的对象直接链接到自己的命名空间下。 2.DNS TXT IPNS记录 用户可以在现有的DNS系统中添加TXT记录,这样能通过域名访问IPFS网络中的文件对象。
#DNS TXT 记录 ipfs.benet.ai. TXT “ipfs=XLF2ipQ4jD3U …” #表现为符号链接 ln -s /ipns/XLF2ipQ4jD3U /ipns/fs.benet.ai
IPFS也支持可读标识符Proquint, 可以将二进制编码翻译成可读文 件的方法
#proquint语句 /ipns/dahih-dolij-sozuk-vosah-luvar-fuluh #分解为相应的形式 /ipns/KhAwNprxYVxKqpDZ
除此之外, IPFS还提供短地址的命名服务
#用户可以从下面获取一个link /ipns/shorten.er/foobar #然后放到自己的命名空间 /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm
总结
以上就是今天要讲的IPFS协议栈,包括其中的七层结构。
|