BitTorrent——节点之间如何建立连接?

BitTorrent是去中心化系统中被使用最广,规模最大的一个,据称曾同时支撑过上亿的节点,占据了整个互联网一半以上的网络流量。它通过P2P网络大大提升了大文件传输的效率,它的核心思想是:当一个文件被下载之后,同时也能上传给其他有需要的节点。

一个节点可以同时从几十个节点处下载文件,从而可以达到很高的下载速度,我在学校使用最快能达到10MB/s,我暂时还不知道有什么其他方法能实现同样速度的远程文件传输。

那节点之间是如何建立连接的呢?我的客户端是如何知道在其他地方哪里有我需要的文件呢?

这里需要引入一个中间人——tracker server。

tracker server

虽然BitTorrent是去中心化协议,但它也有一个中心化服务器,那就是tracker server,它负责整个BitTorrent网络的调度。当一个BitTorrent客户端被打开,首先就会和tracker server建立连接。tracker server会将这个客户端的IP地址和可以提供的文件记录下来,当其他节点和trakcer server建立连接时,tracker server也会做同样的事情。trakcer server记录了所有在线节点的状态,这和它名字也很想相符。

In order to learn the Internet locations of peers which may be sharing pieces, the client connects to the trackers named in the torrent file, and/or achieves a similar result through the use of distributed hash tables.[1]

下载文件需要用到种子文件(torrent file),种子文件包含了tracker server的地址和关于所要下载的文件的一些信息(比如文件哈希值)。客户端打开种子文件后,会向tracker server询问哪些在线的节点能提供这个文件。tracker server返回满足条件的节点的地址。然后,客户端和这些节点建立连接、请求文件。

因为文件很大,所以可以将文件拆散成很多个小文件块,从不同节点处下载不同的文件块,这些下载任务同时进行。所有文件块都下载好后,再拼接成完整的文件。但是文件是按照什么顺序拼接的呢?哈希树再次发挥了重要作用。哈希树记录了这些文件块的哈希值,文件按照哈希树的结构进行拼接的。同时哈希树还能用来验证文件的完整性。

IPv4地址的匮乏

客户端在互联网中通信,得有一个唯一的IP地址才行。为了实现IP地址在全球范围的唯一性,IP先统一由 Internet Assigned Numbers Authority(IANA) 分配给各个网络供应商(ISP),然后再由ISP分配给各个终端。IPv4地址是32位的2进制,最多提供2的32次方 (4,294,967,296) 个地址,现如今电脑、手机、服务器、物联网设备都需要IP地址,已经不够用了。

由于IPv4地址的匮乏,大多数人并没有公网地址,网络供应商(ISP)只给终端分配局域网地址。

  • 局域网地址只在局域网内具备唯一性
  • 公网地址在整个互联网内具备唯一性

局域网内的多个终端共用一个公网地址,通过这种分层结构,以实现IPv4地址不够的条件下,网络的继续运转。

但这会给P2P网络带来麻烦,P2P网络需要节点之间建立直接的连接,首先得知道对方的地址,如果这个地址是很多终端共用的,就没法确定目标。引入拥有公网地址的中间人可以解决这个问题,帮助节点之间建立连接,但如果中间人是中心化的,就会让P2P网络没有完全的去中心化。这也是为何使用WebRTC协议进行P2P视频聊天,双方得先和中间人建立连接的缘故。不过BitTorrent本来就用到了中间人tracker server,所以并没有妨碍。

NAT

NAT是network address translator的缩写,表示“网络地址转换器”。NAT使得多个终端共用一个公网地址,同时保证内网的终端可以和外网的终端正常建立连接。它的做法是创建一个“地址转换表”,将内网地址和端口号转换成公网地址和另外一个端口号。

当局域网内的终端向局域网外的终端请求建立连接时,NAT会记录下这个请求的内网地址和端口号。并在将请求发往公共网络之前,先将报文的source address改成路由器的公网地址。同时为了对局域网内不同终端相同端口号的请求进行区分,NAT给每个连接一个唯一的端口号。比如局域网内有多个终端同时使用浏览器上网,而浏览器的端口都是相同的,如果不改端口号进行区分,当获取到外网返回的数据时,就无法判断该把数据返回到哪个终端。这和TCP协议使用端口号的原因相同,TCP协议根据端口号判断接收到的数据该分配到哪个process。

地址和端口号都发生了更改,外部网络看到的就是这个更改后的地址和端口。这个地址和端口的对应表被记录在NAT服务器,老的记录会定期被清除,当新的请求过来时会重新建立转换关系并记录。但是在一定时间内,转换关系是固定的,所以这个请求对外的地址和端口号也是固定的。

所以为了实现局域网内的节点之间的连接,需要BitTorrent客户端和tracker server建立连接->局域网的NAT增加转换表->tracker server记录下客户端的公网地址和转换后的端口号,并提供给需要下载文件的客户端。由于NAT的转换表并不持久,所以tracker server记录的端口号也得定期确认和更新。

"阿喀琉斯之踵"

因为BitTorrent需要用到中心化的服务器tracker server,这成为它的致命弱点。瑞士的海盗湾 https://thepiratebay.org/ 之前是世界最大的BT站之一,多次因为版权原因被关闭,如今只能通过暗网访问(中心地址被隐藏)。之前之所以能够被关闭,就是因为BitTorrent协议允许多个中心,而并不是完全的去中心化。tracker server和BT站都是中心化的,目前在国内BitTorrent只限于在高校内被广泛使用。

The website faced several shutdowns and domain seizures, switching to a series of new web addresses to continue operating.[2]

按理来说,可以使用分布式哈希表(DHT)记录节点的状态,代替tracker server,从而实现完全的去中心化,但是我目前使用BitTorrent过程中还没有见过使用DHT的种子,DHT在实际使用中可能还是有些问题的。不过因为DHT很有趣,实现非常巧妙,也是IPFS的重要内容,下次详细讲述一下。

衰落

BitTorrent自从2002年被创造,一度非常火热,占据了互联网的一大半流量,但之后又快速衰落。

现在中心化的视频网站(比如Youtube)占据互联网的大部分流量,替代了BitTorrent的位置。很大程度上是因为中心化视频网站通过CDN、负载均衡等优化手段,能够承载很大的并发量。基础设施成本很大,但是只要有合适的商业模式能够支撑这些成本就行。

Youtube在2005年创办,然后迅速被Google收购,依托Google强大的基础设施,将网络延伸到全球各个角落。据统计,Youtube已经成为全球第二大高频的搜索途径[3],它的每月搜索次数比 Bing 和 Yahoo 加起来都多。

中心化的视频网站提供了方便的搜索和在线观看,一旦网络问题被解决,就可以实现很好的用户体验;而BitTorrent由于版权问题,资源无法太集中,发展的太大就会被控告,内容只能分散在各个小型的BT站,给下载者寻找资源带来麻烦,而且观看之前得还先下载。

随着网络基础设施的完善和优化,中心化视频网站的网速问题得到解决,可以实现流畅的在线观看高清视频,这时候BitTorrent就不剩下多少优势了,逐渐被边缘化。

参考资料


  1. https://en.wikipedia.org/wiki/Torrent_file ↩

  2. https://en.wikipedia.org/wiki/The_Pirate_Bay ↩

  3. https://www.mushroomnetworks.com/infographics/youtube---the-2nd-largest-search-engine-infographic/ ↩

你可能感兴趣的:(BitTorrent——节点之间如何建立连接?)