Gnutella 是一个文件共享协议,曾经被数百万人使用,却很少有人真正理解它的运作原理。这个协议最初是 AOL 内部的一个演示项目,在公司取消后意外流向公众。由于其去中心化、无服务器的设计,流出的代码"覆水难收",迅速在互联网蔓延开来。它经历了爆炸式增长,持续了约十年,之后进入一种长期但减弱的"长尾"状态,至今仍可正常工作。
很多人错误地认为 Gnutella"失败了",但这个结论并不公平。Gnutella 实现了主流规模的扩展(数百万并发活跃用户),持续兴盛了十年。它之所以从主流视野消失,根本原因是它所诞生的那个世界已经消失了——2000年代初的互联网环境:NAT 尚未普及、个人电脑可直接暴露公网 IP、MP3 播放器和大容量固态存储刚刚普及、音像行业拒绝适应消费者变化——这些条件共同造就了 LimeWire 的黄金年代。
本质上,Gnutella 是一个点对点的搜索引擎,只不过搜索的是" blobs"(任意数据块)。协议运作流程很简单:你打开 LimeWire 等客户端、连接到网络中的几个节点、在搜索框输入关键词、查询从节点到节点向外扩散、结果从全球随机电脑缓慢返回、你检查文件名、判断哪些结果是伪造的、比较连接速度、选择文件后通过 HTTP 直接从其他用户的电脑下载文件。

协议的核心由五种消息类型构成:PING/PONG 形成网络心跳,通过携带 IP 地址、端口和共享统计信息在节点间传播,使每个节点能积累邻居列表,减少对引导服务器的依赖;QUERY/QUERYHIT 携带搜索流量,QUERY 包含最低速度字段和搜索字符串,QUERYHIT 包含响应者 IP、端口速度和结果集;PUSH 则是针对防火墙的 hack,允许多数 HTTP 服务器突破防火墙限制。
引导入网(Bootstrapping)是 Gnutella 的关键设计之一。由于没有中央入口点或用户注册表,新节点需要找到初始 peer 才能加入网络。最常见的方式是 GWebCache 系统——由志愿者运行的 CGI/PHP 脚本组成的联盟服务器,负责记录参与者 IP、提供其他缓存服务器列表以及当前已知节点的 IP 地址列表。值得注意的是,GWebCache 不是网络的中枢阻塞点,脱离它们 Gnutella 仍然可以存活,只是没那么方便。
协议在设计上留有扩展空间。GGEP(通用扩展协议)让客户端可以在普通消息中附加扩展数据;HUGE(哈希/URN 扩展)提供了用 SHA 哈希而非文件名来识别文件的方式。这些设计使 30 年历史的协议能够持续演进。
Gnutella 的真正启示在于:这是一个技术解决真实问题的案例。用户使用它不是为了什么去中心化理念或代币经济,他们只是下载 MP3。系统解决了在无静态 IP、无中心索引的情况下如何在全球范围内共享文件的问题。LimeWire 的工程师们还发明了动态查询路由(利用布隆过滤器和网络拓扑)来应对 flood 路由的扩展问题,这套系统至今仍被大多数主流客户端采用。
参考来源:https://rickcarlino.com/notes/p2p/gnutella-explanation.html