BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断地向其他下载者上传已下载的数据。它是属于一个应用层的协议。

基于BT协议的文件分发系统由以下几个实体构成:

一个web服务器

一个种子文件

一个Tracker服务器

一个原始文件提供者

一个网络浏览器

若干个下载者

web服务器上保存着种子文件。种子文件又称为元文件或metafile,它保存了被共享文件的一些信息,如文件名、大小、Tracker服务器地址,种子文件以.torrent为后缀。Tracker服务器保存着当前下载某共享文件的所有下载者的IP和端口。原始文件提供者提供完整的共享文件供其他下载者下载。种子文件就是提供者使用BT客户端生成的。每个下载者通过运行BT客户端软件下载共享文件。某个下载者本身称为客户端,其他下载者称为peer。

下载过程:客户端首先解析种子文件,从中获取待下载的共享文件的一些信息,包括Tracker服务器地址。然后客户端连接Tracker获取当前下载该文件的所有下载者的IP和端口。之后客户端根据IP和端口连接其他下载者,从它们那里下载文件,同时把自己已下载的部分提供给其他下载者下载。

共享文件在逻辑上被划分为大小相同的块,称为piece,每个piece通常为256KB。实际使用中,每个piece又被划分为大小相同的slice,每个slice固定为16KB。peer之间每次传输以slice为单位。种子文件中包含有每个piece的hash值。BT协议规定使用Sha1算法对每个piece生成20字节的hash值,作为每个piece的指纹。每当客户端下载完一个piece时,即对该piece使用Sha1算法计算其hash值,并与种子文件中保存的该piece的hash值进行比较,如果一致即表明下载了一个完整而正确的piece。一旦某个piece被下载,该piece即可提供给其他peer下载。

待开发的BT客户端应包含以下功能:

解析种子文件以获取待下载文件的信息

连接Tracker服务器获取peer的IP和端口

连接peer进行数据上传和下载

对要发布的共享文件制作和生成种子文件

种子文件和Tracker的返回信息都用一种简单而高效的编码方式进行编码,称为B编码。Tracker本身作为一个web服务器,客户端与Tracker交换信息基于HTTP协议。客户端与其他peer采用面向连接的可靠传输协议TCP进行通信。

B编码

B编码有4种类型:字符串、整型、列表、字典。

字符串的编码格式::,例如字符串spam,经过B编码后为:4:spam。

整型的编码格式:ie,例如整数3,-3和0的B编码分别为:i3e,i-3e,i0e。

列表的编码格式:le,例如列表l4:spam4eggse表示两个字符串,一个是spam,一个是eggs。

字典的编码格式:de,关键字是一个经过B编码的字符串,值可以是任何合法的B编码类型。d和e之间可以出现多个关键字和值对。例如d4:spaml3:aaa3:bbbee是一个字典,关键字是spam,值是一个列表,列表中有2个字符串aaa和bbb。

种子文件的结构

种子文件就是一个B编码的字典。包含以下关键字。

关键字

含义

info

对应的值是一个字典,它有2种模式,“single file”和"multiple file",单文件模式是指待共享文件只有一个,多文件模式是待共享的文件不止1个。比如一部分电影分上下部2个文件。

announce

值为Tracker的URL

announce-list

可选,存放的是备用Tracker的URL

info是最重要的关键字,它的值是一个字典,无论是单文件模式还是多文件模式,该字典都包含以下关键字:

关键字

含义

piece length

每个piece的长度,通常为i252144e,即256K

pieces

对应的值为一个字符串,它存放的是各个piece的hash值,该字符串的长度是20的倍数,因为每个piece的hash值的长度都是20字节

对于单文件模式,info的值还包括以下关键字:

name:共享文件的文件名

lengtth:共享文件的长度

对于多文件模式,info的值还包括以下关键词:

name:存放所有共享文件的文件夹名

files:它的值是一个列表,列表中包含多个字典,一个字典对应着一个共享的文件。此字典中又包含以下关键字                     (1)path:共享文件的路径和文件名

(2)length:共享文件的长度

c语言bt下载程序,用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1相关推荐

  1. c语言编写数据存储的游戏,c语言经典小程序和c语言编写的小游戏带注释(自动保存的).doc...

    c语言经典小程序和c语言编写的小游戏带注释(自动保存的) 1.写一个定时?关机的小程?序,可以立即关?闭计算机,也可以一段?时间后关闭?计算机. #inclu?de #inclu?de #inclu? ...

  2. 通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)

    文章目录 一.单文件下载 1.简单理解文件下载 2.单文件下载的具体代码实现 3.测试 4.单文件下载整体代码 二.多文件批量下载(多个文件合成一个压缩包下载) 1.多文件下载的实现方式,这里使用了Z ...

  3. c语言考试系统程序,二级c语言模拟考试软件下载

    无忧考吧二级c语言考试系统是一款非常专业的计算机二级C语言模拟考试软件,可以帮助用户朋友们对全国计算机二级C语言考试进行模拟测试学习,如果您对这一门课程并没有什么把握需要练习,这款考试模拟系统一定是你 ...

  4. c语言程序阅读题库,C语言程序设计-阅读程序题库及答案.doc-资源下载在线文库www.lddoc.cn...

    C语言程序设计-------阅读程序题库及答案.doc 阅读程序题 2 1 以下程序的输出结果是 main D float a a 1 100000000 printf g a A 0 00000e ...

  5. 用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1

    BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断地向其他下载者上传已下载的数据.它是属于一个应用层的协议. 基于BT协议的文件分发系统由以下几个实体构成: 一个web服务 ...

  6. 用C语言开发一个BT下载软件 (二) ------ 算法和策略

    流水线作业 当客户端向peer发送数据请求时(即发送request消息),一次请求多个slice(即在一个数据包中发送多个request消息请求多个slice).peer发送完一个slice后接着发送 ...

  7. 科学出版社c语言实验答案,程序设计基础c语言第三章程序结构教材习题答案科学出版社...

    第 1 页程序设计基础-C 语言(科学出版社教材)第三章-程序结构教材习题答案1.0 编写程序使整形变量:a=3,b=4,c=5,p=0xfffe,q=0xffff;浮点型变量:x=1.2,y=2.4 ...

  8. 电大java语言与面向对象程序设计基础_6406Java语言与面向对象程序设计基础A卷...

    6406Java语言与面向对象程序设计基础A卷 试卷编号:6406 座位号 浙江广播电视大学2006年春季学期开放教育专科期末考试 <Java语言与面向对象程序设计基础>试题 2006年7 ...

  9. c程序设计语言 qsort,【程序设计基础_C语言】北理工的恶龙(附qsort范例)

    [程序设计基础_C语言]北理工的恶龙(附qsort实例) 北理工的恶龙(附qsort实例) 背景:最近,北理工出现了一只恶龙,它长着很多 头,而且还会吐火,它将会把北理工烧成废墟, 于是,校长下令召集 ...

最新文章

  1. java 组合框_Java知多少(88)列表和组合框
  2. Pandas获取数据列名称的列表(list):(column list)
  3. 文轩在线:如何让IT部门成为企业的价值中心
  4. 本周技术主题-----.net中的资源文件
  5. python基础教程:list转换range()的打印结果
  6. 前端之JQuery(二)
  7. spring boot 字体文件等静态资源无法获取
  8. oracle备份集注册,OracleRMAN将备份集重新注册到控制文件说明
  9. Java学习笔记7-2——注解与反射
  10. 12、(12.4.2)保护模式下数据段和栈段保护
  11. Erlang --- gen_server
  12. 【Vegas2006】8月24日-花豆擀面做法
  13. 玩转vim之vim插件Ctags
  14. 三酷猫学python_python学习第6期
  15. java web项目_一个完整JavaWeb项目开发总结
  16. Android播放音乐的代码,android源代码(完整的音乐播放器)
  17. 多懂点SQL可以写出更好的接口
  18. 都有云技术了,传统动态vps还有什么用?
  19. 关于SBUF读两次的问题
  20. 使用MDK创建stm32 库函数工程简单教程

热门文章

  1. angularjs 验证身份证格式 和 一般JS验证身份证格式
  2. 三七互娱 Java游戏开发工程师 面试(两轮技术+HR面)
  3. R2104驱动电路的简单应用
  4. nodejs按固定大小读取文件
  5. 自考计算机本科怎么学,自考经验:3至5年拿计算机自考本科文凭
  6. 使用FFT进行快速FIR滤波
  7. 新人入职第一天的基本操作
  8. 一、zabbix快速入门
  9. 简易版“美颜”来了!肝了一夜!用Python做一个高瘦脸神器!
  10. Jumpsever连接windows server 2012 R2 出现(网络不可达|安全策略错误)问题记录