人人为我,我为人人——p2p 文件分享协议简介

教程
自由软件与信息安全

#1

人人为我,我为人人——p2p 文件分享协议简介

(注意:因为笔者不擅长写教程,本文可能经常更新,关注者请及时查阅最新版本。)

核心思想

最成熟的邦联式即时通信系统——XMPP 简介一文中,我们已经见到了消息交换系统(电子邮件、即时通信)的集中(圆形监狱)式和邦联式的对立。实际上这种对立是更普遍的“中心化”和“去中心化”对立的形式之一。中心化的系统只能通过中心交换信息,因而天然会为中心结点赋予特权,也因此中心结点的负担极大,影响(控制、劫持、破坏)了中心就能影响整个系统;而去中心化的系统中,大部分结点都是平权的,且在想情况下,任意两个结点之间都能交换信息。

传统的资源分发协议如 http 和 ftp 都是中心化的。而去中心化的资源分发系统经过数次演进已经相当成熟,称 p2p (Peer-to-peer) 文件分享技术。

为了最大限度地提升 p2p 系统的传输效率,现在的 p2p 文件分享软件基本都使用了分块散列传输技术。

散列,又称报文摘要,是一类接受任意长度的输入打乱并混合重组,产生固定长度的输出,而靠输出反推输入极为困难的确定性算法。一般设计为输入的极小变化会引起输出的极大变化,但算法是确定的,相同的输入产生的输出一定相同。因此如果事先得到了一段数据的散列值,便可用于确认之后得到的这段数据的完整性——用相同的算法计算这段数据的散列值,再与事先得到的值比较即可。

分块散列传输技术,就是把欲分享的资源(一段长度固定的数据,对应于磁盘上的一个文件或按一定顺序串起来的一个目录/文件夹中的所有文件)划分为大小相等的,计算出每一个块的散列值并按顺序整理成分块散列清单(其中记录了每一块在整份资源中的位置及其散列值)。其他结点想要下载这份资源必先得到分块散列清单,得到清单后,数据交互都以块为单位进行,任何一个块都会在传输完成后与分块散列清单核对,如不一致则说明传输失败并在之后尝试重传;反之如核对一致,这个已经传输成功的块马上可以作为新的为尚未持有该块的结点提供数据。因此参与分享的结点越多,原始资源提供者的负担反而越轻,为单一资源请求者提供数据的速度也就越快。

分块散列传输技术一般需要一个调度系统,以便资源请求者查询哪些结点持有哪一份资源的哪些块。历史上首先出现的是中心化的调度服务器,但由于调度服务器反复遭受打击,主流 p2p 文件分享软件纷纷实现了集成于结点、基于分布式散列表(DHT)分布式调度系统逐渐取代调度服务器。

此外,按分块散列传输技术实现的 p2p 文件分享软件一般还有如下要素:

  1. 资源标识符:一般实现为包含一份分块散列清单的散列值的字符串,用于在调度系统中查询、定位资源,而当定位到分享这一份资源的结点后,便可从中得到该资源的分块散列清单。

  2. 校验:p2p 文件分享软件一般会先在磁盘上生成和资源等大但没有内容的占位文件,然后再按块逐渐填充其内容。校验操作就是按照分块散列清单,核对占位文件中哪些块已经传输成功的操作。由于分块散列传输技术和校验功能的存在,资源获取过程可以变得相当灵活:例如你曾经完整获取过某份资源,但不慎破坏了其部分内容,那么你可以再次请求这份资源,并在得到分块散列清单后用受损的资源替换占位文件并启动校验。校验过程会核对所有块,并仅把受损的块当作未完成的重新传输,如此受损的资源可以快速得到修复。

  3. 高位结点和低位结点:借鉴自 ed2k 术语。p2p 文件分享软件一般仍通过 TCP 实现数据传输,故对每一条 TCP 连接而言,其两端必有一为发起方,一为接受方(接受方先进入监听状态,然后通过调度系统通知另一方发起连接)。由于网络条件不同,既能在 Internet 上作 TCP 连接发起方也能作接受方的结点称高位结点,只能作发起方而不能作接受方的(最主要的原因是 NAT)称低位结点(而连发起方都不能作的结点一般都没有接入 Internet,本文不作考虑)。高位结点可以和任何其他结点直接建立 TCP 连接,而低位结点只能和高位结点直接建立连接,有些 p2p 文件分享系统实现了低位结点互通,但都是通过由高位结点或调度服务器中转实现的。得到公有 IP 地址的结点都是高位结点。

  4. 端口映射:为使 NAT 网关内的主机上处于监听状态的端口可以接受 NAT 外发起的连接的一般方法,可以通过在网关上手动作永久配置或通过 UPNP 等协议自动配置实现。只有成功配置了端口映射的 NAT 网关内结点才能作为高位结点工作。

举例

BitTorrent

俗称 BT,是最流行的 p2p 文件分享协议。

在 BT 中,分块散列清单构成BT 种子(.torrent 文件)的主要内容,资源标识符是磁力链接,调度服务器叫 tracker,分布式调度系统为 Main line DHT

早期(2000 年左右),BT 种子尚不能通过 BT 的系统直接传输,而是通过 http 等传统的资源分发协议来传播。后来随着其分布式调度系统的强化,才借鉴 ed2k 等协议实现了通过磁力链接获取种子的功能,后来更实现了对 IPv6 的支持。

完整的 BT 软件一定有生成种子(和磁力链接)的功能(所以迅雷不是 BT 软件),大部分也都能连接 tracker 和 Main line DHT。

BT 的问题是不同软件对同一份资源不一定会生成相同的种子(主要是对目录资源,因为不同软件会以不同方式串接目录中的文件,所以对现有资源最好套用已有的种子),以及文件名参与种子生成——这使得对内容相同而名字不同的资源会生成不同的种子,缺乏了一致性。

扩展阅读:https://jaminzhang.github.io/p2p/BitTorrent-Principle-Introduction/,或通过搜索引擎查找。

ed2k

最早的实现是 2000 年出现的私有软件 edonkey 2000(ed2k 因此得名),最初通过调度服务器(ed2k 服务器)工作,后来其公司被美国唱片业协会侵权控告并败诉后停止了开发,但其协议被 eMule、aMule、MLDonkey 等自由实现通过逆向工程继承下来,并为其加上了名为KAD 网络的分布式调度系统,但 2010 年后其开发极度放缓,因此至今缺乏对 IPv6 的支持。

和 BT 相比,ed2k 有以下不同:

  1. 一个资源就是一个文件,且资源的同一性仅与文件的内容有关——内容相同而名字不同的文件在 ed2k 内会被当成同一份资源;作为资源标识符的ed2k 链接虽然包含文件名,但仅用来在下载完成后为占位文件改名。

  2. ed2k 软件可以指定某些目录为共享目录,其中的文件都会被当作资源共享给其他结点;下载的所有文件都会出现在事先配置好的下载目录里(下载目录中的文件一定会被共享),而为了提高效率,保存占位文件的暂存目录最好和下载目录放在同一个文件系统上。

  3. 分块散列清单保存在 ed2k 软件运行时产生的数据文件里,在资源请求者通过调度系统查询 ed2k 链接,找到资源(部分)持有者后在二者之间直接传输,用户不直接可见。

  4. 不像 BT,ed2k 的调度系统和用户端软件均实现了搜索功能,可独立查找资源。

  5. 为保证 ed2k 网络健康发展,ed2k 在用户端软件实现了用户 ID 和积分系统:每个结点都维护自己的用户 ID 和所有曾经和自己通信过的结点的“积分”(按该结点的 ID 索引),积分和该结点对自己的上传量正相关,且决定了自己对该结点发送数据的速率——简而言之,就是“(他对我)分享越多,(他从我这里)下载越快”。ed2k 通过该机制鼓励对其他结点上传。

扩展阅读:eMule Fans 电骡爱好者

p2p 文件分享在中国的历史

2000 年左右,以 BT 和 eMule 为代表 p2p 文件分享软件一度流行,其中一家叫 verycd 的网站对 eMule 的推广曾经起过很大的作用。但好景不长,因为用好 p2p 文件分享需要一定程度上对计算机网络原理的了解,这给了傻瓜化的迅雷以机会,而诞生不久的迅雷为了占领市场,便疯狂地掠夺 p2p 文件分享网络:迅雷对 BT 和 ed2k 协议提供一定的支持,却完全不实现将自己的资源分享给别人(生成 BT 种子和 ed2k 链接)的功能;它还采取欺骗手段从 BT 和 ed2k 软件处获取数据,却只将自己的资源分享给其他迅雷实例而极少回馈其他 BT 和 ed2k 软件;它还给用户灌输一种不择手段追求下载速度的价值观。而此时 verycd 网站却为了赢利而倒戈与迅雷合作,成为迅雷榨取 ed2k 网络的马前卒。此举极大地打击了 p2p 文件分享用户的积极性,其大部分都成为了网盘这种中心化的系统的用户。

但是,与中心化的资源分发协议相比,p2p 文件分享对我们的事业更加有利。它既更加接近“人人为我,我为人人”的理念,也更加难以监管。笔者建议有志者学好用好 p2p 文件分享软件,将上个世纪留下的星星之火传播开去。


有同志知道这件事吗
建议在新人报道贴里贴出自己百度id的同志们重新注册个论坛号
#2

要是ISP把p2p端口封锁要怎么办呢?
用RSA在QQ上通讯是否可行?


#3

p2p 文件分享软件一般都能配置接受连接的端口,所以配置成未被封锁的端口就可以避开了。

理论上在 QQ 上用 GnuPG 或 OTR 都是可行的,但你不怕麻花藤识别了你的特征而直接封你的号吗?再者说你怎么把加解密功能做成插件集成到 QQ 上?珊瑚虫的前车之鉴可不远。在使用自由协议的通信系统上想怎么玩都行(邦联化的就更是如此),但非要在 QQ 上实现安全通信的话不但需要加密技术,还需要信息隐藏技术。


#4

如何使用虚拟机,内存盘。
如何卸载安全软件,如何查看全局钩子。
硬件安全也劳烦楼主讲一下。


#5

您想伸手要的知识还真多啊。

如何卸载安全软件,如何查看全局钩子。

我只会建议您把整个 M$WIN 清除出您的计算机。

如果真想追求安全,就来用 GNU/Linux 吧——照着Debian 参考手册去实践足以让您掌握其基础用法。

硬件安全也劳烦楼主讲一下。

如果软件会背叛你,硬件安全毫无意义——您还是先用上 GNU/Linux 再说吧。


#6

那木马用跨平台的解释型语言写,那样linux还安全吗?


#7

在 unix 下,刚刚生成(包括刚刚下载下来)的文件是没有可执行权限的,所以就算你用解释型语言写木马,你还得诱骗用户启动它,或给它加上可执行权限才行——这总是比起新文件默认可执行的 M$WIN 安全吧?况且不像 M$WIN 上有大量用户用管理员账户裸奔,没有 root 权限,木马想持久化也没那么容易。


#8

那么目前有哪些p2p软件可用呢


#9

请您首先阅读这篇《提问的智慧》。
BT 软件可参考此列表:https://en.wikipedia.org/wiki/Comparison_of_BitTorrent_clients
ed2k 软件主要就是 emule、amule 和 mldonkey。


#10

我顶楼给的链接您就不看么?!


#11

而且我已经讲过 BT 和 ed2k 了——用这两个关键字搜索也基本上能回答您的问题了吧?!


#12

我的错,疏忽了。


#13

现在大部分家庭用ipv4,ipv4的公网ip很紧张,用来做p2p不现实。
假设大部分的地址都换成ipv6,虽然ip一下子多了很多,但是实行白名单制度,这对我们的事业会造成什么影响?
http://www.gov.cn/zhengce/2017-11/26/content_5242389.htm


#14

兵来将挡,水来土掩。
对付白名单制度的技术早已存在,只要能普及开,白名单不足为惧——问题反而在于将这样的技术普及开去的工作方法。


#15

黑客圈子里有个说法叫“代码即法律”——实际上应该理解为“代码即规律”(西文中“Law、Rule”等词可同时表达此二者——这种规律法律不分的语言习惯反映了西方的哲学传统)。
目前更大的问题其实不在于政府推行的制度,而在于我们自身对规律的无知。


(参考)笼中鸟:互联网与我们的时代
请关注红色无产者的新订阅号!