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文件分享由下列内容组成:

  1. 传统的文件服务器
  2. 种子文件(.torrent文件)
  3. bt tracker服务器
  4. 文件分享者
  5. web浏览器
  6. web浏览器用户(多个)

一个服务器按照下面的步骤开始文件分享过程

  1. 启动一个bt tracker服务器
  2. 启动一个普通的web服务器,如apache
  3. 在web服务器上配置多媒体类型‘application/x-bittorrent’关联到.torrent文件
  4. 生成一个.torrent文件,在文件中添加bt tracker服务器的地址
  5. 上传torrent文件到web服务器
  6. 发布torrent文件下载页面
  7. 等待用户下载

一个用户按照下面的步骤开始文件下载

  1. 安装bt客户端
  2. 浏览web页面
  3. 下载torrent文件
  4. 保存torrent文件到本地
  5. 使用bt客户端打开torrent文件,开始下载
  6. 等待文件下载完成

bencoding编码

strings(字符串)编码为:<字符串长度>:<字符串> 例如: 4:test 表示为字符串"test",4:例子 表示为字符串“例子”,字符串长度单位为字节,没开始或结束标记

integers(整数)编码为:i<整数>e,开始标记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。

本文来自 免费教程网

转载于:https://my.oschina.net/ideras/blog/689674

bt协议详解 基础篇(上)相关推荐

  1. 物联网之MQTT协议详解基础篇(一)—— MQTT介绍

    MQTT: The Standard for IoT Messaging 开场白 大概是这么个背景 比如小米智能家居目前是这么个流程: 物联网设备通过家里的wifi连接到外网服务器 在外网通过米家ap ...

  2. mysql binlog协议_MySql-Binlog协议详解-流程篇

    MySql-Binlog协议详解-流程篇 MySql-Binlog在MySql主从不同方面发挥着不可或缺的作用,同时我们也能通过Binlog实时监控数据的变化.本系列就讲述了怎样接收并解析Binlog ...

  3. 接口测试HTTP协议详解请求篇

    http请求由三部分组成,分别是:请求行.消息报头.请求正文 1.请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Ve ...

  4. Openharmony应用NAPI详解--基础篇

    NAPI是什么? 简单点理解就是在Openharmony里,实现上层js或ets应用与底层C/C++之间交互的框架. Openharmony里的官方解释:NAPI(Native API)组件是一套对外 ...

  5. iOS开发 - OC - block的详解 - 基础篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  6. java解析bt协议详解_BT(带中心Tracker)通信协议的分析

    BT通信协议举例分析 现在的很多BT下载都采用了DHT网络,这样进行BT下载就不需要中心服务器了.本文针对的是需要中心服务器的BT下载. 小弟我最近正在研究BT通信协议,网上的资料很全,但是不是那事详 ...

  7. 302状态码_HTTP协议详解(基础概念 方法 状态码 首部 连接 Cookie 新特性 安全)

    一 .基础概念 URI URI 包含 URL 和 URN. 请求和响应报文 1. 请求报文 2. 响应报文 二.HTTP 方法 客户端发送的 请求报文 第一行为请求行,包含了方法字段. GET 获取资 ...

  8. java解析bt协议详解_BT下载原理分析

    BT全名为BitTorrent,是一个p2p软件,你在下载download的同时,也在为其他用户提供上传upload,因为大家是"互相帮助",所以不会随着用户数的增加而降低下载速度 ...

  9. java解析bt协议详解_【转】bt协议的详细分析

    一 BT系统的组成结构 1 普通的Web服务器:        例如Apache或IIS服务器 2 一个静态的种子文件:     即.Torrent文件,采用Bencoding编码 3  Tracke ...

最新文章

  1. 开启注册丨全国社交媒体处理大会(SMP 2020)召开,98场报告日程全公开
  2. 读取Excel表格数据到DataGridView中
  3. 【测试点三、四、五分析】1032 Sharing (25 分)_28行代码AC
  4. qwidget多个窗口同步_【好人BUG】本机多组控制 一台电脑使用一个帐号登录多个(省钱) !...
  5. 三星s7共享网络给linux,三星Galaxy S7WiFi状态下可以共享wifi热点吗【详解】
  6. Python Day47索引
  7. 一个高并发的测试websocket脚本
  8. Centos7部署轻量级自动化运维工具pssh (亲测)
  9. 如何用iMazing来管理ios设备音频文件
  10. 微前端 Micro-Frontnds - Single-SPA Application API
  11. Mari对称开启后另一半全粉了,变纯色了。
  12. 2022跨年烟花代码(三)HTML5点击页面烟花绽放特效
  13. 901c语言程序设计6,2018年中央财经大学信息院901C语言程序设计考研核心题库
  14. 在宝塔部署出现require(): open_basedir restriction in effect. File解决办法
  15. Slave I/O for channel ‘‘: error connecting to master ‘rep@master1:3306‘ - retry-time: 60 retries: 6
  16. GPS经纬度转化为百度地图/Google坐标及互转方案
  17. 几个有关智能的小问题
  18. 解决《空中英语教室》Super MP3光盘繁体字乱码的方法
  19. VS工程中常用路径宏定义表示
  20. 这可能是最详细的 Windows Debug 详解 了

热门文章

  1. 利用触摸精灵实现截图功能(针对微信)
  2. 八位计算机最小二进制,八位二进制补码最小值
  3. android camera 废弃,Android相机android.hardware.Camera已弃用
  4. 使用dba_waiters检查锁等待
  5. 软件工程师的硬件与软件
  6. 广州刷脸支付骗局_刷脸支付骗局你仔细观察一下
  7. android dataBinding 与ObservableField实现双向绑定
  8. C/C++编译器错误代码大全
  9. pboot 将编码转换为实体html_PbootCms在模板中对定制标签中的内容进行二次处理
  10. python word保存图_使用python matplotlib 画图导入到word中如何保证分辨率