bt协议详解 基础篇(上)
bt协议详解 基础篇(上)
最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待。
1 简介
bt是BitTorrent协议的简称,bt协议是最流行的p2p下载协议,另外一种比较流行的p2p下载协议叫ed2k,ed2k的全称叫eDonkey2000 network,这里我们只讨论bt协议,ed2k协议以后有机会再和大家分享。
相信很多人都听说过bt协议。但是当我问周围的人究竟什么是bt协议呢?他们的解释让我对bt协议的理解变得更含糊,为了弄清楚心中的问题,我开始了自己对bt协议的学习。
我在官网 上找到一篇文章The BitTorrent Protocol Specification。这个标题翻译过来就是“bittorrent协议规范”,是bittorrent协议的基础篇,为什么说是基础篇呢?
BT协议是一个协议簇。
有点像tcp/ip协议一样,bt协议不是一个简单的协议,而是一系列相关的协议组成的,而且这个协议簇一直在进化。
既然这篇文章的主题是“基础篇”,所以它的内容主要来自bep_0003,也就是bittorrent协议规范,因为其它的协议都是以这个协议为基础的,可见这个的重要性。
2 bittorrent协议规范(中文版)
bittorrent是一个文件分发协议,它使用url来定位文件而且跟web服务无缝集成。当有多个人同时下载同一个文件时,下载者之间可以互相上传自己已有的那部分文件,让一个文件支持很多人同时下载却只增加小量的带宽负担变成可能,这就是bt协议相比http协议的优势。
bt文件分享由下列内容组成:
- 传统的文件服务器
- 种子文件(.torrent文件)
- bt tracker服务器
- 文件分享者
- web浏览器
- web浏览器用户(多个)
一个服务器按照下面的步骤开始文件分享过程
- 启动一个bt tracker服务器
- 启动一个普通的web服务器,如apache
- 在web服务器上配置多媒体类型‘application/x-bittorrent’关联到.torrent文件
- 生成一个.torrent文件,在文件中添加bt tracker服务器的地址
- 上传torrent文件到web服务器
- 发布torrent文件下载页面
- 等待用户下载
一个用户按照下面的步骤开始文件下载
- 安装bt客户端
- 浏览web页面
- 下载torrent文件
- 保存torrent文件到本地
- 使用bt客户端打开torrent文件,开始下载
- 等待文件下载完成
bencoding编码
strings(字符串)编码为:: 例如: 4:test 表示为字符串"test",4:例子 表示为字符串“例子”,字符串长度单位为字节,没开始或结束标记
integers(整数)编码为:ie,开始标记i,结束标记为e,例如:i1234e 表示为整数1234,i-1234e 表示为整数-1234,整数没有大小限制,i0e 表示为整数0,i-0e 为非法,以0开头的为非法如: i01234e 为非法
lists(列表)编码为:le,开始标记为l,结束标记为e,列表里可以包含任何bencoding编码类型,包括整数,字符串,列表,字典。例如: l4:test5abcdee 表示为二个字符串["test","abcde"]
dictionaries(字典)编码为de,开始标记为d,结束标记为e,关键字必须为bencoding字符串,值可以为任何bencoding编码类型,例如: d3:agei20ee 表示为{"age"=20},d4:path3:C:\8:filename8:test.txte 表示为{"path"="C:","filename"="test.txt"}
metainfo files
metainfo files(俗称torrent文件)使用bencoding进行编码的一个dictionaries数据类型,有两个key
announce : bt tracker服务器地址
info : info又是一个dictionaries(bencoding支持数据类型的嵌套),info里面的字符串都是使用utf-8编码。
info dictionary: info字典
name(文件名) : 通常用作torrent文件的文件名
piece length(文件块长度): 每一个peace(文件块)的字节长度。为了传输的方便,bt协议把文件分成等大的文件块,除了最后一块。每一个文件块的长度通常是2的指数(bittorrent 3.2默认文件块大小是 1M)
pieces : pieces是一个字符串,它的长度是20的倍数,每一段20个字符表示对应文件块的sha1 hash值。
length和files 两个中有且只有一个会出现。当存在length key事,表示torrent种子文件只包含一个单一的文件,length表示这个文件的字节数,俗称文件长度。
当torrent种子文件包含多个文件时,files表示总的文件个数,
files : files也是一个dictionaries数据类型,它有两个key
files dictionary:
length: 文件长度,总字节数
path: 一个utf-8编码的字符串数组,最后一个字符串保存真实的文件名,前面的字符串保存文件路径。长度为0表示path字段不合法。
trackers
tracker服务器接收get请求,一个get请求由下列字段组成
- info_hash 20字节的sha1哈希值,是bencoding编码之后的torrent文件内容的hash。
- peer_id: 长度为20的字符串,代表下载者的id,每一个下载者开始下载之前会随机生成自己的id。
- ip : 可选参数,表示文件下载者的id
- port: 文件下载者监听的端口,默认从6881开始,最大的6889
- uploaded: 十进制表示的上传字节总数
- downloaded: 十进制表示的下载字节总数
- left: 十进制表示的剩余字节总数,注意这个值不能通过downloaded和length进行算数计算得到,因为当一些下载文件块的数据的完整性校验失败的,这些文件块必须被重新下载。
- event : 可选参数,有四个可能的至 started,completed,stopped,empty。
tracker返回的内容是一个bencoded dictionaries数据类型,如果返回的内容包含failure reason字段,表示请求失败,failure reason包含失败的理由。如果没有failure reason字段,则返回内容必须包含interval和peers字段。interval代表客户端发起下一次请求的间隔,peers包含一个peer列表。一个peer由peer、id、ip、port组成。
bt tracker服务器可以返回一个压缩的peer列表,见BEP 23。
本文来自 免费教程网
bt协议详解 基础篇(上)的更多相关文章
- bt协议详解 基础篇(下)
bt协议详解 基础篇(下) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待. 1 ...
- bt协议详解 DHT篇(上)
bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...
- bt协议详解 DHT篇(下)
bt协议详解 DHT篇(下) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术 ...
- http协议详解-经典篇
本文转载至 http://www.cnblogs.com/flychen/archive/2012/11/28/2792206.html ————————————————————————————— ...
- 入木三分学网络第一篇--VRRP协议详解第一篇(转)
因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静 ...
- iOS开发 - OC - block的详解 - 基础篇
深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...
- HTTP协议详解-基础知识
HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.绝大多数的Web开发,都是构建在HTTP协议之上的Web应用. HTTP协议的主要特点可概括如下: 简单: ...
- 网络协议之bt---bt协议详解 DHT篇(下)
-------------------------author:pkf -------------------------------qq:1327706646 ------------------- ...
- MySql-Binlog协议详解
Reference: https://blog.csdn.net/hj7jay/article/details/56665057?utm_source=blogxgwz7 MySql-Binlog协议 ...
随机推荐
- mysql 优化 (1)
提高IOPS能力的几种方法换SSD,PCIE-SSD(提高IO效率,普通SAS盘5000以内的iops,而新设备可达到数万或者数十万iops)少做IO的活(合并多次读写为一次,或者前端加内存CACHE ...
- hadoop map任务Combiner被调用的源码逻辑简要分析
从MapTask类中分析下去,看一下map任务是如何被调用并执行的. 入口方法是MapTask的run方法,看一下run方法的相关介绍: org.apache.hadoop.mapred. ...
- Clustering Factor——索引的成本指标
使用索引是我们面对海量数据搜索是一种常用的手段.通过有效的索引访问,可以使我们更快的访问到需要的数据,减少物理.逻辑IO,从而提高系统性能.在CBO时代,Oracle对于提交SQL的执行路径是有所选择 ...
- EMQ、Websocket、MQTT
mqtt.fx的安装和使用 https://blog.csdn.net/nicholaszao/article/details/79211965 EMO 使用说明 http://emqtt.com/d ...
- 3.docker学习之docker与虚拟化
虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用 ...
- Tkinter grid() 方法
Tkinter grid() 方法:这个的几何管理器组织在父部件的表状结构中的部件. 这的几何管理器组织表状结构中的小部件的父部件. 语法: widget.grid( grid_optio ...
- Service通信的两篇博文
普通Service http://blog.csdn.net/liuhe688/article/details/6874378 AIDL通信 http://blog.csdn.net/liuhe688 ...
- ZooKeeper与仲裁模式
为了让服务器之间可以通信,服务器间需要一些联系信息.理论上,服务器可以使用多播来发现彼此,但我们想让ZooKeeper集合支持跨多个网 络而不是单个网络,这样就可以支持多个集合的情况. 为了完成这些, ...
- AE 遍历栅格实现栅格重分类(C#实现)
下面要讲的种重分类方法,网上很多.但是好像 System.Array pSafeArray = pPixelBlock.get_SafeArray(0) as System.Array;这一句一直报下 ...
- 基本SQL命令 (1.SQL命令使用规则/2.库管理/3.表管理/4.表记录管理/5.更改库,库的默认字符集/6.连接数据库的过程/7.数据类型)
1.SQL命令的使用规则 1.每条命令必须以 ; 结尾 2.SQL命令不区分字母大小写 3.使用 \c 终止SQL命令的执行 2.库的管理 1.库的基本操作 ...