BT分析libTorrent分析

更新时间:2023-07-15 02:12:25 阅读: 评论:0

www.paper.edu
BT协议库libtorrent的种子文件解析方法探究
吴海1
1北京邮电大学信息与通信工程学院,北京 (100876)
E-mail:
摘要:本文首先简单介绍了近年流行起来的P2P通信模式的网络架构,将其与传统的C/S 架构进行比较并总结出了P2P的三种应用方式及其各自的代表软件。之后,本文介绍了构成BitTorrent协议的三大部分(种子文件、Http协议、peer wire协议)并分析了协议的工作过程细节。根据种子文件的特定格式和Bencoding编码规则,本文对BT协议库libtorrent中负责对种子文件进行解析的模块进行剖析,解释了该模块的相关类的定义和解析种子文件的实际函数,为基于BT协议的下载程序的种子文件解析模块的设计提供了一种较好的思路。关键词:BitTorrent协议 libtorrent 种子文件解析
中图分类号:TP312
1.引言
传统的网络服务模式,所有的下载开销都在服务器上,由于服务器性能和带宽的限制,服务器往往要限定用户的数量和访问速率;而使用基于BT协议的共享软件,可以把下载的开销分摊到每个下载者那里,在理论上支持无限多个下载者下载同一个文件,充分提高文件共享效率。本文简要分析了BT协议的工作原理,剖析了BT协议库libtorrent中种子文件的解析方法,利用这种解析方法分析出的结果,下载程序就可以开发出BT下载软件。
2.BT网络架构
传统的因特网服务如Web、FTP、DNS等均使用客户机/服务器(C/S)模式进行通信。C/S模式的特征是:服务器是总是打开的主机,具有永久的IP地址,并可扩展为服务器池;客户机与服务器直接通信,可以间歇地与服务器连接,可以具有动态的IP地址,并且客户机彼此之间不直接通信。C/S模式的最大特点是服务和资源集中,所有对服务请求的处理通常是由服务器完成的[1]。
对等方到对等方(peer-to-peer,P2P)是近年来流行起来的通信模式。P2P模式的特征是:服务和资源分布化,资源不集中存储在某些设备上,而是分散存储在运行P2P程序的设备上,每一个对等方都可以为其他对等方提供服务。
P2P应用方式分为3类:集中式目录、分布式查询和结合这两者的混合方式[2]。集中式目录模式属于第一代P2P应用,使用一台大型服务器(或服务器场)来提供目录服务,其代表是Napster,缺点是存
在单点故障、性能瓶颈和侵犯版权等问题。分布式查询将目录服务完全分布在覆盖网络的所有对等方中,每一个对等方负责维护一部分目录内容。系统采用洪泛查询(query flooding)算法使用户获得文件信息,收到该报文的主机向它们的所有邻居转发该报文,这些邻居又依次向它们的所有邻居转发该报文等,其代表是Gnutella。第3种方式是前两种方式的结合,其中一种实现方法是将覆盖网络中的对等方划分为若干小组,
www.paper.edu
每个小组选取一个具有高带宽连接和高因特网连接性的成员作为组长,组长负责管理组内成员及与其他组长通信。在小组内使用集中式目录服务,服务器就是该组的组长。各组长之间使用分布式的目录服务。混合方式目前在P2P应用中使用最为广泛,其代表是BitTorrent (以下简称BT)。
BT网络由如下几部分组成:.torrent文件、种子提供站点、目录服务器和内容发布者/下载者。
(1).torrent文件是一个文本文件,包含了tracker信息和文件信息两部分。tracker信息主要是指BT下载中需要用到的tracker服务器的地址和针对tracker服务器的设置;文件信息是指将目标文件计算处理后再根据BT协议的B编码规则编码后得到的信息。BT的主要原理是把提供下载的文件虚拟分成大小相等的块,块大小必须为2Kbyte的整数次方,并把每个块的索引信息和Hash验证码写入.torrent文件中,所以.torrent文件就是被下载文件的“索引”。
(2)种子提供站点也就是.torrent文件的提供站点,为下载者提供.torrent文件下载服务。
(3)目录服务器记录被下载的文件的索引信息及下载该文件的用户的信息(主要是IP 地址及端口号)。
(4)早期的BT协议只支持tracker服务器,这种目录服务器是集中式目录与分布式查询的混合型;在BT协议的升级版本中,增加了对DHT(分布式Hash表)网络的支持,该网络中目录服务器是分布式的。内容发布者/下载者是BT网络的主体,最终的下载由它们完成。构成BT网络的这几部分的相互关系如图1所示。
图1  BT网络架构图
3.BT协议工作过程
BT协议主要包括3个部分:.torrent文件的格式、tracker HTTP/HTTPS协议和Peer wire 协议(使用TCP)。其中tracker HTTP/HTTPS协议是BT客户机与tracker服务器之间的通信协议,Peer wire协议是BT客户机之间的通信协议[1]。
www.paper.edu
(1)资源发布者制作.torrent文件并上载到种子发布站点,将客户机连入BT网络并在tracker服务器上发布信息。默认情况下,BT的监听端口为6881-6889,也可由使用者指定;tracker服务器的监听端口主要有8080、8000、6969和2710,它们采取的连接方式都是TCP。
(2)BT客户机(下载者)获取.torrent文件,并向.torrent文件中提供的tracker服务器依次发起连接请求,直至与其中之一建立TCP连接并获取对等方列表。感想的意思
(3)BT客户机随机地向列表中的对等方发起连接请求,因为对等方列表中对等方个数比较多,所以在短时间内发出大量TCP连接请求分组。这些分组的源地址相同,源端口号相邻,目的地址/端口号不同,并且有相当一部分的目的端口号为6881-6889。
(4)如果连接建立成功,BT对等方之间进行握手,握手过程中使用特征字符串“BitTorrent protocol”。然后使用interested、not interested、choke和unchoke等4种分组互通对资源的意愿情况,之后通过Request Piece和Piece分组传输资源。
(5)资源传输完毕,关闭TCP连接。
4.BT协议中的种子文件介绍德语学习
4.1 .torrent文件编码格式
.torrent文件的编码格式为B编码,是一种简洁的数据组织方式,支持4种数据类型:byte strings、integers、lists和dictionaries,它们各自的表示方式见表1。
表1  B编码格式
数据类型B编码格式
byte strings <;十进制ASCII表示的字符串长度>:<;字符串数据>
newlookintegers i<;十进制ASCII表示的整数>e
lists l<B编码值>e
dictionaries d<B编码字符串><B编码元素>e
4.2 .torrent文件格式
图2展现了一个.torrent文件的内容:
图2  .torrent文件内容
其中的一些主要域如下:
◆announce:tracker服务器的URL,本例中为http//:8080/announce。
◆announce-list(可选):。备用tracker服务器的URL列表,本例中为
<:8080/announce 、btfans.3322:6969/announce 等。
◆creation date (可选):.torrent 文件的创建日期,使用标准的UNIX 时间,本例中为1152105243。
◆comment (可选):.torrent 文件制作者添加的任意格式的说明。
◆created by (可选):制作.torrent 文件的工具,本例中使用的制作工具是BitComet/0.67。  ◆encoding (可选):发布的资源使用的编码方式,在本例中使用的是GBK 。
◆info :发布的文件的信息。有两种格式,单文件格式和多文件格式。
单文件格式包括length 、md5sum (可选)、name 、piece length 、pieces ;多文件格式包括files 、name 、piece length 、pieces ,其中files 包括length 、path 、md5sum (可选),每一个文件都有单独的length 、path 、md5sum (可选)。本例使用多文件格式,共有两个文件,分别是“Love Undercover Ⅲ.txt ”和“影视帝国().新扎师妹3.国语DVDSCR 中字.rmvb ”,piece 长度为262144byte ,piece 个数为34780。
5. libtorrent 的种子文件解析方法
libtorrent 是用C++为*nix 用户写的BitTorrent 库。libtorrent 用到了很多C++的模板库(主要是boost ),客户端的性能非常好,而且还提供库函数给其它程序调用。
协议库libtorrent 源码包的src/torrent 文件夹中,文件object 和object.h 设计了类Object 。该类中定义了一种数据结构用以存放B 编码的字符流。因为类的定义中用到了string 类和标准模板库STL ,所以包含头文件<string>、<map>和<list>。
5.1 类Object 介绍
表2  类Object 自定义类型 实际类型 类型名 说明
安逸什么意思
int64_t value_type 对应B 编码的“整数”
std::string string_type 对应B 编码的“字符串”
std::list<Object> list_type 对应B 编码的“列表”
系动词std::map<std::string, Object>map_type 对应B 编码的“字典”
map_type::key_type key_type 对应“字典”的键值类型 TYPE_NONE TYPE_V ALUE TYPE_STRING TYPE_LIST TYPE_MAP type_type 枚举类型 表3  类Object 成员变量 类型 变量名 说明 type_type m_type 表示类Object 的类型int64_t m_value string_type*m_string list_type* m_list 组成一个无名union
www.paper.edu
发音练习
www.paper.edu
map_type* m_map
表2和表3列出了类Object自定义的类型和成员变量。braveheart
类Object中的成员函数,按功能可分为两类:
◆查询类函数
◇根据对象的m_type用以判断对象的类型:
is_value()
is_string()
is_list()
乌鲁木齐教育网is_map()
◇指示m_map指向的map<string,Object>中是否有键值为k且域类型为TYPE_V ALUE、TYPE_STRING、TYPE_LIST、TYPE_MAP的元素:
has_key_value(key_type& k)
has_key_string(key_type& k)
has_key_list(key_type& k)
has_key_map(key_type& k)
◇获取m_map指向的map<string,Object>中键值为k的元素的域值(类Object的对象):get_key_value(key_type& k)获取键值为k的域值的m_value
get_key_string(key_type& k)获取键值为k的域值的m_string指向的string
get_key_list(key_type& k)获取键值为k的域值的m_list指向的list<Object>
get_key_map(key_type& k)获取键值为k的域值的m_map指向的map<string,Object>
◆操作类函数
inrt_key(key_type& k, Object& b)向m_map指向的map<string, Object>中插入一个键值为k、域值为b的元素。
ardera_key(key_type& k)删除m_map指向的map<string, Object>中键值为k的元素。
inrt_front(Object& b)在m_list指向的list<Object>的第一个元素前插入元素b。
inrt_back(Object& b)在m_list指向的list<Object>的最后一个元素后插入元素b。
move(Object& src)将src赋值给当前对象。
swap(Object& src)将当前对象与src进行值的交换。
5.2 种子文件解析过程
libtorrent源码包的src/torrent文件夹中,文件object_stream定义了函数object_read_string()和object_read_bencode(),它们对通过instream流读取到的B编码的字符串流进行解析。
首先介绍一下读取B编码的字符串格式的函数,其声明如下:
bool object_read_string ( std::istream* input, std::string& str )
由上文知,B编码的字符串格式为:<;十进制ASCII表示的字符串长度>:<;字符串数据>。
>saint patricks day

本文发布于:2023-07-15 02:12:25,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/177742.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:文件   服务器   编码   目录   种子   下载
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图