{"author":{"address":null,"user":"https://learnblockchain.cn/people/25283"},"content":{"body":"# \r\n# **P2P网络的意义**\r\n#  \r\n\r\n介绍P2P网络的文章，一般都把中心化网络C/S架构和P2P架构放在一起对比，方便理解两种网络架构的不同。\r\n\r\n![640.webp](https://img.learnblockchain.cn/attachments/2025/01/rG0LgU4N6789b5a74f751.webp)\r\n\r\n事实上，网络通信层本身就是点对点的，去中心化的，任何两台主机理论上都可以握手，建立连接，双向通信。\r\n\r\n互联网就是一个扁平化的，可以两两互相通信的点对点网络。\r\n\r\n## **中心化的其实不是网络，而是应用服务。**\r\n\r\n互联网诞生之后，出现了大量的公司，为大众提供某一服务，譬如聊天、邮件、音乐、影视、游戏、购物等等，从活动中获取经济利益。\r\n\r\n强调用户体验的互联网产品，降低了用户消费服务的门槛，惠及了更多普罗大众，他们无需了解网络如何通信，甚至不需要知道远端还有服务器在运行。\r\n\r\n所以，所谓的中心化网络才是当前的主流。\r\n\r\n那P2P的应用价值在哪儿，为什么需要这种形式的网络？\r\n\r\n首先，横向看，并非所有的中心化服务机构都是可靠的。阿根廷法币，一个月通胀率10%以上。阿根廷民众的法币存款，在过去两年里快速缩水。\r\n\r\n图示为阿根廷通胀率-月环比(2023年7月-2024年7月):\r\n\r\n![640.webp](https://img.learnblockchain.cn/attachments/2025/01/wT7ujHs96789b6319a440.webp)\r\n#\r\n# **P2P网络的具体实现**\r\n#\r\n\r\nPeer-to-Peer是一种设计思想，每个加入的节点，即作为客户端获取服务，又作为服务端提供服务，没有专门的服务节点。体现的是“人人为我，我为人人”的价值观念。每个参与者提供带宽、算力和存储，共同组成了一个互相服务的对等网络。\r\n\r\n显然这种机制更复杂一些，要解决一些协议的问题：如新节点如何加入网络？怎么让其他所有的节点知晓新节点的加入？有些节点离开了，如何保障服务的继续？\r\n\r\n在完全的去中心化和完全的中心化之间，有多种结合，兼顾效率、透明、安全。根据实际使用场景，目前有多种具体的实现协议，如专注于文件高效下载与上传的BitTorrent、具有高效查找算法定位资源的Kademlia、旨在创建一个永久的分布式存储文件系统的IPFS...\r\n\r\n下面我们通过一个节点A从加入到离开，在一个完整生命周期中做的事情，直观了解下以太坊在用的Kademlia协议的主要内容。\r\n\r\n## **启动阶段，完善自己的路由表，同时将自己的信息添加到其他节点路由表内。**\r\n\r\nA启动运行，这个时候它对即将加入的P2P网络一无所知。首先它获取自己的IP和端口，然后通过HASH函数及其他计算，得到一个160Bit的Node ID。这是唯一的节点标识。\r\n\r\n 执行Kademlia协议定义好的FIND_NODE查询，入参是自己的Node ID。它会得到网络的响应，得到K个节点信息，将节点信息添加到自己的路由表，其中路由表内含有对方IPAddress、 UDP Port等信息 。\r\n\r\n将得到的新节点Node ID作为入参，循环FIND_NODE操作，得到更多节点信息完善路由表。\r\n\r\n协议里有更多细节，如保障每次查询的节点没有重复，不会循环往复没完没了的查询；协议中将Node ID分解为二叉树，用异或定义节点之间的逻辑距离；将同一距离的节点装入K桶作为一个分组，分组成员有上限管理及更新等等，这里不做详细介绍，可以单开一篇文章了。\r\n\r\n到此，新节点已经获取到足够多的节点信息，其他被查询的节点也将新节点的IP和Port等信息添加到自己的路由表，加入网络的过程完成。\r\n\r\n## **运行阶段，接受其他节点的查询请求，维护自己的路由表信息。**\r\n\r\n运行阶段最主要的当然是“干活”，这跟具体的应用服务有关，可能是上传下载文件，可能是确认交易，跟Kademlia协议无关。\r\n\r\n作为网络中的“老”节点，自然要被其他节点和新节点查询。查询信息里有其他节点的信息，如Node ID，Address和Port。节点A响应查询的时候，也会将查询信息里的节点信息跟自己路由表里的对比，不存在则维护更新自己的路由表。\r\n\r\n运行阶段，既要完成业务工作，又要维护自己的路由表信息，添加新节点信息进去，删除PING失败的已经不在线的节点。\r\n\r\n## **离开阶段，网络中关于A的传说逐步消失。**\r\n\r\n离开网络关闭即可，什么都不用做。这样的协议是安全的。因为离开有各种被动的因素，可能什么也来不及做。\r\n\r\n节点A突然关闭，对网络来说无人知晓。但是其他节点在更新路由表的时候，会PING节点A，期待它的响应。接收不到响应的节点，知道A已离开，将A从自己的路由表内删除。\r\n\r\n越来越多的节点发现A节点PING失败，将其从自己的路由表删除。关于A的信息逐步地就完全消失了。\r\n\r\n推荐一个把kademlia协议可视化的项目:\r\n\r\nhttps://kelseyc18.github.io/kademlia_vis/basics/1/\r\n\r\n如下图是一个FIND_NODE的过程：\r\n\r\n![640.webp](https://img.learnblockchain.cn/attachments/2025/01/2S4xtQJg6789b72c63034.webp)","title":"区块链三大基石技术之三-P2P网络"},"history":null,"timestamp":1737078603,"version":1}