C++从零开始区块链:P2P模块之简单介绍一下原理

想彻底说明P2P的原理太麻烦了,而且这种东西网上一搜就是一大堆(虽然好多链接其实都是同一篇文章),这里就不赘述了,只简单说一下本例所用到的一些东西。
如果所有节点都在公网上,p2p通信就非常容易,找台搭桥服务器,每个节点启动的时候都向搭桥服务器注册自己,并获取其他节点信息,然后就可以节点间互相通信了。
但在实际的网络环境中,很多节点处于内网中,外面的节点很难直接访问到处于内网中的节点,也就无法实现p2p通信,所以就需要对内网节点打洞,使外网的节点也能访问到内网的几点。
打洞原理就不细说了,简单描述一下,处于同一内网的主机,它们共用同一个外网IP,当内网的主机想要发数据给外网的IP,首先用内网的IP和端口发送消息给内网NAT,NAT收到消息后,开启一个端口,并讲该端口与内网主机的IP和端口进行映射,NAT在此端口上接收到的数据都转发到映射的内网主机和端口上。
比如内网某台主机的IP端口号是192.168.1.1:8000,外网IP是202.12.34.56,该主机想访问处于外网上的主机的IP端口号是67.89.12.34:80,那么实际的数据流通的是从192.168.1.1:8000发出数据到内网NAT,内网NAT开了个端口10000,并将数据发送到67.89.12.34:80,而67.89.12.34:80接收到的数据实际上是从202.12.34.56:10000发送过来的。当67.89.12.34:80要回发数据的时候,实际上是向202.12.34.56:10000发送,内网NAT的10000号端口接收到数据后,发现10000端口绑定的是192.168.1.1:8000,便将数据在内网网络上发送到192.168.1.1:8000。
简单说完打洞原理后,在介绍下本例的P2P中的数据流程。
首先需要一台打洞服务器,负责记录与分发节点信息。
当节点启动后,首先要向打洞服务器注册自己,注册的时候将本机IP端口发送给打洞服务器。
打洞服务器在接收的该节点的注册请求,先读取该节点发送过来的IP端口,再查询一下自己实际收到消息的IP和端口,然后将两个IP端口信息作为一个节点信息保存到节点列表,再将该节点信息发送回去。
节点接收到注册反馈后,将自己的节点信息保存,注册流程结束。
当节点想要与其他节点进行通信时,首先向打洞服务器索要其他的节点信息,打洞服务器将其他节点信息返回。
在节点接收到其他节点信息后,先判断自己的节点信息,如果打洞服务器返回的自己的IP和自己查询的自己的IP相同,则自身处于外网环境,否则是内网环境。
如果自身是内网环境,在判断自己的外网IP和通信节点的外网IP是否相同,如果相同则处于同一内网,不同则不在同一内网。
如果自身和通信节点处于同一内网,则使用内网IP端口进行通信,否则就使用外网IP端口进行通信。
(个人猜测,QQ文件传输功能的内网加速是不是就是这么干的)

猜你喜欢

转载自blog.csdn.net/mumufan05/article/details/82424417