整个系统各个模块功能如下图所示:
(2)消息处理:peer之间通过发送和接收消息的方式进行通信。本模块负责根据当前的状态生成并发送消息,接收并处理消息。对下载和上传最重要的是request消息和piece消息。request消息向peer发送数据请求,指明请求的是哪个piece的哪个slice。peer接收到request消息后根据当前状态,决定是否发送数据给对方。如果允许发送,则构造piece消息,数据被封装在该消息中。每当下载完一个正确的piece时,就向所有peer发送have消息通知已或得该piece,其他peer如果没有该piece就可以向peer发送数据请求。
(3)缓冲管理:如果下载完一个piece就立即写入硬盘,会导致频繁地读写硬盘。下载的数据将被缓存起来,等到一定量后再集中写入硬盘。当peer请求一个slice时,也是先将该slice所在的整个piece读入到缓冲区中,下次peer再请求该piece的其他slice时,则只需在缓冲区中获取,避免频繁读写硬盘。
(4)位图管理:位图标明哪些piece已经下载,哪些piece还没有下载。每个piece占1位,分别用1和0表示已下载和未下载。客户端与peer建立连接并进行握手之后,即发送位图给peer,同时也接收对方的位图并将其保存在peer结构体中。每下载到一个piece就更新自己的位图,并发送have消息给所有已建立连接的peer。每当接收到peer发来的have消息就更新该peer的位图。
(5)策略管理:计算各个peer的下载和上传速度,根据下载速度选择非阻塞peer,采用随机算法选择优化非阻塞peer,以及实现片断选择策略。
(6)信号处理:在运行过程中,程序可能会接收到一些信号,如SIGINT,SIGTERM,这些信号的默认动作是立即终止程序,但之前需做一些处理,比如释放动态申请的内存、关闭文件描述符、关闭套接字等。