当前位置: 首页 > news >正文

BitTorrent (协议)

BitTorrent (协议)

http://zh.wikipedia.org/wiki/BitTorrent_(%E5%8D%8F%E8%AE%AE)

BitTorrent协议(简称BT,俗称比特洪流BT下载)是一个网络文件传输协议,它能够实现点对点文件分享的技术。比起其他点对点的协议,它更有多点对多点的特性,这个特点简单的说就是:下载的人越多,速度越快。下载完只要不停止任务,并继续上传就可以成为种子,分享让其他人下载。

 

通的HTTP/FTP下载使用TCP/IP协议,BitTorrent协议是架构于TCP/IP协议之上的一个P2P文件传输协议,处于TCP/IP结构的应用层。 BitTorrent协议本身也包含了很多具体的内容协议和扩展协议,并在不断扩充中。

根据BitTorrent协议,文件发布者会根据要发布的文件生成提供一个.torrent文件,即种子文件,也简称为“种子”。

种子文件本质上是文本文件,包含Tracker信息和文件信息两部分。Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Tracker服务器的设置,文件信息是根据对目标文件的计算生成的,计算结果根据BitTorrent协议内的Bencode规则进行编码。它的主要原理是需要把提供下载的文件虚拟分成大小相等的块,块大小必须为2k的整数次方(由于是虚拟分块,硬盘上并不产生各个块文件),并把每个块的索引信息和Hash验证码写入种子文件中;所以,种子文件就是被下载文件的“索引”。

下载者要下载文件内容,需要先得到相应的种子文件,然后使用BT客户端软件进行下载。

下载时,BT客户端首先解析种子文件得到Tracker地址,然后连接Tracker服务器。Tracker服务器回应下载者的请求,提供下载者其他下载者(包括发布者)的IP。下载者再连接其他下载者,根据种子文件,两者分别告知对方自己已经有的块,然后交换对方所没有的数据。此时不需要其他服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。

下载者每得到一个块,需要算出下载块的Hash验证码与种子文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题。

一般的HTTP/FTP下载,发布文件仅在某个或某几个服务器,下载的人太多,服务器的带宽很易不胜负荷,变得很慢。而BitTorrent协议下载的特点是,下载的人越多,提供的带宽也越多,种子也会越来越多,下载速度就越快。

为了解决某些用户“下完就跑”的现象,在非官方BitTorrent协议中还存在一种慢慢开放下载内容的超级种子的算法。

[编辑]DHT网络

目前,又发展出DHT网络技术,可以在无Tracker的情况下下载。

DHT全称为分布式哈希表(Distributed Hash Table),是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。使用支持该技术的BT下载软件,用户无需连上Tracker就可以下载,因为软件会在DHT网络中寻找下载同一文件的其他用户并与之通讯,开始下载任务。

有些软件(如比特精灵)还会自动通过DHT搜索种子资源,构成种子市场。

另外,这里使用的DHT算法叫Kademlia(在eMule中也有使用,称为Kad网络,具体实现协议有所不同)。

这种技术好处十分明显,就是大大减轻了Tracker的负担(甚至不需要)。用户之间可以更快速创建通讯(特别是与Tracker连接不上的时候)。

[编辑]BT中相关概念

Tracker:收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据。

种子:指一个下载任务中所有文件都被某下载者完整的下载,此时下载者成为一个种子。发布者本身发布的文件就是原始种子。

做种:发布者提供下载任务的全部内容的行为;下载者下载完成后继续提供给他人下载的行为。

 

一个c++写的bt客户端,可研究其实现:

Enhanced CTorrent

http://www.rahul.net/dholmes/ctorrent/

转载于:https://www.cnblogs.com/buxianghe/archive/2012/06/24/2560093.html

相关文章:

  • perl 使用小结
  • JS获取屏幕,可见窗口和网页文档(html)大小
  • C# 批量复制文件
  • linux 搭建基于域名的虚拟主机
  • 40个新鲜出炉的 Photoshop 优秀教程
  • linux 正则表达式
  • EA使用教程
  • JS编程建议——6:正确处理JavaScript特殊值(2)
  • 利用jQuery选择将被操作的元素
  • parted命令分区
  • 用python怎样实现接口测试
  • JSP语法1
  • iOS 画板 涂鸦 答题
  • poj 1475 Pushing Boxes
  • 初识 ActivityLifecycleCallbacks
  • 【Amaple教程】5. 插件
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2017 年终总结 —— 在路上
  • Angular Elements 及其运作原理
  • C++类中的特殊成员函数
  • JavaScript异步流程控制的前世今生
  • java中的hashCode
  • Koa2 之文件上传下载
  • NSTimer学习笔记
  • storm drpc实例
  • ucore操作系统实验笔记 - 重新理解中断
  • windows下mongoDB的环境配置
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 对JS继承的一点思考
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 你不可错过的前端面试题(一)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • Semaphore
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 飞书APP集成平台-数字化落地
  • #Lua:Lua调用C++生成的DLL库
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $(selector).each()和$.each()的区别
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (145)光线追踪距离场柔和阴影
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (6)设计一个TimeMap
  • (附源码)计算机毕业设计大学生兼职系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (排序详解之 堆排序)
  • (四)模仿学习-完成后台管理页面查询
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)linux 命令大全
  • (转)scrum常见工具列表
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core IdentityServer4实战-开篇介绍与规划