BT客户端实现 Peer协议设计

与peer建立tcp连接后,首先发送handshake消息进行握手

handshake消息格式如下:

一个字节0x19 + 一个字符串‘BitTorrent protocol‘ + 8 byte 保留字节默认值为0(draft中对保留字节有定义)

+ 种子文件中info 部分的sha1字,大小为20个字节 + 20个自己的peer id(从tracker获取到的peer信息大多没有peerid,这个可以使用本地的peer id)

如果handshake信息协商不上,tcp连接将被关闭。

BT标准BEP-3中定义了8种peer消息:消息格式为msg_len(4个字节) + msg_type(1一个字节) + payload

0 - choke  --发送该消息表示本段发送阻塞,对端将不能获取到piece数据,payload 为 0

1 - unchoke  --发送该消息表示解阻塞,对端可以开始发送请求获取piece数据,payload 为 0

2 - interested  --发送该消息,表示对对端的pieces数据有兴趣,payload 为 0

3 - not interested  ---发送该消息,表示对对端的pieces数据没有兴趣了,payload 为 0

4 - have       ---发送该消息,通告对端 本段拥有的pieces,payload为4个字节的piece index

5 - bitfield  ---发送该消息,通告对端 本段拥有的pieces,为bit map的方式表示每个piece index在本端是否拥有。piece index所在bit位为1,表示拥有。

该消息为handshake成功后的第一个消息。

6 - request   ---piece请求消息,payload为: index, begin, and length,都是4个字节表示,length一般实现为0x8000, 最大不能超过0x20000。

7 - piece     ---piece  数据,payload为: index, begin,data

8 - cancel    ---发送该消息,表示本端取消了某个piece请求。payload为:index, begin, and length

使用python的异步socket接口实现,为了减少处理过程被socket阻塞,使用多个线程处理每个peer。

每个peer包括3个线程:request timeout timer ,socket send data thread, socket receive data thread,使用select 函数判断socket是否可读、可写。

对socket读写操作时使用RLock进行保护,select阻塞进程时不加锁,避免阻塞其他线程。

发送数据数据时先写一个队列,然后通过set threading.Event 变量出发socket send data thread发送数据,保证发送数据的线程不阻塞

由于 python没有结束线程的接口,socket send data thread, socket receive data thread 需要依赖特殊变量的赋值,使socket处理进程结束。

使用同步调用来触发下载过程运转,尽量不使用timer轮询的方式,可以降低cpu使用率并加快下载过程。

但是,多线程间的同步调用由于锁的存在,会导致性能下降并容易引入信号量死锁的问题。需要仔细设计好多线程的运行轨迹避免死锁。

draft BEP中定义的功能暂未实现,peer的上传流控未实现,peer质量分级未实现。

时间: 2024-12-26 08:25:13

BT客户端实现 Peer协议设计的相关文章

信息安全系统设计基础实验五:通讯协议设计

北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:52.53 姓名:王思亓 赵阳林 学号:20135205 20135334 成绩: 指导教师:娄嘉鹏 实验日期:2015.11.24 实验密级: 预习程度: 实验时间:15:30—18:00 仪器组次: 必修/选修:必修 实验序号: 实验名称:通讯协议设计 实验目的与要求:1.掌握在ARM开发板实现一个简单的WEB服务器的过程.2.学习在ARM开发板上的SOCKET网络编程.3.学习Linux下的signal()函

PC客户端的互联网化设计

伴随着手机,平板电脑为代表的移动互联网的不断发展,云计算和云服务的兴起,更是推动着传统企业不断地往互联网方向转型.作为Windows客户端程序员,自己也在时刻地警醒着:要抛弃传统软件开发思维,努力学习互联网思维.互联网+,这一个充满着机遇的经济新形态,让所有传统企业都感觉到挑战和希望.而最后能否突围成功,则在于是否能用互联网思维去解决问题. 好的,大层面讲完,该聚焦到具体的细节上.传统PC客户端开发都采用C/S架构,即服务器/客户端.例如在用户电脑上安装客户端和本地数据库,客户端与服务器端进行通

网络协议设计

一篇文章: 要解决的重点在于1 防止发送的消息丢失(1)接收方收到则应答(2)发送发发送后,过一段时间未收到应答,则重发:重发多次仍无应答,则退出2 防止应答丢失(1)应答丢失,则发送方会重发.接收方需判断收到的消息是否重复(帧中加入序列号)3 身份确认(1)用地址确认身份4 传递效率(1)限制每条消息的大小 上面的很基础.转自:http://blog.csdn.net/ybdesire/article/details/6859582 一篇文章: 实时游戏的网络协议设计 类似于SLG这类游戏,对

实验五:通讯协议设计

北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础               班级:1453班 姓名:彭垚                 学号:20145317 成绩:            指导教师:娄嘉鹏           实验日期:2016.11.16 实验密级:        预习程度:               实验时间10:00-12:00 仪器组次:         必修/选修:必修             实验序号:五 实验名

[分享] IM 协议设计选型

Hi ,各位小伙伴们,又见面啦,有木有很想念呀.不知道上次分享的关于 IM 底层协议的知识对大家有木有帮助,今天俺要就 IM 的协议的设计选型做一个简单的分享.废话不多说,现在开始讲解吧.一. im 协议的分层设计所谓“协议”是双方共同遵守的规则,例如:离婚协议,停战协议.协议有语法.语义.时序三要素.( 1 )语法:即数据与控制信息的结构或格式( 2 )语义:即需要发出何种控制信息,完成何种动作以及做出何种响应( 3 )时序:即事件实现顺序的详细说明今天的重点是在“协议选型”上,重点讲选哪种协

主程序员的练成:TCP、消息分包和协议设计

在<主程序员的练成:IP.DNS和CDN>中,一次网络请求经过DNS解析知道了目的IP,现在就要发出网络包,这里我们说一说TCP的相关话题. TCP是一种流式协议 讲网络编程的教科书一般都会对TCP的可靠传输,api用法做详细说明,但对于TCP是一种流式协议讲解的不多,但这背后隐藏着很重要的一个知识点.先做个名词定义方便交流,这里的"消息"是指应用层的一个完整的协议包. 流式协议的特点是什么?就像流水连续不断那样,消息之间没有边界.例如send了3条消息,分别是100字节.

# 2017-2018-1 20155318 《信息安全系统设计基础》 实验五 通讯协议设计

2017-2018-1 20155318 <信息安全系统设计基础> 实验五 通讯协议设计 Linux下OpenSSL的安装与测试 任务要求:在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业 OpenSSL简介 OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux.Windows.Mac OS等多种平台. OpenSSL整个软件包大概可以分成三个主要的功能部分: 密码

2017-2018-1 20155223 实验五 通讯协议设计

2017-2018-1 20155223 实验五 通讯协议设计 什么是OpenSSL? OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输.Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准.其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持

2017-2018-1 20155317《信息安全系统设计基础》 实验五 通讯协议设计

2017-2018-1 20155317<信息安全系统设计基础> 实验五 通讯协议设计 实验要求 任务 安装OpenSSL环境,并编写测试代码验证无误研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5在Ubuntu中实现对实验二中的"wc服务器"通过混合密码系统进行防护 1.安装OpenSSL环境,并编写测试代码验证无误 实验步骤: $ ./config $ make $ make test $ make install 进行测试,