【P2P网络】BitTorrent协议中文版4
Peer wire protocol (TCP)
概述
peer(端)协议使片(piece)的交换变得容易,片的描述请参考元信息文件。
注意:原来的规范在描述peer协议时,也使用术语piece“(片)”,但是这不同于元信息文件里面的术语“piece(片)”,由于这个原因,在本规范中,将使用术语“块(block)”来描述peers(端)之间交换的数据。
一个客户端(client)必须维持其与每一个远程peer(端)连接的状态信息:
l choked: 远程peer(端)是否已经choke本客户端。当一个peer(端) choke本客户端后,它是在通知本客户端,除非它unchoke本客户端,否则它不会应答该客户端所发出的任何请求。本客户端也不应该试图向远程peer发送数据请求,并且应该认为所有没有应答的请求已经被远程peer丢弃。
l interested: 远程peer(端)是否对本客户端提供的数据感兴趣。这是远程peer在通知本客户端,当本客户端unchoke他们时,远程客户端将开始请求块(block)。
注意这也意味着本客户端需要记录它是否对远程peer(端)感兴趣,以及它是否choke/unchoke远程peer。因此真正的列表看起来像这样:
l am_choking: 本客户端正在choke远程peer。
l am_interested: 本客户端对远程peer感兴趣。
l peer_choking: 远程peer正choke本客户端。
l peer_interested: 远程peer对本客户端感兴趣。
客户端连接开始时状态是choke和not interested(不感兴趣)。换句话就是:
数据类型
如果没有用其他的方法指定,在peer wire协议中的所有整数都会编码为4个字节的大端(big-endian)值。这也包括在握手之后,所有报文(Message)的长度前缀。
peer wire协议由一个初始的握手组成。握手之后,peers通过以长度为前缀消息的交换进行通信。长度前缀就是上面描述的整数。
握手(HandShake)
握手是一个必需的报文,并且必须是客户端发送的第一个报文。该握手报文的长度是(49+len(pstr))字节。
握手:handshake: <pstrlen><pstr><reserved><info_hash><peer_id>
l reserved: 8个保留字节。当前的所有实现都使用全0.这些字节里面的每一个字节都可以用来改变协议的行为。来自Bram的邮件建议应该首先使用后面的位,以便可以使用前面的位来改变后面位的意义。
l info_hash: 元信息文件中info键(key)对应值的20字节SHA1哈希。这个info_hash和在tracker请求中info_hash是同一个。
l peer_id: 用于唯一标识客户端的20字节字符串。这个peer_id通常跟在tracker请求中传送的peer_id相同(但也不尽然,例如在Azureus,就有一个匿名选项)。
在BitTorrent协议1.0版本,pstrlen = 19, pstr = “BitTorrent protocol”。
如果一个客户端接收到一个握手报文,并且该客户端没有服务这个报文的info_hash,那么该客户端必须丢弃该连接。
peer_id
peer_id长20个字节。至于怎么将客户端和客户端版本信息编码成peer_id,现在主要有两种惯例:Azureus风格和Shadow风格。
Azureus风格使用如下编码方式:’-’, 紧接着是2个字符的client id,再接着是4个数字的版本号,’-’,后面跟着随机数。
l 'BG' - BTG (uses Rasterbar libtorrent)
l 'BP' - BitTorrent Pro (Azureus + spyware)
l 'DP' - Propagate Data Client
你可以在这找到关于shadow编码风格(包含关于版本字符串后的三个字符用法的习惯)的详细说明。
例如:用于Shadow 5.8.11的’S58B-----‘...
Bram的客户端现在使用这种风格:'M3-4-2--' or 'M4-20-8-'。
Opera 8预览版和Opera 9.x发行版使用以下的peer_id方案:开始的两个字符是’OP’,后面的四个数字是开发代号。接着的字符是随机的小写十六进制数字。
MLdonkey使用如下的peer_id方案:开始的字符是’-ML’,后面跟着点式版本,然后就是一个’-’,最后跟着随机字符串。例如:'-ML2.7.2-kgjjfkd'。
Bit on Wheels使用模式'-BOWxxx-yyyyyyyyyyyy',其中y是随机的(大写字母),x依赖于版本。如果版本为1.0.6,那么xxx = AOC。
Queen Bee使用Bram的新风格:'Q1-0-0--' or 'Q1-10-0-'之后紧随着随机字节。
BitTyrant是Azureus的一个分支,在它的1.1版本,其peer id使用'AZ2500BT' + 随机字节的方式。
TorrenTopia版本1.90自称是或源自于Mainline 3.4.6。它的peer ID以'346------'开始。
Rufus使用它的十进制ASCII版本值作为开始的两个字节。第三个和第四个字节是'RS'。紧随其后的是用户的昵称和一些随机字节。
C3 Torrent的peer ID以’-G3’开始,然后追加多达9个表示用户昵称的字符。
FlashGet使用Azureus风格,但是前面字符是’FG’,没有’-’。版本 1.82.1002 仍然使用版本数字 '0180'。
Qvod的id以四个字母"QVOD"开始,接着是4个十进制数字的开发代号(目前是” 0054”)。最后的12个字符是随机的大写十六进制数字。中国有一个修改版,该版本以随机字节代替前四个字符。
许多客户端全部使用随机数或者随机数后面跟12个全0(像Bram客户端的老版本)。
l interested: <len=0001><id=2>
l not interested: <len=0001><id=3>
not interested报文长度固定,并且没有payload。
l have: <len=0005><id=4><piece index>
have报文长度固定。payload是piece(片)的从零开始的索引,该片已经成功下载并且通过hash校验。
l bitfield: <len=0001+X><id=5><bitfield>
bitfield报文可能仅在握手序列发送之后,其他消息发送之前立即发送。它是可选的,如果一个客户端没有piece(片),就不需要发送该报文。
长度不对的bitfield将被认为是一个错误。如果客户端接收到长度不对的bitfield或者bitfield有任一冗余位集,它应该丢弃这个连接。
l request: <len=0013><id=6><index><begin><length>
request报文长度固定,用于请求一个块(block)。payload包含如下信息:
n begin: 整数,指定piece中从零开始的字节偏移。
l piece: <len=0009+X><id=7><index><begin><block>
piece报文长度可变,其中x是块的长度。payload包含如下信息:
n begin: 整数,指定piece中从零开始的字节偏移。
n block: 数据块,它是由索引指定的piece的子集。
l cancel: <len=0013><id<=8><index><begin><length>
cancel报文长度固定,用于取消块请求。playload与request报文的playload相同。一般情况下用于结束下载。
l port: <len=0003><id=9><listen-port>
【P2P网络】BitTorrent协议中文版4相关推荐
- 【P2P网络】BitTorrent协议中文版3
Tracker HTTP/HTTPS Protocol Tracker是一个响应HTTP GET请求的HTTP/HTTPS服务.这个请求包含来自客户端的度量信息,这些信息能够帮助Tracker全面地统 ...
- 区块链P2P网络协议演进过程
区块链是以加密机制.储存机制.共识机制等多种技术组成的分布式系统,可以在无中心服务器的情况下实现相互信任的点对点交易功能.区块链最大的特点是去中心化和分布式,区块链共识机制使得参与节点共同为系统提供服 ...
- p2p服务器的协议,P2P文件传输协议之BitTorrent协议
BitTorrent协议是支持网络当中数据的上下传输的一个P2P文件传输协议.那么基于这个协议的BT软件大家肯定更不会陌生.但是它却有着更为广泛的使用,尤其是在一些大型网络数据交换平台中,也常常会使用 ...
- IPFS网络是如何运行的(p2p网络)
图片来自wiki IPFS是一个p2p网络,先来看看BitTorrent的p2p网络是如何工作的? 想要bt下载一个文件,首先你需要一个种子文件torrent,种子文件包含至少一个 Tracker(一 ...
- 第10讲 | 深入区块链技术(二):P2P网络
在上一篇文章中,我大致讲解了一下区块链技术的几个核心要素.P2P网络协议.分布式一致性算法(共识机制).加密签名算法.账户与存储模型.今天我们就来看看区块链技术的第一个核心要素:P2P网络. 如果我们 ...
- BitTorrent协议与MagNet协议原理
BitTorrent协议 1.简介 BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断向其他下载者上传已下载的数据.而在FTP,HTTP协议中,每个下载者在下载自己所需文件 ...
- P2P网络——网络模型概述
P2P网络模型 一.常见网络模型 1.随机网络:随机网络的研究是基于随机图理论的. 2.规则网络:常见的规则网络有最近邻耦合网络和星形耦合网络. 3.小世界网络 二. ...
- kademlia算法学习(区块链P2P网络设计)
如今很多P2P网络的实现都采用DHT的方式实现查找,其中Kademlia(简称Kad)算法由于其简单性.灵活性.安全性成为主流的实现方式.下面我们就来详细分析这个应用于比特币和以太坊P2P网络中的Ka ...
- 谈BitTorrent协议中的DHT方法
背景:P2P.BT协议 1.P2P方法的思想和产生原因 P2P全称Peer to Peer.要想理解p2p首先要了解另一种更原始的结构:C/S结构. C/S结构中,C指client,S指server. ...
- BitTorrent (协议)
BitTorrent (协议) http://zh.wikipedia.org/wiki/BitTorrent_(%E5%8D%8F%E8%AE%AE) BitTorrent协议(简称BT,俗称比特洪 ...
最新文章
- IIS的虚拟目录和子应用程序
- RNN以及LSTM的介绍和公式梳理
- CSS3 -webkit-animation(动画)
- php mysql事务实例_PHP + MySQL事务示例
- JsonHelper(Json帮助类)
- java内部类_Java内部类
- HCIE Security IPv6基础与安全技术 备考笔记(幕布)
- django后台集成富文本编辑器Tinymce的使用
- Java将xml转docx,java对象与xml间的转换.docx
- .net 获取邮箱邮件列表和内容
- picasa csdn_如何将发送到Facebook的功能添加到Picasa
- Python移植MATLAB的巴特沃斯滤波器,椭圆滤波器
- windows开机启动项(​仅限Win10,Win7)​
- 一眼看出二叉树中序遍历结果的诀窍
- 数字控制增益的放大器的设计
- linux在3T的分区磁盘上追加空间
- css超出部分省略号显示
- java读取微信消息_微信公众平台开发中使用Java如何实现获取用户的信息
- hdu-6034-Balala Power!
- Linux网络服务——DNS服务