点对点 (P2P) 世界/第 P2P 实现章
本章将尝试概述什么是点对点,其历史演变、技术和用途。
P2P 并不是一项新技术,P2P 几乎和互联网一样古老,它始于电子邮件协议,下一代被称为“元计算”或归类为“中间件”。它之所以在互联网上掀起风暴,是因为 P2P 协议的普遍分散化,这不仅赋予了普通用户权力,还使信息分发资源的节省成为可能,这与旧的集中化概念截然不同。
这对共享信息的安全性或控制可能是个问题,换句话说,是信息的“民主化”(P2P 用于从文件共享网络下载 MP3、程序甚至电影副本的众所周知用途),由于其分散化性质,流量模式难以预测,因此,提供基础设施来支持它是大多数 ISP 现在意识到的一个主要问题。
P2P 也被誉为索引深层网络的解决方案,因为 P2P 技术的大多数植入都基于并面向运行TCP/IP的有线网络。一些甚至正在被转移到无线用途(传感器、电话和机器人应用),您可能已经听说过一些智能地雷或机器人昆虫群的军事应用。
最终让 P2P 广受欢迎的原因是它创造了一个公平的竞争环境,这是由于我们今天在世界大多数地区都可以轻松获得计算机和网络基础设施。我们可以自由地轻松地成为生产者,取代旧的集中化模型,在这种模型中,大多数人口仍然是消费者,依赖于单一实体(垄断、品牌、知名度)来分发或创建服务或数字商品。这种转变无疑会降低生产和分发成本,因为可以进行数字传输的服务和产品的价格,现在也越来越明显的是,质量也会下降,直到出现新的分类系统,这在互联网影响后的书面媒体中就可以看到。
FIdoNet 今天仍然是一个全球计算机网络,用于公告板系统 (BBSes) 之间的通信。它使用存储转发系统在网络中的 BBSes 之间交换私人 (电子邮件) 和公共 (论坛) 消息,以及某些情况下的其他文件和协议。
FidoNet 系统是基于许多小型协作交互程序启动的。这些“对等方”与 BBS 系统一起运行,并通过脚本或某种形式的低级进程间通信与它们交互。它们的功能是自动打包/解包和导入/导出内容,从一个系统的位置到另一个系统的位置。独立性极大地简化了移植,FidoNet 是为数不多的几乎所有 BBS 软件都广泛支持的网络之一,以及许多非 BBS 在线服务。这种模块化结构还允许 FidoNet 轻松升级到新的数据压缩系统,这在使用调制解调器通过电话线进行通信并产生高长途通话费用的时代非常重要。
1990 年代初调制解调器速度的快速提高,以及计算机系统和存储价格的迅速下降,使得 BBS 越来越受欢迎。到 1990 年代中期,FidoNet 有近 40,000 个系统在运行,并且可以与世界各地数百万用户进行通信。就广度或数量而言,只有 UUCP 接近;FidoNet 的用户群远远超过 BITNET 等其他网络。
从 1990 年代中期开始,低成本互联网连接的广泛可用性降低了对 FidoNet 存储转发系统的需求,因为世界上的任何系统都可以以相同的成本访问。直接拨号到本地 BBS 系统迅速减少。互联网连接的可用性并非普遍,尽管 FidoNet 自 1990 年代初以来已经大幅缩减,但它仍然在世界各地使用。
电子邮箱(通常简称为电子邮件或电子邮件),最初作为一种集中式服务,用于创建、传输或存储主要是基于文本的人类通信,以及数字通信系统,第一次标准化工作导致采用简单的邮件传输协议(SMTP),该协议于 1982 年首次作为互联网标准 10 (RFC 821) 发布。
现代电子邮件系统基于存储和转发模型,其中电子邮件计算机服务器系统代表用户接受、转发或存储邮件,用户仅在邮件传输或检索期间使用个人计算机或其他网络设备连接到电子邮件基础设施,以或从其指定的服务器进行。
最初,电子邮件仅包含以 ASCII 字符集编写的文本消息,如今,几乎任何媒体格式都可以发送,包括音频和视频剪辑的附件。
Peer to Mail (http://www.peer2mail.com/ ) 是一款适用于 Windows 的免费软件,它允许您在任何 Web 邮件帐户上存储和共享文件,您可以使用 Gmail(Google 邮件)、Walla!、Yahoo 等 Web 邮件提供商,它会将共享文件拆分为段,然后压缩和加密这些段,然后将文件段逐一发送到您拥有管理权限的帐户。要下载文件,该过程会反过来进行。
Peer2Mail v1.4 中的加密被破解(之前的版本也受到影响) - Peer2Mail Encrypt PassDumper 漏洞。
Usenet 是最初的点对点文件共享应用程序。它最初是为了利用 UUCP(Unix 到 Unix 复制)同步两台计算机的消息队列而开发的。Usenet 将每篇文章存储在一个单独的文件中,并将每个新闻组存储在它自己的目录中。同步两个对等方就像同步两个不同文件系统中的选定目录一样简单。
Usenet 是在每个人都会接收、存储和转发相同新闻的假设下创建的。这个假设极大地简化了开发,以至于一个对等方能够连接到任何其他对等方以获取新闻。Usenet 分成无数的新闻组,这使它能够在保留其基本架构的同时进行扩展。'每个节点都存储所有新闻' 变成 '每个节点都存储它订阅的新闻组中的所有新闻'。
在所有其他点对点协议中,Usenet 最接近 Freenet,因为所有节点绝对平等,并且网络的全局映射没有由任何节点子集维护。与通过沿着对等方线性链递归拉取请求对象来工作的 Freenet 不同,Usenet 通过递归将所有新闻推送到其直接邻居,形成一棵树。
文件传输协议 (FTP) 可以被视为一种原始的 P2P 协议。即使它依赖于客户端/服务器结构,限制也仅在于运行的应用程序类型(客户端/服务器),因为角色是灵活的。
零配置网络 (zeroconf) 是一组技术,它以点对点的方式自动创建一个可用的互联网协议 (IP) 网络,无需人工干预或专用配置服务器。
Bonjour,以前称为Rendezvous。由Apple Inc.的服务发现协议。Bonjour 以点对点的方式定位设备,例如打印机,以及其他计算机和这些设备在本地网络上提供的服务,使用多播来维护域名系统记录。该软件内置于从 10.2 版开始的 Apple 的Mac OS X操作系统中,并且可以安装到使用Microsoft Windows操作系统的计算机上。Bonjour 还支持包含其他软件的组件,例如iTunes。
Bonjour for Windows (http://support.apple.com/downloads/Bonjour_for_Windows )
Bonjour for Windows 包含一个插件,用于使用 Internet Explorer 发现已发布的 HTTP 服务器。如果您在本地网络上拥有嵌入式 HTTP(Web)服务器的 Bonjour 设备,它们将出现在列表中。
互联网中继聊天,通常缩写为IRC,是一种实时基于文本的多用户通信协议规范和实现;它在网络上的用户之间中继消息。IRC 出生于 1988 年的某个时候,来自Jarkko Oikarinen 的想法。根据 IRChelp.org (http://www.irchelp.org/irchelp/rfc/ ),IRC 的官方规范是在 1993 年以RFC 格式编写的。该协议在“RFC 1459:互联网中继聊天协议”中定义,这是对 IRC 协议的介绍和详细信息的绝佳来源。
IRC 的最大架构单元是IRC 网络。世界上可能有数百个 IRC 网络,每个网络都平行运行并且彼此独立。登录到一个网络的客户端只能与同一个网络上的其他客户端通信,而不能与其他网络上的客户端通信。每个网络都由一个或多个IRC 服务器组成。IRC 客户端是一个程序,它连接到给定的 IRC 服务器,以便服务器将通信中继到同一个网络上的其他客户端,但不一定是同一个服务器。
IRC 上的消息以块的形式发送。也就是说,其他 IRC 客户端不会看到一个人在打字和编辑时的状态。一个人创建一个消息块(通常只是一句话),然后立即传输该块,该块由服务器接收,并根据地址,将其传递给相应的客户端,或将其中继到其他服务器,以便再次传递或中继,等等。要了解 IRC 网络上交换的消息,您可以查看 (http://www.alien.net.au/irc/irc2numerics.html),它清楚地识别了几个实现和功能。
连接到服务器后,通过IRC 昵称实现对其他客户端的寻址。昵称只是一个唯一的 ASCII 字符串,用于标识特定的客户端。虽然实现方式不同,但昵称的限制通常规定它们只能由字符 a-z、A-Z、0-9、下划线和连字符组成。
IRC 上的另一种寻址方式,也是它最突出的特点,是IRC 频道。IRC 频道通常与 CB 无线电(公民频段无线电)频道相比较。虽然使用 CB 时,据说人们在“收听”一个频道,但在 IRC 中,人们的客户端据说“加入”了该频道。发送到该频道的任何通信都会被客户端“听到”或看到。另一方面,同一网络上甚至同一服务器上的其他客户端,但不在同一频道上的客户端将不会看到发送到该频道的任何消息。
有关 IRC 的更新信息,可以从 IRC.org 获取,支持 IPv6 的迁移以及新的技术论文,IETF(互联网工程任务组)批准了最新的技术草案(2000 年 4 月 - 作者为 C Kalt)
RFC 2810 : IRC Architecture RFC 2811 : IRC Channel-Management RFC 2812 : IRC Client-Protocol RFC 2813 : IRC Server-Protocol
这些文档已经可以在 IRC.org 的官方 FTP 服务器上获得,可以通过 ftp://ftp.irc.org/irc/server 访问。
虽然 IRC 本质上不是 P2P 协议,但 IRC 确实有一些扩展可以支持从客户端到客户端的文本和文件传输,而无需任何中继。这些扩展被称为 DCC(直接客户端到客户端)和 CTCP(客户端到客户端协议)。
Ident 协议
[edit | edit source]Ident 协议,在 RFC 1413 中定义,是一种互联网协议,它可以帮助识别特定 TCP 连接的用户,并将他们与在同一服务器上共享相同连接的其他人区分开来。
Ident 协议旨在作为服务器 守护进程,在用户的计算机上运行,它接收对指定 端口 的请求,通常为 113。然后,服务器将发送一个专门设计的响应,用于识别当前用户的用户名。
大多数独立的 Windows 计算机默认情况下没有运行或存在 Ident 服务,在这种情况下,您可能需要在自己的计算机上运行 Ident 服务器(有几个独立的服务器可用),另一方面,如果您在 Unix/Linux 机器上,该服务默认情况下就在那里。一些 Windows IRC 客户端也内置了 Ident 服务器。
运行 Ident 服务器的原因是由于 IRC 服务器出于安全原因使用该信息(这并不是一种特别有效的方式),有些服务器甚至会阻止没有 Ident 响应的客户端,主要原因是它使通过“开放代理”或您已以某种方式损害单个帐户但没有root权限的系统连接变得更加困难。
DCC(直接客户端连接)协议
[edit | edit source]
CTCP(客户端到客户端协议)协议
[edit | edit source]使用 CTCP,客户端可以实现诸如“ctcp nickname version”或“ctcp nickname ping”之类的命令来获取有关其他用户的某些有趣信息(就像 mIRC 所做的那样)。
机器人或机器人
[edit | edit source]IRC 系统也支持(ro)机器人,在这种情况下,它们不是真实用户,而是从脚本(文本)文件中加载到 IRC 客户端中的一组命令,甚至是一个连接到 IRC 频道的独立程序。它们的作用是简化人机交互,提供某种程度的自动化,甚至用于测试或实现某些 AI。
基本命令
[edit | edit source]以下是 IRC 的一些基本命令
命令 | 它做什么 | 示例 |
---|---|---|
/attach /server |
登录到服务器 | /attach irc.freenode.net /server irc.freenode.net |
/nick | 设置您的昵称 | /nick YourName |
/join | 加入频道 | /join #wikibooks |
/msg | 发送消息(可以是私人消息或发送给整个频道) | 发送频道消息:/msg #wikibooks hello world! 发送私人消息:/msg JohnDoe Hi john. |
/whois | 显示服务器上用户的相关信息 | /whois JohnDoe |
/clear /clearall |
清除频道的文本。 清除所有打开的频道的文本。 |
/clear
/clearall |
/away | 设置离开消息。注意:再次输入 /away 以从离开状态返回。 | /away I'm away because... |
/me | 发送动作到频道。请参阅示例。 | 以下 /me loves pie. 将在 JohnDoe 的情况下输出到聊天中 JohnDoe loves pie. |
特权用户命令
[edit | edit source]适用于半操作员、频道操作员、频道所有者和管理员的命令
命令 | 它做什么 | 示例 |
---|---|---|
/kick | 踢出或将用户从频道中移除。您必须是半操作员或更高权限才能执行此操作。 | 将用户从频道踢出并附带原因:/kick JohnDoe I kicked you because... |
/ban /unban |
禁止用户进入频道。您必须是频道操作员或更高权限才能执行此操作。 解除用户在频道中的禁令。您必须是频道操作员或更高权限才能执行此操作。 |
/ban JohnDoe /unban JohnDoe |
IRC 网络
[edit | edit source]- EFnet
- Undernet
- Dalnet
- Rede Portuguesa de IRC (PTnet) ( http://www.ptnet.org/ ) 是最大的葡萄牙 IRC 网络,它创建于 1997 年,您可以获取其服务器的最新列表(http://www.ptnet.org/servidores)。
安全风险
[edit | edit source]
软件实现
[edit | edit source]- KVIrc ( http://www.kvirc.net/ ) 是基于 Qt GUI 工具包并用 C++ 编写的开源(GPL)便携式 IRC 客户端。
- Bersirc ( http://bersirc.free2code.net/index.php/home/ ) 是一个用 C 编写的开源 IRC 客户端(LGPL),它通过利用 Claro GUI 工具包在 Windows 上运行(Linux 和 Mac OS X 端口正在开发中)。
- XChat ( http://www.xchat.org/ ) 是适用于 Windows 和 UNIX(Linux/BSD)操作系统的 IRC(聊天)程序。IRC 代表互联网中继聊天。XChat 运行在大多数 BSD 和符合 POSIX 的操作系统上。开源(GPL),用 C 编写。
- Irssi ( http://irssi.org/ ) 是一款 IRC 客户端程序,最初由 Timo Sirainen 编写,并在 GNU 通用公共许可证的条款下发布。它使用 C 编程语言编写,在正常运行中使用文本模式用户界面。
- mIRC ( http://www.mirc.co.uk/ ) 是适用于 Windows 的共享软件互联网中继聊天客户端,由 Khaled Mardam-Bey 于 1995 年创建并开发。最初它只用于此目的,但由于其集成的脚本语言,它已经发展成为一种高度可配置的工具,可用于多种用途。
您还可以查看维基百科IRC 客户端列表 和IRC 客户端比较(未更新)...
隐形 IRC 项目
[edit | edit source]由 invisibleNET 组织创建的一种比普通 IRC 网络更先进的技术。invisibleNET 是一家以研发为主导的组织,其主要目标是创新智能网络技术。它的目标是在广泛使用但臭名昭著的不安全的互联网上提供最高的安全和隐私标准。
Invisible IRC 项目(http://invisibleip.sourceforge.net/iip/)是一个三层级的,点对点分布式网络,旨在成为一种安全的、私密的传输介质,用于高速、低容量、动态内容。特点
- 使用 Diffie-Hellman 密钥交换协议实现完美前向安全性
- 不断轮换会话密钥
- 128 位 Blowfish 节点到节点加密
- 160 位 Blowfish 端到端加密
- 使用填充流量来阻止流量分析
- 使用加密签名的命名空间进行节点标识的安全动态路由
- 节点级别的洪泛控制
- 无缝使用标准 IRC 客户端
- GUI 界面
- 点对点分布式拓扑结构,用于保护用户身份
- 完全模块化设计,所有协议都支持插件
IIP 软件在 GPL 许可下发布,可用于 Windows 98/ME/NT/2000/XP、*nix/BSD 和 Mac OSX,用 C 语言编写。
即时通讯
[edit | edit source]即时通讯可以被认为是 P2P 的一种子类型,简单来说,它是在网络(LAN 或 WAN)上通过文本进行两个或多个用户之间即时交流的行为。这需要使用客户端程序,以便在发送消息时,目的地应用程序会在短时间后显示通知,让用户可以回复原始消息。IM 协议可以是集中式的、分布式的或两者混合的。
即时通讯允许用户以几乎实时的方式向其他用户发送快速笔记或提醒。IM 可以,也可能不包括任何 P2P 实现或支持额外的 P2P 服务,例如文件共享、VoIP 或视频会议,广义的定义是,IM 是几乎瞬时的消息交换,无论它采取何种形式。
由于任何 P2P 网络都依赖于参与,因此支持某种 IM 实现非常重要,因为它可以创建社区并维持网络。
安全风险
[edit | edit source]
IM 软件实现
[edit | edit source]- Gaim/Pidgin(http://pidgin.im/pidgin/home/)开源(GPL)即时通讯客户端,支持 Windows、GNU、BSD 和许多 Unix 衍生系统,兼容 AIM、ICQ、MSN、雅虎、IRC、Jabber、Gadu-Gadu、SILC、GroupWise Messenger 和 Zephyr 网络。
- Trillian(http://www.ceruleanstudios.com/)是可换肤的聊天客户端,支持 AIM、ICQ、MSN、雅虎和 IRC,它还包含许多那些聊天程序中没有的功能。
- BitWise IM(http://www.bitwiseim.com),加密跨平台(Windows、Mac OS X 和 Linux)即时通讯,免费但闭源,使用wxWidgets。还支持白板、语音聊天。
- digsby(http://www.digsby.com),一个闭源的、仅限 Windows 的多协议 IM 客户端,可以让你通过一个简单的、易于管理的联系人列表与 AIM、MSN、雅虎、ICQ、谷歌 Talk 和 Jabber 上的所有朋友聊天。
- 谷歌 Talk(http://www.google.com/talk/),仅限 Windows XP+,闭源,支持 IM,并与 Gmail(谷歌 WEB 邮件)平台交互。
VoIP
[edit | edit source]语音 over IP 也可以看作是 IM 的扩展,文本被实时音频或视频取代,技术挑战非常相似,如果不考虑需要传输的数据类型和由于时间因素而需要考虑的特定因素。IM 应用程序通常也支持 VoIP 或视频会议。
VoIP 上的安全面临着与其他 P2P 协议和应用程序相同的漏洞和安全威胁,包括模糊测试、洪泛攻击、欺骗攻击、隐形攻击和 VoIP 垃圾邮件。
Napster
[edit | edit source]Napster 网络是使用点对点 TCP 上的客户端-服务器协议在应用程序级别创建的。在这种情况下,服务器是一个集中式目录,它将保存所有提供文件的索引(MP3/WMA)。客户端将连接到服务器,向服务器标识自己(用户在服务器上拥有帐户),并将他们共享的 MP3/WMA 文件列表发送给它,使其他客户端能够搜索该中央存储库以查找网络上的任何文件,然后从任何可用的来源请求它。
软件实现
[edit | edit source]- OpenNap(http://opennap.sourceforge.net),一个基于 Napster 的点对点网络,创建为开源(GPL),用 C 语言编写,使用 Win32,因此适用于 Windows。旨在扩展 Napster 协议,允许共享任何媒体类型,并添加将服务器链接在一起的功能。已停止维护。
- audioGnome(http://www.audiognome.com),闭源,但作为 Windows 的免费软件。
- JNerve(http://jnerve.sourceforge.net),一个开源(GPL)的 Java Napster 服务器协议实现,旨在实现跨平台兼容性。
- Napsack(http://napsack.sourceforge.net)是一个专门的多线程客户端,用于将 Napster 查询广播到多个服务器;目标服务器列表是从 www.napigator.com 获取的,并且是用户可过滤的(基于索引的用户数、文件数或千兆字节数)。使用 Java 开源(GPL)。
Gnutella
[edit | edit source]Gnutella 是一个开放的文件共享网络,最初由 Nullsoft 的 Justin Frankel 创建。这意味着,与大多数其他网络不同,任何人都可以编写一个客户端来访问 GNet,只要它符合公开的规范。
规范由GDF(Gnutella 开发论坛)讨论和创建,这是一个面向开发人员的开放邮件列表,迄今为止拥有超过 1000 名成员。之后它们在rfc-gnutella中被记录。通过这种方式,所有程序都共享一个共同的基础,同时协议也允许客户端特定的选项。开发人员谨慎地确保最大程度的向后兼容性。
尽管有这个名字,但 Gnutella 不是 GNU 软件,尽管一些 Gnutella 客户端是 GPL 授权的。它是一个开放的网络,它的名字的起源可能更容易通过吃太多 Nutella 来找到,而不是在 GNU 中找到。(这意味着:Gnutella 不是 FSF 的项目,也不与 GNU 软件工具相关)。虽然 Gnutella 最初被定义为一个完全分布式的信息共享技术,但该协议的后续版本是集中式和分布式网络的混合体,包含“服务器”(超级对等体)和“客户端”(叶子节点)。
Gnutella 客户端软件基本上是一个小型搜索引擎(提供对网络搜索引擎的替代)和文件服务系统合二为一。新实现的 Gnutella 还支持 Tiger 树哈希(TTH)用于文件传输。
Gnutella 的一个兄弟网络值得特别关注,尽管当前客户端的一些开发人员可能会否认它。大多数 Gnutella 开发人员称之为 MP(Mike 的协议)或 Shareaza 协议,而它的开发人员称之为 Gnutella2,这个名字给他的程序(Shareaza)带来了大量的媒体报道,并在 the_gdf 中造成了很多争议和反感。
- Gnutella2(Mike 的协议,G2)
由于开发人员社区未能就协议演进达成共识,导致 Gnutella 协议出现分支。
Gnutella2 也被称为 Mike 的协议,因为最初的更改和实现来自单个开发人员Michael Stokes。2002 年 11 月,Michael Stokes正式地、单方面地宣布了 Gnutella2 协议的创建,该协议在开发人员中引起了分裂,导致一些 Gnutella 应用程序不再支持这些修改,因为最初的提案与其他供应商的概念(尤其是 LimeWire 和 Bearshare)存在冲突。
现在产生的实现放弃了所有旧的 Gnutella 协议,除了连接握手,并采用了一种全新的搜索算法。Gnutella2 通常缩写为G2。
你可以将 Gnutella 网络的最初模型想象成朋友之间互相打电话获取信息。一个人问另外五个人,每个人再问另外五个人,以此类推。第一步后,接触到的人数为 5 人,第二步为 25 人,第五步为 3125 人,第七步为 78,125 人,第十四步约为 61 亿人。这足以接触到地球上的每个人。最初的 Gnutella 使用了 7 步(称为 HTL: Hops To Live)。
这个模型最大的问题(其中之一)是你必须先成为其中一员才能使用它。
朋友的朋友模型(FoF)具有一些缺点,这些缺点源于搜索执行的方式。如果搜索结果太多,连接你的节点(你最近的 5 个朋友)可能会过载,因为每个答案都必须经过它们,因为它们不提供你的“电话号码”,而是提供它们自己的号码并将答案传递给你。如果你问校园里大学领导的名字,现实中你会得到数百个答案,而网络上则会得到数千到数百万个答案。同样,如果每个问题都传递给一个包含 75,000 到 600,000 台计算机的网络中的每个人,并且每台计算机每小时只问一次,那么它们中的每一台都必须每秒回答大约 130 到 1600 个问题。而且他们必须将这些问题传递下去。虽然计算机速度很快,而且今天的互联网连接与几年前相比可以处理相当多的流量,但这对它们来说仍然太多了。想象一下,你的电话整天不停地响,接听各种各样的问题。
为了解决连接问题,已经出现了一些解决方案。
Ping-缓存是指节点(即你)询问其朋友他们的朋友是谁。这意味着你的朋友会把你介绍给他们的朋友,特别是他们高度重视的朋友,你将所有新的地址都写进你的电话簿,这样你就可以在你的原始朋友度假时知道该联系谁(有点像参加一个持续的鸡尾酒会)。这很容易,并且有给你提供非常可靠联系人的优势,但是如果没有一个已经加入网络的联系人,就没有办法加入网络。这意味着你始终可以重新加入,但如果以前从未加入过,你将无法连接。
第二种方法非常简单。当你的五个朋友中的一个回电话说史密斯(你以前不认识他)知道一些事情时,你记下她的号码。当你下次把他作为你的五个直接联系人之一打过去时,你更有可能更快地得到你的信息,因为他很可能有一些与你兴趣相似的朋友(他从哪里得到信息?),而这些人比随机挑选的人更有可能拥有你的信息(至少当你问与你上次问题类似的问题时)。缺点是这些联系人可能不常在家,因此你可能会找到一个知识渊博的联系人,但你可能再也无法联系到他。仍然没有办法第一次加入网络。现在我们谈谈 Gnutella 最近的发展之一: GWebCaches。我将在下一部分讨论它们。
为了保持一致性,GWebCache 是一种将自己的电话号码公布在报纸上并记录所有来电者的联系人。当你离开一段时间后,不再确定你的联系人是否仍然拥有相同的手机号码时,你可以拨打公开的联系人的电话。在提供号码之前,他/她会问你:“你认识其他公开的联系人吗?如果认识,请告诉我他们的号码。”之所以这样做是因为他们不能阅读所有报纸,而你一直在做这件事,而且没有花太多力气。这样,他们就可以互相跟踪。然后,联系人会给你一些号码让你拨打,并记下你的号码(以便提供给其他人)以及他/她知道的其他公开联系人的地址(GWebCaches)。
这大致是 GWebCaches 的工作方式。GwebCaches 仅对第一次连接至关重要。当你本地地址簿为空时,你就可以使用它们。它们不应该优先于你的本地地址簿。正如我所说,它们是 Gnutella 的一项新发展,因此我将继续介绍 Gnutella 内的一些最新变化以及未来计划。
- 改变谁呼叫谁
你一定有认识很多其他人的朋友,你可以问他们,并且确信他们会知道能给你答案的人。在 Gnutella 中,这些被称为超级节点。超级节点不需要自己知道很多东西,他/她只需要知道谁知道。在 Gnutella 中,这意味着一个优秀的超级节点不需要拥有很多文件就能使网络受益。如果你害怕分享太多东西,你应该在 Gnutella 中成为一个超级节点。
- 更详细的信息
在计算机世界中,就像在现实世界中一样,有一些联系人可以处理更多的电话,而另一些则不能经常打电话(或负担不起电话费)。在现实世界中,这是因为他们有更多空闲时间。而在计算机世界中,这是因为它们拥有更快的连接(比如 DSL、电缆、T1、T3 或类似的宽带)。意识到这一点后,开发人员决定改变拓扑结构,这意味着当你从外部绘制网络时,它看起来像什么。现在你不再只是给任何朋友打电话,而是只给那些你知道有时间接听你的电话并将其转发给其他人的朋友。为了避免你接到太多电话,他们会问你拥有哪些类型的信息,或者用更人性化的话来说,你的专业领域是什么。在计算机世界中,这意味着你的计算机向超级节点发送所有文件的列表,我们称这些类型的联系人为超级节点。该列表包含所有共享文件的摘要(哈希字符串)(你决定让其他人下载的文件),下载者可以通过它来验证这些文件确实是他们想要的文件。每当一个呼叫到达超级节点时,它会检查你是否可能知道答案,并且只在这种情况下才呼叫你。
这些超级节点与许多其他节点建立了连接,这意味着它们有一个非常大的地址簿。通常情况下,它们与地址簿中 16 个其他超级节点保持联系,并将问题发送给他们,而这些超级节点又会将其发送给另外 16 个超级节点。此外,它们大约有 16 个叶子节点,这些叶子节点无法或不愿经常打电话,超级节点会接受来自它们的电话,并知道它们的 文件或在人类世界中的专业领域。
对于超节点来说,这似乎是一笔不公平的交易,因为他们投入的资源远远超过叶子节点,以维持网络的完整性。但实际上并非如此。虽然超节点 (UP) 将大部分时间用于维持网络运行,但叶子节点则专注于收集和传递信息。因此,当任何用户,无论是超节点还是叶子节点,想要了解某件事时,他们只需发起一个呼叫,然后一个叶子节点专家就可以向他们解释。这样,每个人都可以专攻自己的领域,从而为所有人带来更多收益。
虽然在超节点模式下,并非每个人都需要参与向其他人发送问题,并且人们可以专攻分享自己的信息,但超节点仍然会将每个问题发送给所有人,而不会考虑该超节点是否拥有叶子节点,以及叶子节点是否拥有这些文件。这听起来很正常,因为超节点如何知道其他超节点拥有哪些文件呢?答案,同样来自现实生活。一个普通人会知道她的朋友,也知道他们中哪些人可能知道某个问题的答案,哪些人肯定不知道。在现实生活中,这主要是通过友好的聊天来完成的。
现在,计算机通常不会闲聊,因此他们不会通过这种方式交换信息。因此,查询路由协议 (QRP) 被开发出来。在 QRP 中,每个叶子节点都会告诉其超节点它拥有哪些文件,但它们不会使用文件名,因为这会占用太多空间,而是将文件名中每个单词都保存为数字(毕竟这是计算机)。你可以将这个过程想象成玩“战舰游戏”(数字形成一个有二维坐标的棋盘)。一个超节点不会将所有问题都发送给叶子节点,而只会发送那些叶子节点可能能够回答的问题(击中船只),因此叶子节点接收到的无用呼叫大大减少。
现在,既然这大大减轻了叶子节点的负担,为什么不扩展它呢?这正是他们所做的事情。现在,所有超节点都会将其棋盘发送给其直接邻居。他们只会将那些需要再进行一步搜索才能找到答案的搜索请求发送给那些在其棋盘上击中船只的其他超节点。这意味着,只有在搜索结果可能存在的情况下才会执行最后两步搜索。你可以很容易地看到为什么这会大幅减少带宽使用量:想象一棵树,一棵普通的树,而不是那些数学结构。如果你试图数叶子,你几乎没有机会。但如果你去掉叶子,只数树枝,你的工作量就会大大减少。如果你再去掉所有这些细小的树枝,你就可以真正开始数它们了。QRP 并没有去除所有叶子和所有细小的树枝,但它去除了那些无法提供答案的叶子和树枝。由于问题必须经过的每个部分都会消耗带宽,而且叶子节点的数量远远超过树枝,因此在许多情况下,去掉最后两步中的很多步骤(这意味着去掉很多叶子和细小的树枝)会减少计算机需要发送的查询数量(叶子节点的数量远远超过树枝)。这个例子并不适用于整个 Gnutella 网络,但它很适合这里。
现在,虽然超节点模式和 QRP 部分解决了以下问题:你没有时间向别人解释某件事,或者别人没有时间向你解释某件事,因为你的电话一直在响,接到的都是你不知道答案的问题(或者用技术术语来说:因为网络流量超过了你的连接速度),但仍然存在另一个问题,如果你仔细观察,它可能并不明显。在现实世界中,一个超节点会询问一个能够提供信息的专家,直到找到为止,然后停止询问。在计算机世界中,问题会不断发送,发送给尽可能多的联系人,而不考虑是否已经有了答案。
动态查询改变了这一点。现在,超节点一次询问一个其他超节点,然后等待一段时间,看看是否得到答案。当他们得到足够多的答案以满足需求时,他们就会停止询问更多。这听起来很自然,但对 Gnutella 来说是一个巨大的进步,因为它节省了原本浪费在非常流行的问题上的资源。我将再次以大学领导为例:现在,如果你询问大学领导,你的超节点会首先看看他们是否直接认识可以回答你问题的人。然后,他们会简单地给你一些他们认识的住在校园里的人的联系方式。你仍然会得到不止一个答案,因为他们会给你不止一个联系方式,因为他们无法确定你能否联系到他们给你的每个人。但你不会收到成千上万的电话号码(校园里每个学生都有一个),首先是因为超节点会在那些不会给你带来额外收益的事情上浪费时间,其次,因为你无法打给所有这些人,第三,因为这样你可能无法再联系到你的超节点,因为他们会忙于接听来自其他告诉他们联系方式的人的回电,以及将你的问题发送给其他超节点。
现在你可能会说,“但我无法从这三个人那里下载,因为其他人已经在下载了。我想获取所有可以下载的地址。”(你并不是唯一有这种想法的人。我也有同样的感受。)通过观察现实世界,我们可以找到解决这个问题的方法,而不必在上面浪费太多资源。在现实世界中,如果你询问一个专家向你解释某件事,而那个专家很忙,他或她会知道一些其他专家(因为他们相互认识),这些专家可能现在有更多时间。
将这应用到 Gnutella 中并不像超节点-叶子节点模型或动态查询模型那样容易。但程序员找到了方法。正如我在动态查询模型中所说,你会得到不止一个可以询问的联系方式。现在,当你呼叫一个应该知道答案的人时,你还会向他或她提供你所知道的其他联系方式。这样,专家们就会互相认识(就像我之前提到的 GWebCaches 那样,它们会学习到其他类似的缓存)。由于每个询问者都会带上自己的联系方式集合,专家们就会了解到越来越多的其他地址,当你在询问他们解释某件事,而他们现在没有时间的时候,他们会将这些地址提供给你(即使他们有时间,他们也会这样做,以防万一他们会被打断,而且因为在 Gnutella 中,你可以从多个来源同时下载,就像你在 overnet 网络中一样(overnet 网络对此做到了极致,但它只对大型文件真正有效)。此外,专家们也会将你添加到他们备用联系人的名单中,只要你足够了解,可以向其他人解释。
这就是为什么很多人会从你那里下载你刚下载的文件。
蜂群式下载的解释很简单(但在朋友的朋友模型中很难实现,因此我在这里只忽略它)。它的工作原理是简单地从多个用户同时获取一个文件。文件被简单地分成几个部分,就好像你想从一些朋友那里得到一本书,每个人只复印了几页一样。当你要求每个人复印书的不同部分时,你就会得到完整的书,而且每个人只需要做很少的工作(如果一个人没有时间做,另一个人可以做)。
蜂群式下载与下载网格和部分文件共享 (PFS) 最佳搭配,部分文件共享允许用户分享他们正在下载的文件,因为他们可以分享他们已经拥有的部分,而他们仍然从其他人那里下载。你可以复制你拥有的那些页面,而无需拥有整本书,因为你的页面都已编号,朋友可以向你索取特定的页码。
想象一下,有些人无法接听电话,但可以给别人打电话(也许是因为他们只使用公用电话,或者他们的号码没有显示在你的手机上,而且他们不喜欢公布自己的号码,因为他们不喜欢被推销电话或恐吓电话骚扰)。在 Gnutella 中,这些是位于防火墙后面的计算机。他们可以呼叫其他人并从其他人那里获取信息,但没有人可以呼叫他们。
解决方案是让防火墙后面的用户定期呼叫他们的超节点,当有人想呼叫他们时,他们只需呼叫超节点,然后超节点将两部电话放在一起,一部是防火墙后面的用户(无法接听电话的用户)拨打的电话,另一部是您拨打的电话。这样你就可以和防火墙后面的用户通话,但这需要同时进行两个电话呼叫,这意味着在计算机世界中需要两倍的带宽。防火墙后面的用户会始终保持与超节点的连接,超节点会简单地中转信息或数据。
有一些计划旨在让其他用户来完成电话连接,从而减轻超节点的额外带宽使用负担。然后,当有人想从防火墙后面的专家那里获取信息时,超节点会告诉防火墙后面的用户和询问者呼叫第三个人。然后,那个人会将两部电话放在一起。在 Gnutella 中,大多数用户拥有三到五部电话,因此这不会是一个大问题。这些电话连接器很可能被称为路由节点。
文件磁力链接偏离了“朋友的朋友”模式。它们是网页上的链接,你只需点击它们,它们就会告诉你的文件共享程序去搜索 Gnutella(实际上也包括其他网络)以查找特定文件,并准确下载它。
你可以把它想象成报纸上的文章,文章中提供的信息会告诉你的超级节点,你想要学习的专家需要知道哪些信息。在现实生活中,你很可能会找到一位专家,以及从他或她那里学到东西的人。
使用磁力链接,你可以避免获取不良文件,因为它们使用哈希字符串,这就像专家提供给你的信息的摘要一样。如果他或她开始告诉你垃圾信息,你马上就会发现它与摘要不符。在 Gnutella 中,程序会请求具有相同摘要的文件,而拥有这些文件的用户会分配给这些文件相同的摘要,也称为哈希字符串。下载后,程序会进行自己的摘要,并检查它们是否真的匹配。如果不匹配,它会告诉你文件已损坏。来自相同文件的摘要总是完全相同的,因为它们是通过特定的数学方法完成的,当给定相同数据(也称为信息)时,这些方法总是得到相同的结果。
与磁力链接不同,KaZaA 链接和 eDonkey 链接并不安全,因为它们使用的方法可能会被伪造的文件欺骗(例如,KaZaA 链接会请求一种摘要,该摘要只检查信息的开头和第一部分,而所有其他部分都被忽略,以便更快地创建摘要。自然,很容易让你获得虚假信息,因为它们只需要在开头说真话,然后就可以随心所欲地撒谎或编造信息)。有关磁力链接的更多信息,请访问此处:Magnet-Uri 和 MagnetLink.org
现在有一种新的磁力链接版本:KaZaA 磁力链接。不幸的是,这些并不安全,因为它们使用的是 KaZaA 哈希系统(不完整的摘要)进行了一些更改(现在添加了另一个较小的摘要,它可能会告诉你关于缺失部分的信息,但他们没有发布它们是如何创建它的)。如果 KaZaA 磁力链接提供了有关搜索词的信息,它们可能会与 Gnutella 配合使用,但它们不能保证你能得到它们提供给你的东西。如果你在链接中找到“kzhash”一词,它可能并不安全(除了名字有点错位之外)。
LimeWire 是一款跨平台 Java 平台 的 点对点文件共享 客户端,开源 (GPL),它使用 Gnutella 网络来查找和传输文件。它还鼓励用户付费,付费后用户就可以使用 LimeWire Pro。它还通过使用 C++、Boost 许可的 libtorrent 库支持 BitTorrent 协议。
要成为 Gnutella 网络的一部分,可以使用以下列出的客户端之一
- Deepnet Explorer (http://www.deepnetexplorer.com/) 是一款带有 RSS 新闻阅读器、P2P 客户端集成 (Gnutella) 和网络钓鱼警报的浏览器,闭源,仅限 Windows,免费软件。
- Phex 跨平台 Java 客户端。
- XoloX
- Gnucleus - Gnutella、Gnutella2 (G2) 使用 C++ 和 Microsoft MFC 库编写。核心是 LGPL,并使用 Windows COM-base 与 GPL 前端通信。
- Gtk-Gnutella,GPL,适用于 GNU/Linux。
- Hydranode(多协议,在 eDonkey2000/eMule 部分中引用)
- ezpeer,一款中国客户端。
- pp365,一款中国客户端。
- POCO,一款中国客户端,使用 GnucDNA。
- Bearshare,适用于 Window 的免费闭源软件。
- CocoGnut,适用于 RISC OS。
- Swapper,适用于 Windows 的免费闭源软件,利用 .NET。
- TrustyFiles,适用于 Windows,支持 FatTrack (KaZaA)、Gnutella 和 G2。
- Shareaza (http://shareaza.sourceforge.net/),开源 (GPL),使用 C++、MFC 和 ATL 编写。支持 Gnutella2 (G2)、Gnutella、eDonkey2000/eMule、BitTorrent、FTP 和 HTTP 协议的多网络点对点文件共享客户端。
- FrostWire (http://sourceforge.net/projects/frostwire/),一款适用于 Gnutella 网络的点对点 (P2P) 信息共享客户端。该项目与 LimeWire LLC 无关。它是 Limewire 的 Java 实现的分支,承诺永远不包含内容过滤器。FrostWires 的源代码 (Java) 采用 GNU GPL 开源许可证。较新的版本已迁移到使用 BitTorrent 协议。
- Acquisition,一款基于 Limewire 核心的 Mac OS X 客户端,使用 Cocoa 编写,共享软件。
- XNap,一款使用 Limewire 核心进行 Gnutella 的多网络 Java 程序。
Ares(软件实现)是在 2002 年中期开发的,最初使用 Gnutella 网络。在运行了六个月后,它切换到了自己的网络,该网络包含叶子和 超级节点 p2p 架构。由于协议难以识别,Ares 有时是唯一一个可以在受限网络(例如一些大学校园)上正常运行的 P2P 客户端。
- Ares (http://aresgalaxy.sourceforge.net/),一款使用 Delphi/Kylix 编写的聊天/文件共享 P2P 实现。它基于一个组织成叶子和超级节点的网络,以广播式搜索为特征。Ares 可以通过 DHT 技术提供更广泛的搜索范围,使用 mime 过滤器到 DHT 引擎。Ares 用户还可以加入聊天室或主持频道。它适用于 32 位 MS Windows 操作系统 (NT/2000/XP),并在 GPL 许可证 (GNU 通用公共许可证) 下开源。从 1.9.0 版本开始,两个防火墙后面的对等点之间可以共享数据。从 1.9.4 版本开始,Ares 包含对 BitTorrent 协议的支持。从 1.9.9 版本开始,Ares Galaxy 支持 SHOUTcast 互联网广播电台。
- 已停止的实现
- Warez P2P 是一款专有的 P2P 文件共享 服务,它使用 Ares 网络,并提供类似于 Kazaa 的服务。在 1.6 版本之前,Warez P2P 是 Ares Galaxy 的克隆,由意大利开发者 Alberto Trevisan 创建,但从那时起,它一直由 Neoteric Ltd 独立开发,直到最近才停止使用。
直接连接是一种点对点文件共享协议/网络,但它使用中央服务器,这种对中央点的依赖也可以在旧的 Napster 网络上看到,因为每个服务器都构建了一个独立的网络(不像 eMule 那样是混合网络)。应该注意的是,一些客户端现在也正在实现 DHT,这将导致使用的网络统一。Direct Connect 协议最初由 Jonathan Hess 开发,用于 Neo-Modus Direct Connect (NMDC) v1,于 2001 年 9 月发布,部分在 NMDC v2 中发布,于 2003 年 7 月发布。
Direct Connect 将服务器定义为集线器。客户端连接到中央集线器,该集线器具有连接到它的客户端或用户的列表。然后,用户可以搜索要下载的文件,或者与在(该服务器上)出现的其他用户聊天。
Direct Connect 还为文件传输实现了 Tiger 树哈希 (TTH)。
由 Jon Hess 在 Neo-modus 协议镜像中创建 (http://www.teamfair.info/wiki/index.php)
ADC 协议(http://dcplusplus.sourceforge.net/ADC.html)与 Neo-Modus 直连 (NMDC) 协议类似。它由一个用于客户端-服务器网络的文本协议组成,旨在简单且可扩展。
Jon Hess 通过 Neo-Modus 直连客户端/集线器为该协议的创建做出了贡献,最初的想法来自于直连。另一个主要的贡献来源是 Jan Vidar Krey 的 DCTNG 草案,该草案导致了 Dustin Brody、Walter Doekes、Timmo Stange、Fredrik Ullner、Fredrik Stenberg 等人的后续工作。
- DConnect 守护进程(http://www.dc.ds.pg.gda.pl/),一个用 C 语言编写的开源直连集线器(作为守护进程运行)。目前在 GNU Linux 和 FreeBSD 上运行,但计划使其能够在所有类 Unix 系统和 Windows 上运行。作为守护进程,它在后台运行,不需要任何 Xwindow 系统。支持 telnet 管理控制台。
- NeoModus 直连
- DC++(http://dcpp.net/ 或 http://sourceforge.net/projects/dcplusplus/),旨在使用 ADC 协议生成文件共享客户端的项目。它还支持连接到直连网络,在 GPL 下开源,使用 C++/MFC 在 Windows 上运行。它主要由 Jacek Sieka 开发,绰号 arnetheduck。
- BCDC++
- RevConnect(http://www.revconnect.com/),也支持 Kademlia,在 GPL 下开源,使用 C++/MFC 在 Windows 上运行。
- Strong DC++(http://strongdc.berlios.de/download.php?lang=eng),在 GPL 下开源,使用 C++/MFC 在 Windows 上运行。
- ApexDC++(http://www.peerwebdc.tk/ - http://sourceforge.net/projects/apexdc/),基于 Strong DC++。它具有许多功能,例如阻止 IP 地址的插件(使用 PeerGuardian 黑名单)、超级种子、自定义、主题和一个漂亮 Vista 风格的通用用户界面,在 GPL 下开源,使用 C++/MFC 在 Windows 上运行。
- TkDC++(http://tkdcpp.com),在 GPL 下开源,使用 C++/MFC 在 Windows 上运行。
- GtkDC(http://gna.org/projects/gtkdc/),一个用 C 语言编写的直连客户端,基于 GIMP 工具包 2.0 GUI。它旨在在基于 UNIX 的平台上运行,但经过一些移植后,它应该能够在使用 Gtk 库的 Windows 平台上执行。在 GNU 通用公共许可证 V2 或更高版本下授权。
- FlylinkDC++(http://www.flylinkdc.com 和 http://www.flylinkdc.ru),基于 StrongDC++
eDonkey 是 eDonkey 网络(也称为 eDonkey2000 网络或 eD2k)的原始客户端,由 MetaMachines(Sam Yagan 和 Jed McCaleh)在纽约市创建和管理。它拥有一个稳定的 P2P 社区,该协议比 BitTorrent 更早,它是在 2002 年 Napster 关闭后不久创建的,并与 FastTrack 网络竞争。2005 年 6 月,娱乐行业在美国最高法院取得了胜利,最高法院裁定,如果任何文件共享开发者诱导此类行为,他们可能会因侵犯版权而被起诉。2005 年 9 月,美国唱片业协会 (RIAA) 向多家商业 P2P 开发商发出停止并 desist 信函,包括 MetaMachines,由于没有资金来对抗最高法院裁决的解释,Sam Yagan 承认失败,正如他对美国参议院司法委员会所作的证词。
2006 年 9 月 11 日,用户无法获得 eDonkey2000 客户端软件,2006 年 9 月 12 日,MetaMachines 支付了 3000 万美元(美金)的和解金,该协议关闭了 MetaMachines 未来处理任何 P2P 技术的任何途径...
eDonkey 网络是集中的(因为它依赖于服务器)以提供内容的去中心化共享(未存储在服务器上),仍然有许多支持该网络的软件实现,最受欢迎的是 eMule。
"The eMule Protocol Specification"(http://sourceforge.net/project/showfiles.php?group_id=53489&package_id=145950)由 Yoram Kulbak 和 Danny Bickson DANSS(分布式算法、网络和安全系统)实验室 - 希伯来大学计算机科学与工程学院 - 以色列 - 2005 年 1 月 20 日提供,由 Emule 项目提供的 PDF 文档。
由 Jed McCaleb(eDonkey2000 的创建者)启动,作为 Overnet 项目,以克服对服务器的需求。Overnet 实现了 Kademlia 算法。在 2006 年底,由于来自 RIAA 和其他组织的法律诉讼,Overnet 和所有 Overnet 拥有的资源都被关闭。然而,由于 Overnet 的核心是去中心化的,Overnet 客户端仍然能够以有限的功能运行。
KadC 库(http://kadc.sourceforge.net/)提供了一个开源 C 库,用于在基于 Kademlia 的分布式哈希表中发布和检索记录。
一篇比较古老的论文名为 Kademlia:基于 XOR 度量的点对点信息系统,由 Petar Maymounkov 和 David Mazières 撰写,也可以作为有关该协议的信息来源。
该网络现在被称为 Kademlia,并得到许多旧的 eDonkey/Overnet 客户端实现的支持,尤其是 eMule 项目。Kademlia 是一项研究工作,旨在基于 XOR 度量 路由 来实现一个功能齐全的点对点系统。特别值得注意的是,其目标是实现高效的数据存储和查询;匿名性;网络、内容和用户安全以及身份验证。
(http://content.emule-project.net/)eMule 项目团队为 eDonkey2000 和 Kad 网络用户提供的一项服务,使他们可以免费下载内容并易于查找。该内容数据库自 2004 年新年左右开始上线。
- eMule(http://www.emule-project.net/)基于 eDonkey2000 网络的文件共享软件实现,但提供比标准客户端更多的功能,开源 C++/MFC,仅限 Windows,在 GPL 下授权(http://sourceforge.net/projects/emule/)
- Xmod(http://savannah.nongnu.org/projects/x-mod/)Xmod 项目基于 eMule 客户端,在 GPL 下开源。
- xMule(http://www.xmule.ws/),X11 Mule,旨在将 eMule 的克隆版本带到几乎所有主要的 Unix 平台,特别强调 Linux。使用 wxWidgets 的 C++ 用于 GUI,在 GPL 下开源发布。
- MLdonkey(http://mldonkey.sourceforge.net)是一个跨平台、多网络的P2P实现。它支持多个大型网络,例如eDonkey、Overnet、Kademlia、Bittorrent、Gnutella(Bearshare、Limewire等)、Gnutella2(Shareaza)或Fasttrack(Kazaa、Imesh、Grobster)。网络可以启用或禁用。搜索在所有启用的网络上并行执行。对于某些网络,每个文件可以从多个客户端同时下载。
- AMule(http://www.amule.org/wiki/)这个项目基于eMule客户端,也使用C++,但也使用wxWidgets和crypto++。在GPL下开源,目前支持Linux、FreeBSD、OpenBSD、Windows、MacOS X和X-Box,无论是在32位还是64位计算机上。
- eMule Bowlfish(http://pwp.netcabo.pt/DeepSea/),另一个基于eMule的项目,旨在提供受限的网络解决方案。
- Hydranode(http://hydranode.com/)是一个模块化、插件驱动的点对点客户端框架,它旨在进行真正的多网络下载(支持eDonkey2000和Bittorrent网络)。在GPL下开源,支持Linux和Windows。
- Shareaza(多协议,在Gnutella部分提及)
BitTorrent是由布拉姆·科恩创建的一种协议(BitTorrent协议规范v1.0),它源自Gnutella概念,但主要用于在互联网上传播大型计算机文件并允许WEB集成,实际上它旨在取代旧的集中式HTTP下载,而不是一个完整的P2P网络。因此,它最初避免了在网络上传输搜索请求的限制,这是最近通过采用类似于eDonkey解决方案的DHT实现的,它允许在整个网络中搜索。使BitTorrent成为一个两层P2P。
BitTorrent用于分发合法内容,但本身不会对共享材料的版权状态进行任何区分,就像任何其他去中心化网络一样,这允许大规模侵权。布拉姆·科恩和阿什温·纳文于2004年9月22日创建了BitTorrent公司,总部位于旧金山,加利福尼亚州,是一家私人持有的美国公司,开发变革性技术和产品以继续推动更有效和开放的互联网发展,还通过研发和开放规范促进BitTorrent协议的发展。
BitTorrent(http://www.bittorrent.com)也是该协议的原始实现的名称。它最初是一个Python(源代码和旧版本)应用程序,现在被称为BitTorrent Mainline,它导致了一个功能齐全的商业企业。BitTorrent.com是BitTorrent公司的一部分,现在是使用BitTorrent协议下载娱乐内容的目的地。该网站提供快速、按需访问最全面的授权目录,其中包括数千部电影、电视剧、音乐和游戏,但它也为内容创建者提供了一个发布平台,让他们可以将自己的作品以高品质的方式列出,与主要电影工作室、电视网络和唱片公司的最知名作品并列。
BitTorrent公司还通过更广泛的标准机构,例如互联网工程任务组(IETF)的LEDBAT工作组(http://www.ietf.org/html.charters/ledbat-charter.html),做出贡献。BitTorrent公司拥有BitTorrent Mainline和µTorrent客户端,以及BitTorrent DNA(交付网络加速器),这是一个基于BitTorrent协议的免费内容交付服务,它将用户贡献带宽的力量带给了传统的内容发布商,同时让发布商完全控制自己的文件。
BitTorrent协议本质上是点对点的,它最初的创新方法不是围绕创建真正的分布式网络,而是围绕特定的共享资源,在这种情况下是文件,最好是大文件,因为用户直接连接到彼此以从其他对等体发送和接收大文件的各个部分,这些对等体也已下载了该文件或其部分。然后,这些片段重新组装成完整的文件。由于用户彼此下载而不是从一个中央服务器下载,因此下载大型文件的带宽负载分配到用户从其下载的众多来源之间。这降低了托管大型文件的用户的带宽成本,并提高了下载大型文件的用户的下载速度,因为该协议利用每个下载者的上行带宽来提高整体分发的效率,并使下载者受益。但是,有一个中央服务器(称为跟踪器)协调所有此类对等体的操作。跟踪器只管理连接,它不知道正在分发的文件的任何内容,因此可以使用相对有限的跟踪器带宽来支持大量用户。
BitTorrent的关键理念是用户应该在下载(接收入站)的同时上传(传输出站)。以这种方式,网络带宽能够得到尽可能高效地利用。BitTorrent的设计目的是随着对某个文件的兴趣人数增加而更好地工作,这与其他文件传输协议形成对比。
BitTorrent正在重新定义人们共享和搜索内容的方式,并且由于它非常特定于文件,并且在P2P内容的“新”因素方面有所提高,因此越来越流行用于下载电影、电视剧、完整音乐专辑和应用程序(它在与其他替代方案的性能方面有所提高),更多用户意味着更多速度,但它不是罕见文件或分发未被高度搜索的内容的最佳解决方案。
要下载使用BitTorrent托管的文件,用户必须拥有BitTorrent客户端,并且要发布文件,用户必须运行跟踪器。
2004年11月,BitTorrent占互联网所有流量的惊人35%,据英国网络分析公司CacheLogic称,2006年BitTorrent协议已上升到互联网所有流量的60%以上。由于这一点,一些ISP正在进行流量整形,也称为带宽限流,这意味着它们正在降低协议在其网络中的优先级,并降低其整体性能,这导致了两种反应,一些ISP正在投资升级其网络并为该协议提供本地缓存,而该协议的实施者正在开始与拒绝适应的ISP作斗争,方法是加密和随机化它,这种适应的需要以及由于偏离其创建者的愿景而导致的越来越高的普及程度正在将更多协议的演变交到独立开发人员手中。
BitTorrent系统高度依赖于对等体的积极参与,因为它唯一的目标是共享文件。在该系统中,罕见和“旧”内容不容易找到,只有高度搜索的内容才能从这种P2P实现中获益。小文件也不能充分利用它,因为复制所需的时间太短,在某些极端情况下甚至会降低体验。
有许多不同的BitTorrent网站索引内容,每个网站都提供有关通过BitTorrent协议分发文件的的信息。它们通常包含多个种子文件以及这些文件的索引。在典型情况下,用户会进入此类网站并浏览或搜索他们想要的内容,这些内容基于其他用户在该网站上发布的种子文件描述。如果找到包含所寻求内容的种子文件,用户可以下载该种子文件。
合法种子文件(http://www.legaltorrents.com),这是一组Creative Commons授权、合法可下载、自由分发的创作者批准的文件,从电子/独立音乐到电影和书籍,这些文件已通过BitTorrent提供。每个获取BitTorrent客户端并下载的人都有助于贡献更多带宽。
还有OpenBitTorrent(http://openbittorrent.com)、OpenBitTorrent.kg(http://www.openbittorrent.kg)、myTorrentTracker(http://www.mytorrenttracker.com)和trackhub(http://trackhub.appspot.com),所有这些都是任何人都可以用来共享文件的免费BitTorrent跟踪器。您无需在任何地方注册、上传或索引种子文件,您只需在种子文件中包含跟踪器URL即可。
其他
- bt.etree.org(http://bt.etree.org/),由etree.org社区提供的一个网站,用于共享友好交易艺术家现场演唱会的录音。
- 海盗湾(http://thepiratebay.org)。
- mininova(http://www.mininova.org/)。
这些网站都有不同的功能来帮助用户搜索。请参阅维基百科的BitTorrent网站比较页面。几个较大的BitTorrent跟踪器网站被关闭,理由是担心版权所有者,主要是大型商业利益的代表。虽然从短期来看,它确实阻止了大规模的版权侵权,但也给合法使用带来了困难,而且存在虚假通知问题,即声称对他们不拥有的作品拥有权利的侵权行为。从长远来看,这并不能解决问题,反而迫使该协议以避免此类破坏的方式发展。人们适应这种压力的一个方法是创建私人跟踪器,这些跟踪器只能通过邀请获得。
如前所述,BitTorrent是一种分发文件的协议。它通过URL识别内容,并设计为与网络无缝集成。它优于普通HTTP的优势在于,当同一文件的多个下载同时发生时,每个下载者都互相上传,从而使文件源能够以适度的负载增加来支持大量下载者。(http://www.bittorrent.com/protocol.html)。BitTorrent分享了其他P2P协议中的一些术语,但也创建了一些新的术语(请参阅维基百科的页面BitTorrent词汇以了解更完整的列表)。
- 种子文件
- “种子文件”可以指代一个
.torrent
元数据文件,也可以指代由它描述的所有文件,具体含义取决于上下文。根据 BitTorrent 规范的定义,种子文件包含多个跟踪器的 URL,这些跟踪器协调蜂群中对等节点之间的通信,并包含有关所有可下载文件完整性的元数据,包括文件名称、大小和校验和。它还可以包含 BitTorrent 规范扩展中定义的附加元数据,称为BitTorrent 增强提案。此类提案的示例包括元数据,用于声明谁创建了种子文件以及何时创建的。
该协议部分依赖于中心化,因为需要跟踪器。
- 客户端
- 该程序使通过 BitTorrent 协议进行P2P文件共享成为可能。它仍然表明该协议的半中心化性质,在协议定义中,该术语有时被替换为对等节点(例如:peer_id),例如 Gnutella 将参与者始终称为对等节点或节点,将实现者称为供应商。
- 跟踪器
- 一个跟踪器是一个服务器,它跟踪蜂群中哪些种子和对等节点。客户端定期向跟踪器报告信息,并交换接收有关其他客户端的信息,以便它们可以连接。跟踪器不直接参与数据传输,也不拥有文件的副本。
- 抓取
- 当客户端向跟踪服务器发送请求,以获取有关种子文件的统计信息时,例如与谁共享文件以及其他用户共享文件的效率如何。
随着 DHT(分布式哈希表)的采用,BitTorrent 协议开始从围绕单个资源的半中心化分发网络转变为更加去中心化的网络,它去除了静态控制点(跟踪器),这是通过依赖 DHT 和使用PEX 扩展来实现的。它使不稳定的对等节点也能够充当跟踪器,但即使这解决了对静态跟踪器服务器的需求,网络仍然围绕内容进行中心化。对等节点没有默认的能力在该上下文中相互联系。
- 种子
- 一个种子是一个客户端,它拥有种子的完整副本,并且仍然提供上传。种子越多,获得更高下载速度的可能性就越大。如果种子上传了下载的完整副本,则应该获得更快的下载速度。
种子规则,就像我们在超级种子的特殊情况下看到的那样,是在客户端本地实施的变量和算法,通常以某种形式开放供用户控制。这些规则控制并可能用于优化对可用种子的选择,而不仅仅是在列表中启动下一个种子,并根据种子排名对种子进行排序。
- 种子排名
- 这是一个优先级评级,它根据客户端的活动种子规则进行计算,用于根据种子的需求优先级对种子进行排序。它生成一个优先级队列,其中可用种子被授予使用可用传输开放插槽的权限。几个因素可能影响种子排名。
- 种子比率。比率越低,种子越稀有,它的种子排名应该越高,优先考虑稀有种子。
- 种子数量。类似于种子比率,但不仅考虑完整种子,还考虑对种子感兴趣的任何客户端的数量,以相反的方式工作,优先考虑更大的蜂群和需求量大的种子。
- 定时轮换。种子将在种子模式中轮换进出。每个种子都有一个保留种子的持续时间。
- 默认。每个种子将根据它们添加到种子列表中的顺序进行排序。
- 宣布
- 类似于“抓取”,但意味着客户端还会宣布它想加入蜂群,并且服务器应该将其添加到该蜂群的对等节点列表中。
- 可用性(也称为分布式副本)
- 这是分布式系统中常用的一个词,在本例中,它指的是客户端可以使用的文件的完整副本数量。每个种子将此数字增加 1.0,因为它们拥有文件的完整副本。连接的对等节点拥有文件的某个部分,它会将该部分添加到可用性中,如果其他对等节点没有此部分文件。
- 示例:拥有 65.3% 文件下载的对等节点将可用性增加 0.653。但是,如果两个对等节点都拥有相同的下载部分(例如 50%),并且只有一个种子,则可用性为 1.5。
- 感兴趣
- 描述一个希望获取客户端拥有的文件部分的下载器。例如,如果下载的客户端没有上传的客户端拥有的部分,并且希望获得该部分,则上传的客户端会将下载的客户端标记为“感兴趣”。
- 下载器
- 一个下载器是任何没有整个文件并且正在下载文件的对等节点。这个术语,在布拉姆·科恩的Python 实现中使用,缺乏与吸血鬼相关的负面含义。布拉姆选择下载器而不是吸血鬼是因为 BitTorrent 的等价交换确保下载器也上传,因此不公平地归类为吸血鬼。
- 阻塞
- 描述一个被拒绝文件部分的客户端。客户端在几种情况下会阻塞另一个客户端
- 第二个客户端是一个种子,在这种情况下它不想要任何部分(即,它完全不感兴趣)
- 客户端已经以其全部容量上传(它已达到
max_uploads
的值) - 第二个客户端已被列入黑名单,因为它具有攻击性或正在使用列入黑名单的 BitTorrent 客户端。
- 冷落
- 如果下载的客户端在超过 60 秒的时间内没有收到上传的客户端的任何数据,则上传的客户端会被标记为冷落。
BitTorrent 的扩展协议
[edit | edit source]由阿维德·诺伯格和路德维格·斯特里吉斯创建(描述http://www.rasterbar.com/products/libtorrent/extension_protocol.html),它是协议的扩展,旨在为 BitTorrent 协议的未来扩展提供简单且轻薄的传输。该协议使添加新扩展变得容易,而不会干扰标准 BitTorrent 协议或不支持此扩展的客户端。
扩展消息 ID 在握手时定义,以避免拥有消息 ID 的全局注册表。相反,扩展消息的名称需要唯一名称,这在没有全局注册表的情况下更容易实现。
Vuze 似乎还有一个并行实现或变体(http://wiki.vuze.com/w/Azureus_messaging_protocol),它被 Vuze 和 Transmission 使用。
对等节点交换
[edit | edit source]对等节点交换或PEX是一种通信协议,它增强了BitTorrent 文件共享协议。它允许一组用户(或对等节点)协同共享给定文件,以更快速、更高效的方式进行共享。PEX 通过使用两种常见的扩展协议之一来实现。
在 BitTorrent 文件共享协议的原始设计中,文件共享组(称为“蜂群”)中的用户(对等节点)依赖于一个称为跟踪器的中央计算机服务器来相互查找并维护蜂群。PEX 通过允许每个对等节点直接更新蜂群中的其他对等节点,从而大大减少了对等节点对跟踪器的依赖。通过减少对集中式跟踪器的依赖,PEX 提高了 BitTorrent 协议的速度、效率和稳健性,使其更加去中心化。
如前所述,想要获取文件副本的用户通常会先下载一个 .torrent 文件,该文件描述了要共享的文件,以及一个或多个称为 跟踪器 的中央计算机的 URL,这些中央计算机维护着当前共享 .torrent 文件中描述的文件的节点列表。在最初的 BitTorrent 设计中,节点依靠这个中央跟踪器来互相查找并维护群组。后来,分布式哈希表 (DHT) 的发展意味着群组中其他计算机可以保存部分节点列表,从而减轻了中央跟踪器计算机的负载。PEX 允许群组中的节点直接交换有关群组的信息,而无需询问 (轮询) 跟踪器计算机或 DHT。通过这样做,PEX 利用了用户连接的节点的知识,通过询问它们连接的节点的地址。这比仅仅依靠跟踪器更快、更有效,并减轻了跟踪器的处理负载。它还能在跟踪器宕机时保持群组的完整性。事实上,一旦节点保存了文件共享的完整副本,就消除了对分发的任何控制。
节点交换本身无法用于将新节点引入群组。为了与群组建立初始连接,每个节点必须使用“.torrent”文件连接到跟踪器,或者使用称为 引导节点 的路由器计算机来查找描述群组节点列表的分布式哈希表 (DHT)。对于大多数 BitTorrent 用户来说,DHT 和 PEX 会在用户启动 BitTorrent 客户端并打开 .torrent 文件后自动开始工作。一个显著的例外是“私有种子”,它们不是公开可用的;它们会禁用 DHT。
Azureus 和 µTorrent 开发人员一致同意,任何实现上述机制的客户端在发送 PEX 消息时都应遵守以下限制:
- 任何给定的 PEX 消息中,添加的节点数不应超过 50 个,删除的节点数不应超过 50 个。
- 节点交换消息的发送频率不应超过每分钟一次。
一些客户端可能会选择强制执行这些限制,并断开忽略这些限制的客户端的连接。
永久 DHT 跟踪
[edit | edit source]随着 PEX 的实现和对分布式哈希表 (DHT) 的依赖,向创建真正无服务器的 P2P 覆盖网络演变成为下一步的逻辑步骤,就像 eDonkey 网络的演变一样。DHT 的工作方式基本相同,它将不仅从旧的跟踪器中获取信息,还会从 PEX 实现中获取信息,从而创建类似于共享种子的分布式数据库,充当备份跟踪器,在所有其他跟踪器都宕机或无法提供足够的节点时发挥作用,同时也能实现无跟踪器的种子。如果客户端启用了该选项,则 DHT 会充当并添加到种子中,作为伪跟踪器,DHT 跟踪器可以像普通跟踪器一样,在每个种子中启用和禁用。使用这种永久 DHT 跟踪的客户端现在是一个完全连接的去中心化 P2P 网络,它们作为新节点加入 DHT,这当然需要私有跟踪器(或非公开分发)自行排除在参与范围之外。
- 引导 DHT
由于 DHT 独立于任何单个跟踪器(和故障点),因此必须解决 DHT 路由表在首次使用 DHT 时如何引导的问题。这可以通过几种方法实现:
- 手动输入 DHT 节点的主机名和端口号。
- 连接到具有包含 DHT 节点列表的 .torrent 文件的跟踪器。
- 下载任何具有广告支持 DHT 的节点的种子。并非所有客户端都完全支持,因为它要求客户端在 BitTorrent 握手中广告 DHT 支持。
- 磁力链接
传统上,.torrent 文件是从种子网站下载的。但一些客户端也支持 磁力 URI 方案。磁力链接不仅可以提供在 DHT 中搜索共享文件的所需节点所需的种子哈希,还可以包含该文件的跟踪器。
BitTorrent 增强提案 (BEP)
[edit | edit source]BitTorrent 增强提案流程 (BEP) 是由 John Hoffman 发起的流程。该流程在公共领域文档 ( http://www.bittorrent.org/beps/bep_0001.html ) 中定义。
BitTorrent 增强提案列表可用 ( http://www.bittorrent.org/beps/bep_0000.html )。
BEP 是一种设计文档,它向 BitTorrent 社区提供信息,或描述 BitTorrent 协议的新功能。BEP 应提供该功能的简明技术规范以及该功能的理由,旨在成为提出新功能、收集社区对某个问题的意见以及记录 BitTorrent 设计决策的主要机制。
BEP 作者负责在社区内达成共识并记录异议。由于 BEP 作为结构化文本文件保存在版本控制的存储库中,因此它们的修订历史记录就是功能提案的历史记录。
超级覆盖
[edit | edit source]超级覆盖 在 BEP 16 ( http://www.bittorrent.org/beps/bep_0016.html ) 中指定,是对 BitTorrent 协议 的扩展(在不更改协议的情况下实现),旨在用于只有一个 种子 的情况,它允许管理资源的稀缺性。
在种子检测到自己是文件唯一来源的情况下,它将尝试将上传的数据量降到最低,以保证外部共享并优化对稀缺资源的访问,直到它检测到其他完整种子存在。该功能由 John Hoffman 构思,并于 2003 年在 BitTornado 客户端中首次实现。
uTP
[edit | edit source]uTP 或 µTP(有时也称为 微传输协议)是一种 开源 跨平台 协议,旨在构建在 UDP 协议之上,是 LEDBAT(一种 TCP 拥塞避免算法)的类似 TCP 的实现。
µTP 是在 BitTorrent, Inc. 内部开发的,没有任何来自网络或 BitTorrent 社区的输入,旨在提供可靠、有序的交付,同时保持最小的额外延迟,以便在干扰其他应用程序时自动降低 对等 文件共享 种子 用户之间数据包的传输速率。例如,该协议应自动允许在 BitTorrent 应用程序和 Web 浏览器之间共享 ADSL 线路。它最初是在 µTorrent 1.8.x 测试版分支中引入的,并在 µTorrent 1.9 的 alpha 版本中公布,现在是 uTorrent 对等连接的主要传输协议。
uTP 在 BEP 29 ( http://bittorrent.org/beps/bep_0029.html ) 中被记录为 BitTorrent 扩展。BitTorrent, Inc. 已根据 MIT 许可证提供了一个 C++ 实现 ( http://github.com/bittorrent/libutp ),但外部接口严格来说是 C(ANSI C89)。
BitTorrent 协议加密
[edit | edit source]截至 2005 年 1 月,BitTorrent 流量占总住宅互联网流量的三分之一以上。一些 ISP 决定采取不同的措施来控制甚至破坏 P2P 流量,如本书的 暗中行动 部分所述。
这催生了对提供 BitTorrent 协议加密 的需求。混淆和加密使流量更难以检测和监控,因此更难以限速。BitTorrent 协议加密并非旨在提供 匿名性 或 机密性,即使有些解决方案会通过混淆内容来提高机密性。
BitTorrent 的发明者布拉姆·科恩反对在 BitTorrent 协议中添加加密。科恩表示,他担心加密会导致客户端之间不兼容,并强调大多数 ISP 并没有屏蔽 BitTorrent 协议。科恩写道:“我怀疑一些开发人员被他们的 ISP 限速了,他们更感兴趣的是试图绕过他们 ISP 的限制,而不是整个互联网的性能”。在受到了一些对这种立场的批评之后,科恩后来在他的 主线客户端 上添加了接收加密连接但不发起加密连接的能力。值得注意的是,当 µTorrent 被 BitTorrent, Inc. 收购并成为下一个主线版本后,发起加密连接的能力得以保留,但默认情况下被关闭了。
加密并不能阻止配置为普遍降低所有加密、不可识别或未知协议速度的流量整形系统,这种方法简单到只需丢弃数据包。加密跟踪器通信可以防止监听对等节点列表,并且不需要升级对等节点连接的双方,但它需要对跟踪器施加计算开销。
- 协议头加密 (PHE)
- 由 RnySmile 创建,并在 2005 年 9 月 8 日的 BitComet 0.60 版本中首次实现。规格既没有发布,也不兼容 MSE/PE,并且有人声称它已经被反向工程,降低了它的实用性。
- 消息流加密 (MSE)/协议加密 (PE)
- 由 Azureus(现在是 Vuze)在 2006 年 1 月下旬开发,后来经过多次修改,使其被其他 BitTorrent 客户端的创建者更广泛地接受。
- 根据规格(http://wiki.vuze.com/w/Message_Stream_Encryption),MSE/PE 使用 密钥交换 与 torrent 的 infohash 相结合,建立一个 RC4 加密密钥。密钥交换有助于最大程度地降低被动监听的风险,而 infohash 有助于避免 中间人攻击。选择 RC4 是因为它速度快。第一个千字节的 RC4 输出被丢弃,以防止 特定攻击。
- 规格允许用户选择仅加密头或加密整个连接。加密整个连接提供更多混淆,但会使用更多 CPU 时间。为了确保与不支持此规范的其他客户端的兼容性,用户也可以选择是否仍然允许未加密的传入或传出连接。支持的客户端通过 PEX 和 DHT 传播它们启用了 MSE/PE 的事实。
- 对这种方法的分析表明,对 TCP 会话中前 100 个数据包的数据包大小和数据包方向的统计测量可以用来识别混淆的协议,准确率超过 96%,这使得这种解决方案仅对没有采用最先进的流量分析的 ISP(主要是较小的 ISP)有效。
存在各种解决方案来保护 BitTorrent 网络免受攻击,包括加密对等节点到跟踪器和对等节点之间的通信,使用微软的 Teredo 使 TCP 连接在 UDP 数据包内进行隧道传输,在它们到达终端主机上的 TCP 层之前过滤掉 TCP 重置,或完全从基于 TCP 的传输切换到基于 UDP 的传输。每种解决方案都有其权衡。过滤掉攻击性 TCP 重置通常需要内核访问权限,以及远程对等节点的参与,因为攻击者必须将重置数据包发送到本地和远程对等节点。Teredo 并非在所有 BitTorrent 客户端上都可用。在新的 UDP 协议中重写 TCP 可靠性、按顺序交付和拥塞控制代表着重大的工程工作量,并且需要升级任何对等节点连接的双方。
维基百科在诸如 BitTorrent 软件比较 和 BitTorrent 客户端使用份额 的文章中提供了一些相关信息。以下列表旨在提供一个关于与其他 P2P 协议相关的实现细节的一般概念和比较。
(这不应该被视为 BitTorrent 客户端的完整列表,没有使用特殊的排序。所有链接都已验证,软件的编程语言和许可证已得到特别关注。最后更新于 2010 年 9 月 11 日)
- BitTorrent 队列管理器(http://btqueue.sourceforge.net),一个基于控制台的 BitTorrent 客户端,内置调度程序用于处理多个会话。它旨在轻松地管理队列中的会话,而无需重量级的 GUI。外部模块可以搜索跟踪器中的新 torrent 并自动提交它。开源(Python 软件基金会许可证)项目,使用 Python。
- Vuze 以前称为 Azureus(http://azureus.sourceforge.net 或 http://www.vuze.com/),一个用 Java 编写的开源 BitTorrent 客户端,可能是网络中最先进的对等节点(支持多个 torrent 下载、排队/优先级系统、启动/停止种子选项、嵌入式跟踪器、主线 DHT 等等),但它也是众所周知的资源占用大户,会消耗大量的内存和 CPU 功率。
- µTorrent(http://utorrent.com),一个用 C++ 编写的闭源、免费软件 BitTorrent 客户端,一个非常完整对等节点(包括带宽优先级、调度、RSS 自动下载和主线 DHT 等等),系统占用率非常低。
- BitTornado(http://bittornado.com),一个基于 Python 编写的开源 BitTorrent 客户端,基于原始的 BitTorrent 客户端。
- BitComet(http://www.bitcomet.com),(最初从 0.11 到 0.37 版本名为 SimpleBT 客户端)是一个闭源但免费的 BitTorrent 客户端,仅适用于 MS Windows 操作系统,它也支持 HTTP/FTP 下载管理。
- ABC(另一个 BitTorrent 客户端)(http://pingpong-abc.sourceforge.net),一个基于 BitTornado 的开源 BitTorrent 客户端。
- Transmission(http://transmission.m0k.org/),一个具有简单图形用户界面的轻量级开源 BitTorrent 客户端,位于跨平台后端之上。Transmission 在 Mac OS X 上运行,具有 Cocoa 界面,在 Linux/NetBSD/FreeBSD/OpenBSD 上运行,具有 GTK+ 界面,在 BeOS 上运行,具有本地界面。根据 MIT/X Consortium 许可证发布。
- Warez(http://www.warezclient.com),一个来自 Neoteric Ltd. 的闭源、仅适用于 MS Windows 的 BitTorrent 客户端(以前支持 Ares Network Warez P2P 客户端)。
- Bits on Wheels(http://bitsonwheels.com),一个用 Objective-C 和 Cocoa 为 Macintosh 编写的免费但闭源的实现。
- Vidora(http://www.videora.com/),一个闭源、免费软件实现,也支持 Really Simple Syndication (RSS) 提要。
- sharktorrent(http://sharktorrent.sourceforge.net/),一个用 C++ 编写的开源(GNU GPL)。这是一个跨平台的 BitTorrent 客户端,使用 QT、libtorrent 和 boost 库。
- ted [Torrent 剧集下载器](http://www.ted.nu/),一个用 Java 编写的开源(GNU GPL)BitTorrent 客户端,它也支持 torrent RSS 提要。
- rTorrent|(http://libtorrent.rakshasa.no)是一个用 C++ 编写的基于文本的 ncurses BitTorrent 客户端,基于 libTorrent 库,适用于 Unix(不要与 Arvid Norberg/Rasterbar 的 libtorrent 混淆),其作者的目标是“专注于高性能和良好的代码。客户端和库都在 GNU GPL 下可用。
- libtorrent(http://www.rasterbar.com/products/libtorrent/)来自 Rasterbar Software,一个开源 C++ 库,实现了 BitTorrent 协议和应用程序的基本需求,使用 zlib 和 Boost 库,特别是 Boost.Asio 并共享 Boost 许可证。这个库也通常被 嵌入到设备 中。该库还提供对 UPnP 配置的支持。libtorrent 被以下实现使用
- Halite(http://www.binarynotions.com/halite-bittorrent-client),一个开源的,根据 Boost 软件许可证,这个 BitTorrent 客户端使用 libtorrent 库。用 C++ 编写的,使用 Boost 库和 WTL(仅限 Windows)。
- FireTorrent(https://addons.mozilla.org/en-US/firefox/addon/10931)由 Pete Collins、Radical Software Ltd、Jan Varga、Matthew Gertner 开发,使用 libtorrent 库的开源 JavaScript,Mozilla 公共许可证 Firefox 扩展/附加组件,用于下载 torrent。
- Folx(http://www.mac-downloader.com/),闭源,使用 libtorrent 库(仅限 Mac)。
- qBittorrent(http://www.qbittorrent.org/),开源 GNU GPL,由一名博士生(Christophe Dumez)开发,一个使用 C++ / libtorrent 和 Qt4 图形用户界面的 Bittorrent 客户端。
- Deluge(http://deluge-torrent.org),一个开源的,使用 Python 和 libtorrent,轻量级的,跨平台的 BitTorrent 客户端,用 Python 编写的,根据 GNU GPL 许可证发布。
- Limewire,作为知名的 Gnutella 实现,也支持 BitTorrent 协议,它使用 libtorrent 库。
- BTG ( http://btg.berlios.de ),一个用 C++ 实现的 Bittorrent 客户端,使用 Rasterbar Libtorrent 库,发布在 GNU GPL 许可证下。提供 Ncurses、SDL、Gtkmm 和 WWW GUI,它们与运行实际 BitTorrent 操作的公共后端进行通信,仅适用于 OSX、BSD 和 Linux。
- Free Download Manager (FDM),( http://www.freedownloadmanager.org ),用 C++ 编写的开源软件,在 GNU GPL 许可证下发布,使用 libtorrent 库(仅限 Windows)。
- torrent2exe.com,一个网络工具,据称可以将 .torrents 转换为可执行文件(Windows),闭源,使用 libtorrent 库。
- Flush ( http://sourceforge.net/projects/flush ),基于 GTK 的 Linux BitTorrent 客户端,开源 C++/GTK+,使用 libtorrent 库。
- Pump ( http://www.vipeers.com ),一个闭源视频管理器,通过使用 libtorrent 库支持 BitTorrent 协议。
- Lince ( http://lincetorrent.sourceforge.net ),开源 C++/GTK+/libtorrent BitTorrent 客户端,发布在 GNU GPL 许可证下(Linux/BSD/类 Unix 操作系统)。
- Miro,以前称为 Democracy Player 和 DTV ( http://getmiro.com ),旨在自动下载来自基于 RSS 的“频道”的视频,管理它们并播放它们。开源 Python/GTK/libtorrent,在 GNU 通用公共许可证条款下发布。
- tvitty ( http://tvitty.com ),使用 libtorrent 的 Vista Media Center 闭源 BitTorrent 下载插件(仅限 Windows)。
- FatRat ( http://fatrat.dolezel.info ),是一个用 C++ 编写的 Linux 开源下载管理器,使用 Qt4 和 libtorrent 库。
- LeechCraft ( http://leechcraft.org ),开源 BitTorrent 客户端(也支持 HTTP/FTP 下载),使用 C++、Qt 和 libtorrent 创建。发布在 GNU 通用公共许可证下。
- MooPolice ( http://www.moopolice.de ),Windows BitTorrent 客户端,具有非传统的 GUI。开源(没有特定许可证)C++,使用 MFC 和 libtorrent BitTorrent 客户端库以及 MiniUPnP。
- Linkage ( http://code.google.com/p/linkage ),一个用 C++ 编写的轻量级 BitTorrent 客户端,使用 gtkmm 和 libtorrent,在 GNU 通用公共许可证下开源(不再维护)。
- Arctic Torrent ( http://int64.org/projects/arctic-torrent ),一个适用于 Windows 的小型 BitTorrent 客户端(包括 64 位版本)。在 MIT 许可证下开源 C++,使用 libtorrent。
特定 BitTorrent 文档
[edit | edit source]- 2003 年 5 月 22 日 - 激励在 BitTorrent 中构建健壮性 (PDF),Bram Cohen
BitTorrent 文件分发系统使用“以牙还牙”作为寻求帕累托效率的方法。它实现了比任何已知的合作技术更高的健壮性和资源利用率。我们解释了 BitTorrent 的工作原理,以及如何使用经济方法来实现这一目标。
其他软件实现
[edit | edit source]JXTA
[edit | edit source]JXTA™ 技术,由 Sun™ 创建 ( http://www.jxta.org ),是一套开放协议,允许网络上从手机和无线 PDA 到 PC 和服务器的任何连接设备以 P2P 方式进行通信和协作。JXTA 对等节点创建一个虚拟网络,其中任何对等节点都可以直接与其他对等节点及其资源进行交互,即使某些对等节点和资源位于防火墙和 NAT 后面或位于不同的网络传输上。项目目标是跨不同的对等网络和社区的互操作性、平台独立性、多种/不同的语言、系统和网络,以及普遍性:每个具有数字心跳的设备。该技术使用 Apache 软件许可证(类似于 BSD 许可证)授权。
大部分实现是用 Java 完成的(有一些用 C 编写的示例)。
iFolder
[edit | edit source]iFolder ( http://www.ifolder.com ) 仍处于早期开发阶段,由 Novell, Inc. 开发,旨在通过使用 Mono/.Net 框架,允许跨计算机网络进行 跨平台 文件共享。
iFolder 基于共享 文件夹 的概念,其中将文件夹标记为共享,然后通过网络将文件夹的内容同步到其他计算机,无论是直接在 对等 方式下计算机之间同步,还是通过服务器同步。这旨在允许单个用户在不同的计算机之间 (例如工作计算机和家用计算机之间) 同步其文件,或与其他用户共享文件 (例如在一个项目上进行协作的一组人)。
iFolder 的核心实际上是一个名为 Simias 的项目。实际上,是 Simias 监控文件更改,同步这些更改并控制文件夹的访问权限。实际的 iFolder 客户端(包括图形桌面客户端和 Web 客户端)作为与 Simias 后端通信的单独程序开发。
iFolder 客户端以两种操作模式运行:企业共享(使用服务器)和工作组共享(对等,或不使用服务器)。
Freenet
[edit | edit source]Freenet 项目 ( http://freenetproject.org ),旨在允许在互联网上自由交换信息,而不必担心审查或报复。为了实现这一点,Freenet 使对手难以揭露发布或下载内容的人的身份。Freenet 项目始于 1999 年,于 2000 年 3 月发布了 Freenet 0.1,并且从那时起一直处于积极开发阶段。
Freenet 的独特之处在于它处理内容的存储,这意味着如果需要,用户可以将内容上传到 Freenet,然后断开连接。我们发现,这是许多 Freenet 用户的关键需求。上传后,内容会在 Freenet 网络中镜像和移动,使其难以追踪或销毁。只要有人检索内容,内容就会保留在 Freenet 中,尽管 Freenet 不保证内容会无限期地存储。
通往 Freenet 0.7 的旅程始于 2005 年,当时人们意识到 Freenet 的一些最脆弱的用户需要隐藏他们正在使用 Freenet 的事实,而不仅仅是他们用它做什么。这一认识的结果是对 Freenet 进行彻底的重新设计和重写,增加了“暗网”功能,允许用户限制其 Freenet 软件与哪些受信任的朋友进行通信。这将使第三方更难以确定谁在使用 Freenet。
Freenet 0.7 还体现了对 Freenet 几乎所有其他方面的重大改进,包括效率、安全性和可用性。Freenet 可用于 Windows、Linux 和 OSX。可以从以下位置下载:
软件实现
[edit | edit source]所有软件都可以在 Freenet 项目页面上获得。
Frost 是 Freenet 的一个应用程序,它为我们提供了类似 Usenet 的留言板以及文件上传/下载/共享功能。如果您使用了标准的 Freenet 安装程序,它应该会与 Freenet 0.7 一起自动安装。
jSite 是一款图形应用程序,您可以使用它来创建、插入和管理您自己的 Freenet 站点。它是由 Bombe 用 Java 编写的。
Thaw 是一款文件共享实用程序和上传/下载管理器。它用作 Freenet 文件共享的图形界面。
KaZaa
[edit | edit source]KaZaa ( http://www.kazaa.com )
软件(FastTrack)实现
[edit | edit source]- Kazaa
- Kazaa Lite
- Diet Kaza
- giFT
- Grokster
- iMesh
GNUnet(http://gnunet.org/)始于2001年末,作为一个安全的点对点网络框架,它不使用任何中心化的或可信赖的服务。该框架提供了一个传输抽象层,目前可以将网络流量封装在UDP(IPv4和IPv6)、TCP(IPv4和IPv6)、HTTP或SMTP消息中。网络中的所有点对点消息都是机密的和经过身份验证的。
建立在该框架之上的主要服务是匿名文件共享,它是在网络层之上实现的,允许匿名、抗审查的文件共享。GNUnet使用一个简单的基于盈余的经济模型来分配资源。GNUnet中的节点会监控彼此在资源使用方面的行为;为网络做出贡献的节点会获得更好的服务奖励。
GNUnet是GNU项目的一部分。我们的官方GNU网站可以在(http://www.gnu.org/software/gnunet/)找到,那里只有一个现有的客户端,开源的、GPL的,用C语言编写,与网络同名。GNUnet可以从该网站或GNU镜像下载。
MANOLITO或MP2P是Pablo Soto开发的专有点对点文件共享网络的内部协议名称。MANOLITO在端口41170上使用UDP连接进行搜索路由,并且基于Gnutella。此外,文件传输使用基于TCP的专有协议。
MANOLITO主机通过联系HTTP网络网关来获得网络入口,网关会返回大约一百个MANOLITO主机的列表。主机也可以手动连接。服务端会与固定数量的节点保持联系(取决于互联网连接),这些节点会发送搜索查询和结果。
- Blubster(http://www.blubster.com)是MP2P协议的第一个实现,闭源但对Windows免费。
- Piolet(http://www.piolet.com)是闭源但对Windows免费。
MUTE文件共享(http://mute-net.sourceforge.net)是一个匿名、去中心化的搜索和下载文件共享系统。MUTE使用受蚂蚁行为启发的算法,通过邻居连接的网状网络路由所有消息,包括文件传输。
作者Jason Rohrer - jcr13 (at) cornell (dot) edu 使用C++和Crypto++库创建,支持多个操作系统,有一个用MFC创建的Windows前端,Mute是开源的,并在GPL许可下发布。
iMesh(http://www.imesh.com)是一个免费但闭源的P2P网络(IM2Net),在端口80、443和1863上运行,适用于Windows。iMesh由美国公司iMesh, Inc.拥有,并在以色列设有开发中心。还与MPAA达成了一项协议。大小超过50MB且时长超过15分钟的视频文件将不再允许在iMesh网络上共享,保证不能通过网络传输完整版电影。
BitCoop (http://bitcoop.sourceforge.net/) 由Philippe Marchesseault创建,是一个基于控制台(文本)的点对点备份系统,它允许在远程计算机上存储文件,并支持加密和压缩。文件的大小取决于您希望与其他节点共享的量。它适用于希望彼此之间备份数据的服务器场。支持包括Windows、Linux和Mac OS X在内的各种操作系统,它用Java实现(在GPL下开源)。
CSpace (http://cspace.in/) 提供了一个平台,用于在互联网上进行安全、去中心化的用户对用户通信。CSpace平台背后的驱动力是提供一个connect(user,service)原语,类似于sockets API connect(ip,port)。建立在CSpace之上的应用程序只需调用connect(user,service)即可建立连接。CSpace平台会负责定位用户并创建一个安全、支持NAT/防火墙友好的连接。因此,应用程序开发人员无需再费心建立连接,可以专注于应用程序级逻辑!CSpace是用Python开发的。它使用OpenSSL进行加密,并使用Qt进行GUI。CSpace在GPL下授权。
I2P是一个通用的匿名和安全点对点通信层。它是一个建立在另一个网络之上的网络(在本例中,它建立在互联网之上)。它负责匿名、安全地将消息传送到另一个位置。
p300 (http://p300.eu/) 是一个用Java创建的P2P应用程序,旨在为多种操作系统提供即用型单下载解决方案,而无需处理用户帐户或特定的协议和安全配置(例如samba)。另一个方面是p300主要用于LAN或VPN。该应用程序是开源的,在GNU GPL v3下发布。
Netsukuku (http://netsukuku.freaknet.org/) 是一个点对点(网状)网络系统,最初由FreakNet MediaLab开发,可以自主生成和维持自身。它旨在处理无限数量的节点,而CPU和内存资源消耗极低。它似乎可以轻松地用于构建一个全球性的分布式、匿名的去中心化网络,在互联网之上,无需任何服务器、ISP或权威控制的支持。Netsukuku使用另一个路由协议替换了OSI模型的网络层3。一个开源的Python实现于2007年10月完成。
Netsukuku基于一个非常简单的想法:将Wi-Fi网状网络的概念扩展到全球范围,尽管不一定使用该媒介。通过使用专门的路由协议和算法,可以利用当前的Wi-Fi技术,允许形成一个全球性的点对点无线网络,其中每个节点(节点)都连接到其邻居。
其他媒介在连接节点方面也同样有效,因为交互作用独立于传输媒介,但人们认为Wi-Fi将是最实用的方式,让普通用户可以充分利用。一旦更广泛的普及实现,可能会看到一些节点之间建立高速陆线连接,以提高网络带宽,并降低连接延迟。
RTMFP 基于 Amicima 的创建,是基于一个封闭协议/实现,Amicima 是一家成立于 2004 年的初创公司,专注于改进用于客户端-服务器和点对点网络以及衍生应用程序的互联网协议 (p2p-hackers - amicima's MFP - preannouncement, Jul 2005, MFP - The Secure Media Flow Protocol - version 1),后被 Adobe 收购,并被整合到 Flash 平台中,使开发人员能够在不经过中央服务器 (Flash Media Server) 的情况下将数据流传输到端点。Flash Player v10.1+ 功能的这一补充使 Flash 能够满足大多数点对点网络需求。目前还没有关于实现的太多信息。演示文稿以 Flash 视频形式提供 (http://tv.adobe.com/watch/max-2009-develop/p2p-on-the-flash-platform-with-rtmfp )。
- Thunderbolt (又称 Thunder) (http://www.xunlei.com/) 由 Xunlei Network Technology Ltd. 创建。Thunderbolt 专有的点对点网络支持多协议点对点资源(支持 BitTorrent、eDonkey、Kad 和 FTP),还支持 HTTP 下载(下载加速器),因为它会使用网络缓存来帮助加速下载。它主要用于中国大陆,最近发布了英文版。尤其值得关注的是,2007 年 1 月 5 日,Google 收购了该公司 4% 的股份。
- Cassandra (http://code.google.com/p/the-cassandra-project/) 是一个构建在点对点网络上的结构化存储系统,用于管理结构化数据,同时提供大规模可靠性。它使用 Java 编写,并采用 Apache 许可证 2.0 版。
- Aimini (http://www.aimini.com/),Windows 免费软件。
- TinyP2P ( http://www.freedom-to-tinker.com/tinyp2p.html ) 声称是 *世界上最小的点对点应用程序*,使用 Python 编程语言编写,代码只有 15 行。
- Secure Content Downloader,闭源,Windows 和 Microsoft 专有的点对点应用程序。
- XNap ( http://xnap.sourceforge.net/ ) 开源 (GPL),使用 Java 编写。客户端具有基于现代 Swing 的用户界面和控制台支持。能够在多个点对点网络中工作,包括 OpenNap、Gnutella、Overnet 和 OpenFT(以及 giFT 支持的其他网络,如 FastTrack)。它还支持 ICQ 和 IRC,以及 MP3 标签、图像、PDF、ZIP 文件和文本转语音的查看器。
- Filetopia ( http://www.filetopia.com ),一个适用于 Windows 的免费但闭源服务器/客户端点对点应用程序。它包括即时消息、聊天和文件共享系统,以及搜索引擎、在线好友列表和留言板。它还支持使用中转服务器(开源,Java)作为匿名层,实现间接连接。
- Carracho ( http://www.carracho.com ),适用于 MacOS X 的免费但闭源点对点应用程序。
- SockeToome ( http://www.blackdiamond.co.za/bdsock.html ),适用于 Mac 和 Windows 的共享软件点对点应用程序。
- FilePhile ( http://www.filephile.net ),闭源但免费软件,基于 Java,因此是跨平台应用程序。
- Napster 网络
- WinMX
- Napigator
- FileNavigator
- WPNP 网络
- WinMX
- 其他网络
- 星际文件系统 - 协议和网络旨在创建一个内容可寻址的点对点方式,用于在分布式文件系统中存储和共享超媒体。最初由 Juan Benet 设计,现在已开源。
- MojoNation
- Carracho
- Hotwire
- Chord 点对点查找服务 | Chord
- Dexter
- Swarmcast
- Alpine 程序 | Alpine
- Scribe
- Groove
- Squid_Soft | Squid
- Akamai
- Evernet
- Overnet 网络
- Audiogalaxy 网络
- SongSpy 网络
- The Circle
- OpenFT
- Acquisition
- Cabos
- Swapper
- SoulSeek