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协议规范,因为其它的协议都是以这个协议为基础的,可见这个的重要性。
接上篇。
peer protocol
bt peer协议是基于tcp或者utp协议(utp协议也是bt协议簇中的一个,后面会专门写一篇关于utp协议的文章)。
peer连接是对称的,双方可以同时发送数据,而且数据的形式是一样的。一个peer代表一个bt下载用户。
peer协议会使用torrent文件中的pieces块(文件块,前面有讲到),下标从0开始。当一个peer下载完一个文件块,检查文件块的hash值匹配正确的时候,它就发送一个announce请求给拥有该piece块的peer列表,声明自己拥有该piece块,这样其它的peer就可以向这个peer发送下载该piece的请求。
peer链接两端包含2位的状态:choked,unchoked和interested,uninterested。Choking表示不会发送数据知道一个unchoking动作发生。后面将会解释为什么会存在choking这个状态。
当peer连接的双方有一个是interested状态,而且另外一个不是choking状态,这个连接就可以进行数据传输。无论何时当一个下载者向一个unchoked状态的peer发送下载请求时,interest状态必须每次更新 。这个属性的实现比较困难,但是这让下载者知道当它是unchoked的状态时哪些peers将会立刻开始下载成为可能。
peer连接一开始是choked和uninterested状态。
当数据开始传输时下载者必须把下载块放进请求队列来获取更高的tcp性能(这就是所谓的管道技术)。另一方面,不能马上写入tcp缓存的请求必须放进队列,而不是放在应用层的网络缓冲区,这样当choke动作发生时,他们才能被丢掉。
peer连线协议由握手和紧跟着的无穷的用长度做前缀的字符串流。握手由19(十进制字符串)跟着字符串'BitTorrent protocol'开始。开始的字符串是长度。
后面所有的整数都是使用4字节big-endian(高字节序)
固定的头部之后跟着是8个保留字节,在目实现的协议版本中值都是0。如果你想扩展协议,可以使用这8个字节,请和Bram Cohen(bt协议的作者)联系确保所有扩展的兼容性。
再接下来是20个字节的sha1哈希值,来自torrent文件中的info字段。如果peer连接的两端发送的哈希值不一致,则连接被关闭。一个例外的情形是当一个下载者想在一个端口开始多线程下载,他们等待进来的连接发送hash,如果这个hash在它的维护的列表里面,就把这个hash返回给另一端。
20字节hash的后面是20字节的peer id,这个id会发送给bt tracker服务器,而且会出现在bt tracker返回的peer列表里面。
上面就是一次握手所有的内容。接下来是可选一系类的长度做前缀的消息。长度为0表示keepalives(保持连接),被忽略。保持连接消息每两分钟发送一次。
peer messages
所有的非保持连接的消息由一个表示类型的字节开始。
类型列表如下:
- 0 - choke
- 1 - unchoke
- 2 - interested
- 3 - not interested
- 4 - have
- 5 - bitfield
- 6 - reques5t
- 7 - piece
- 8 - cancel
'choke', 'unchoke', 'interested', 和 'not interested' 这四个消息没有消息体。
bitfield消息只作为第一个消息发送一次。它的消息体是一个bitfield数据类型(参考c语言),下载者发送过的块的下标对应的位置1,其余的置0。下载者没有任何内容的时候可以跳过bitfield消息。bitfield的第一个字节对应下标0 - 7,第二个对应 8 - 15,等等。多余的位置0。
have消息的消息体是一个数字,表示下载者最近下载完成和检验正确的文件块的下标。
request消息包含index、begin、length三个字段。最后两个是字节偏移。length通常是2的指数除非是文件的最后一块。当前所有bt协议的实现版本中length的值是16kiB,关闭连接的request中length字段的值要大于16kiB。
cancel消息和request有一样的消息体。用来取消下载某一个文件块。
piece消息包含index、begin、piece字段。它们的值和request消息是相关的。
下载者通常用随机的顺序下载文件块,这样能提高效率。
choking发生的原因有几个。一个是当一次发起过多的连接时tcp拥塞控制表现极差。另外choking可以让peer连接的双方使用 tit-for-tat-ish算法来保证下载速度的一致。
一个好的choking算法必须具备几个好的特性。它应该能控制并发数量来获取更高的tcp性能。它应该避免过快的choking和unchoking。最后它应该每过一段时间就尝试空闲连接来找到更好的连接,这就是所谓的unchoking优化。
本文来自 免费教程网
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用起来还是很爽的,但一直以来 ...
- 网络协议之bt---bt协议详解 DHT篇(下)
-------------------------author:pkf -------------------------------qq:1327706646 ------------------- ...
- HTTP协议详解-基础知识
HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.绝大多数的Web开发,都是构建在HTTP协议之上的Web应用. HTTP协议的主要特点可概括如下: 简单: ...
- MySql-Binlog协议详解
Reference: https://blog.csdn.net/hj7jay/article/details/56665057?utm_source=blogxgwz7 MySql-Binlog协议 ...
随机推荐
- 前段基础之HTML
HTML 初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s ...
- python学习 (三十五) logging
1 demo import logging # log level: # DEBUG # INFO # Warning # Error # CRITICAL logging.basicConfig( ...
- Linux 文件描述符详解
Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...
- css引用方式
网页中引用CSS样式 内联样式 行内样式表 外部样式表 链接式 导入式 内嵌方式 style标签 <!doctype html> <html> <head> < ...
- CocoStudio资源区导入Plist/PSD文件
这两种文件在使用中和普通文件稍有不同,下作简单介绍.如有不适的地方欢迎批评指正. 首先简单说一下Plist文件,Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息,该功能在旧式的Mac OS ...
- thymeleaf switch在表格中的使用,遇到的空行问题
switch在表格中的使用时 如果把<td>写在<div th:switch="${data.isShow}"> 里面导致外面出现很多空的<div&g ...
- 根据不同分辨率载入相应CSS样式表
index.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:// ...
- leetcode746
class Solution { public: int minCostClimbingStairs(vector<int>& cost) { vector<); totol ...
- 【297】IDL 过程、函数&关键字参数
目录: 一.Procedure 1.1 基本说明&定义 1.2 关键字参数 二.Function 2.1 基本说明&定义 2.2 关键字参数 参考:IDL中函数中的带有关键字的参数的使 ...
- 346. Moving Average from Data Stream数据窗口流中位数的数据结构设计
[抄题]: Given a stream of integers and a window size, calculate the moving average of all integers in ...