分类：电脑/网络
问题：什么是BT下载? 
回答： BT运行原理分析及内网提速方法。由于内网用户无法提供一个对外的端口,所以无法做服务器.但用BT的时候,发现它可以让内网用户做 Send,作为程序员就忍不住下载了它的源代码分析了一把(为了看它,还专门去写了一下Python:}) 比起其它的P2P,BT有个独特的地方,它存在一个中间的WEB服务器,就是我们在发布的时所填写的announce.该服务器提供了发布的统一管理,不像其它P2P软件那样到处去找哪些非常不稳定的个人服务器,相对起来让人安心的多. 该WEB服务器更大的作用是内网用户可以做 Send(下面会说明原理),这是其它软件无法做到的,但不好的地方是announce当机的时候就无法下载了,要知道P2P下载关键是要人气要高,announce停一下就搞到人气全没有了 .torrent 的作用 大家都知道我们要用BT下载 ,就要先下载一个.torrent文件,这个文件到底有甚么呢: 首先是 announce 纪录了发布服务器的位置,让BT知道是那个WEB服务器发布的 然后是一些文件信息,文件名,目录名,长度等等 最后是片段长度,和片段的 Sha1 校验码 (BT为了事现续传和文件校验,就把文件分成若干个片段) 大家可以用写字板打看torrent文件看看,就是知道个大概,后面的乱码是片段 Sha1 校验码 开始-续传的实现 sha校验 BT 打开一个 torrent文件后,先要你选择文件保存那里.然后判断文件不存在的话就建立新文件,存在的话就用 Sha1 校验码去校验文件---错误的就是还没下载的,这样就可以实现续传了,但128位校验,想不慢都不行 得到 peer 现在知道要下载甚么了,到那里下载呢?这就要寻找有谁提供上传了,这里BT是通过WEB服务器来实现的,首先BT会通过分析 torrent 来得到一面一串网址   ;  ;是发布服务器的地址 info_hash 是torrent文件中的 info 部分的Sha校验码,WEB通过它在发布列表找到对应的纪录, peer_id 是自身的标识,它是12个0和当前时间+全球的唯一标识码(GUID)的Sha校验的前八位,共20位 port 你提供上传的 port IP 你的ip地址,没有的话服务器会自己找到 uploaded downloaded 你上传和下载了多少,服务器可以用它来做流量分析 left 你还要下载多少个字节 event 状态,告诉服务器你是准备开始下载,还是停止,还是下载完成了 以上这个操作默认 5 分钟做一次,或由服务器设定 服务器会做甚么 服务器中有个一个 track 程序来管理这些请求 得到这一串代码后就会用 info_hash 来查找列表,找到你就可以下载,找不到就对不起啦 接着它会反连(NatCheck)你的 IP 和 Port这样就可以知道你是内网用户还是共网用户(如果你是内网用户,它是连不通的,因为它会连到你的服务器上,你的服务器当然没有这个端口啦) 然后服务器返回现在正在下载这个文件的所有公网用户的IP和port,就像是这样 d8:intervali1800e5eersld2:ip14: 7eer id20:00180531904b7e3abdd74orti6881eeee interval 1800 是告诉 BT 隔多少秒来查询一次这里是 30 分钟 (有点过分了) 最后如果你是公网用户它会把你提交的 IP 和 Port 放到info_hash 对应的列表中,这样其它人就可以找到你 下载 得到这些 peer IP后,BT就可以找到对应的IP下载了 Bt会到所有的peer去寻找自己要下载的东西,不是一定要到seed下载. Bt每找到一个peer就和建立一个Socket来下载,所以下载的人越多,速度就越快. 内网用户可以做Send的原理 上面说到服务器只会返回公网的ip的,那内网用户怎么可以做Send呢,这是因为BT是一个主动连接的软件(即使你已经下载完了,也不也会主动连接他人) 下面是一个仿真流程: 1 内网用户开始做 seed, 2 服务器收到请求,由于是第一个所以也没有peer返回 3 公网用户提交请求,由于seed是内网用户所以也没有peer返回,等待下载,但服务器会把它的IP放到列表中 4 内网经过 interval 时间间隔后,再向服务器放出请求,得到上面得公网IP 5 得到公网IP后,内网马上进行连接 6 公网用户建立连接,数据开始传输 (注意现在是公网用户做服务器,内网用户做客户端,是不是有点怪) 7 其它内网用户去上面公网用户下载数据 所以,内网用户做 seed 一定要有公网用户得参与,否则其它内网用户无法下载.如果全部是内网用户,那个所有连接都不会成立,当然这是比较极端的情况. 以上可见,内网用户不能和内网用户连接,其它用户无法从服务器查到你,所以无法主动连接你,你只能每隔30分钟从服务器找到公网用户一个个进行连接. 由于中国很多用户的是内网用户(我从服务器上查回来的peer还没试过超过10个的),所以内网用户用BT的确要比公网用户要慢很多.于是有了下面的一直是0%：可能SEED是内网，连接不上。有时用PTC和shareaza无法下的东东，用BT就可以下。下不了的话具体原因跟具体情况有关，如你的网络是否局域网，你是否能访问到tracker，你使用的是那种客户端，你下载的具体是哪一个BT文件，你是从头开始下还是续传，续传的话之前是否死机过等这些都有关系。BT下载慢的一些原因：1、不是公网用户。内网用户不能提供主动连接，所以较慢2、各个运营商网络接口速率不高3、下载者上传速率不高。因为BT优先处理上传较快的人4、发布时seed的多少，还与发布者的速率相关，还有下载的人数越多相应的下载速度就越快（这就是BT的最大优点）5、用户的防火墙阻碍作用关于BT错误信息的一些解释最近发现有很多人问有关BT的出错信息,下面给出完整的解释:事实上,当你看到这些错误提示时,其实并不要紧张,这是你所要做的便是----等待.注意:使用BT过程中出现红字错误后不必退出，BT会自动重试（无论这种情况是出现在开始还是下载过程中）另外注意错误的时间，如果距现在已经超过5分钟，恰恰说明现在是正常的。（BT不会自动清除过期的错误）I. A piece failed hash chech, re-downloading it 这并不是什么坏消息,你不用理会它.意思是告诉你,你下载的文件有一部分是坏的,bt会自动帮你重新下载错误的部分.导致这个错误的大多数原因在于某些人错误的使用了"跳过hash检查"这个选项 d data from tracker -通常你不必理会它,通常是tracker服务器过载或者down了.也有可能是你的网掉线了（如部分长宽，访问任何网站会返回登陆界面，就是错误的data啦）III.Problem connecting to tracker - timeout exceeded Problem connecting to tracker - HTTP Error 503: Connect failed Problem connecting to tracker - [Errno socket error] (10061, "Connection refused") Problem connecting to tracker - (111, \'Connection refused\') 说明在连接tracker服务器过程中出现错误,有可能trakker服务器过载或者down了,这时并不要心急,等待BT自动重试.如果很长时间都没有反映的话,你可以加上"--http_timeout 120"的参数来加大连接重试时间.具体做法另文说明.IV.Problem connecting to tracker - HTTP Error 400: Not Authorized 说明这个tracker服务器不允许你使用这个torrent文件(国内好像比较少见),有些tracker服务器只允许在他们自己网站上发布的torrent才允许下载.解决只有换一个torrent文件了,:PV.Problem connecting to tracker - HTTP Error 404: Not Found 很简单,torrent文件在tracker服务器上已经找不到了,找个新的吧.VI.Problem connecting to tracker - HTTP Error 407: Proxy Authentication Required 假如你用的是代理下载BT,说明这个代理需要验证,需要你输入用户名和密码.VII.Problem getting response info - [Errno 2] No such file or directory: "C:\\\\Documents and Sett..." 在某些情况下,IE有可能没把torrent文件存在临时文件夹内.解决方法是在torrent文件下载地址上按右键,然后另存到硬盘的某处(这可是个好习惯,以后你求种子或者reseed的时候特别有用,建议大家都这么干,利己利人),然后双击这个torrent文件开始下载.如果出现这个问题,建议清楚你的IE缓存,在文件中如果出现"["或者"]"也会出现这个问题.BitTorrent协议详解BitTorrent(简称BT，比特洪流)是一个文件分发协议，它通过URL识别内容并且和网络无缝结合。它在HTTP平台上的优势在于，同时下在一个文件的下载者在下载的同时不断互相上传数据，使文件源可以在很有限的负载增加的情况下支持大量下载者同时下载。一个BT式文件分发需要以下实体：·一个普通网络服务器·一个静态元信息文件·一个BT Tracker·一个“原始”下载者·网络终端浏览者·网络终端下载者这里假设理想情况下一个文件有多个下载者。架设一个BT服务器步骤如下：1.开始运行Tracker（已运行的跳过这一步）；2.开始运行普通网络服务器端程序，如Apache，已运行的跳过这一步；3.在网络服务器上将.torrent文件关联到Mimetype类型application/x-bittorrent（已关联的跳过这一步）；4.用要发布的完整文件和Tracker的URL创建一个元信息文件（.torrent文件）；5.将元信息文件放置在网络服务器上；6.在网页上发布元信息文件（.torrent文件）链接；7.原始下载者提供完整的文件（原本）。通过BT下载步骤如下：1.安装BT客户端程序（已安装的跳过这一步）；2.上网；3.点击一个链到.torrent文件的链接；4.选择本地存储路径，选定需要下载的文件（对有选择下载功能的BT客户端用户）；5.等待下载完成；6.用户退出下载（之前下载者不停止上传）。连接状况如下：·网站正常提供静态文件连接，并且启动客户端上的BT程序；·Tracker即时接收所有下载者信息，并且给每个下载者一份随机的peer列表。通过HTTP或HTTPS协议实现；·下载者每隔一段时间连一次Tracher，告知自己的进度，并和那些已经直接连接上的peer进行数据的上传下载。这些连接遵循BitTorrent peer协议，通过TCP协议进行通信。·原始下载者只上传不下载，他拥有整个文件，所以很必要向网络中传输完文件的所有部分。在一些人气很旺的下载中，原始下载者经常可以在较短的时间内退出上传，由其它已经下载到整个文件的下载者继续提供上传。元信息文件和Tracker的回应信息都以一种简单高效可扩展的格式（Bencoding，B编码）传送。经过B编码方式编码后的信息，将由字符串和整型数字描述，嵌套在字典和列表中（像在Python中一样）,忽略字典无法识别的关键值，用以增强可扩展能力。这样，新特性便可以在以后被加入。B编码规则如下：·字符串的表示方法为：字符串长度（十进制表示），冒号，字符串。比如，字符串'spam'（不包括引号）将被表示为：'4:spam'（不包括引号），4表示字符串长度。·整型数据表示成前面加'i'后面加'e'中间是十进制数，如i3e就相当于3，i-3e就是-3。整型数据没有长度限制。i-0e无效，所有以'i0'开头的除了代表0的i0e，其它都无效。·列表编码为一个'l'开头后面跟它所包含的项目（已经编码过）最后加一个'e'，比如l4:spam4:eggse就等于['spam', 'eggs']。·字典编码为一个'd'开头后面跟一个交替关键值（key）及其对应值的列表最后加一个'e'。如：d3:cow3:moo4:spam4:eggse相当于{'cow': 'moo', 'spam': 'eggs'}d4:spaml1:a1:bee相当于{'spam': ['a', 'b']}关键值必须是处理过的字符串（用原始字符串编码的，而且不是数字字母混合编码的）。元信息文件就是B编码的有以下关键值的字典：announce（声明）Tracker的URL。info（信息）此关键值对应一个字典包含以下描述的关键值:关键值name对应一个字符串，代表默认的下载文件或存成目录的名字。它是纯粹建议性的。关键值piece length（块长）对应文件分割成的块的字节数。出于传输需要，文件被分割成大小相等的块，除了最后一块通常会小一些。块长一般来说是2的权值，大部分设块长为256K(2的18次幂)。关键值pieces（块）对应一个字符串，此字符串长度是20的倍数。它可以再分成每20字节一段的多个字符串，分别对应块在索引中的SHA1校验码（hash）。还有关键值length（长度）和files（文件），它们不能同时出现也不能都不出现。当length出现说明这个元信息文件只是单文件下载，否则说明是多文件的目录结构下载。单文件情况下，length对应文件长度的字节数。多文件情况被看作是把许多单文件按文件列表中的顺序连成一个大文件下载，而关键值files就对应文件列表，是一个字典的列表，其中每个字典又包含以下关键值：length（长度）文件长度的字节数。path（路径）一个包含字符串的列表，字符串就是子目录名，最后一项的字符串是文件名。（一个长度为零的length表单是错误的。）在单文件情况下，关键值name是文件名；多文件情况下，它就成了目录名。Tracker质询是双向的。Tracker通过HTTP GET参数获得信息，然后返回一个B编码后的信息。尽管Tracker需要在服务器端执行，但它运行流畅像Apache的一个模块。Tracker的GET请求有如下关键值：info_hash20字节长的SHA1验证码，来自B编码过的元信息文件中的info值下，是元信息文件的一个支链。这个值是自动转换的。peer_id一个20字节长的字符串，是每个用户开始下载时随机生成的ID。这个值也是是自动转换的。ip一个可选择的参数给出peer所在的IP（或DNS主机名），一般是和Tracker同机器的原始下载者得到后以便散发文件。port监听端口，官方默认的是从6881端口开始试，如果端口被占用则依次向后推一个端口找空闲端口，到6889端口为止。uploaded目前总上传量，编码为十进制ASCII码。downloaded目前总下载量，编码为十进制ASCII码。left未下载的字节数，编码为十进制ASCII码。这个数不是通过文件长度和已下载数算出来的，因为文件可能在被续传，还有一些已经下载的数据不能通过完整性检查必须重新下载。event这是个选择性的关键值，选项有started，completed或stopped（或empty，等同于没有运行）。如果没有运行，这个声明会定期间隔一定时间发出。开始下载时发出started值，完成下载时发出completed。当文件完整后再开始，没有completed发出，下载者中止下载时发出stopped。Tracker的回应也是B编码字典。如果Tracker回应中有关键值failure reason（失败原因），就会对应一个人可以读懂的字符串信息解释质询失败的原因，不需要其它关键值。否则，回应必须有两个关键值：interval（间隔）对应下载者定期发出请求的间隔秒数；peers,peers对应一个与peers相通信的字典列表,peers，peer自选ID，IP地址或DNS主机名的字符串和端口号之一。记住,假如下载者发生一个事件或者想要更多的peers,他们不会完全按照计划的间隔发送请求。 如果你想对元信息文件或者Tracker质询进行扩展，请与Bram Cohen进行协调，确保所有扩展都兼容。BitTorrent peer协议通过TCP协议进行操作。它不用调节任何socket选项就可以流畅运行。peer之间的连接是对称的。两个方向送出的信息要协调一致，数据可以流入任一方。peer协议是按照元信息文件所描述的索引的文件块，以零开始。当一个peer完