go_downloader
go_downloader
原理分析
- 传统的中心模式,user的速度会收到server总带宽的限制,如果下载的client越多,速度会越慢
- P2P传输模式,每个参与下载的都是一个peer,可以理解为节点,当有一个peer节点从server下载后,后面下载的client可以从这个已经下载好的peer节点来下载,而不是再次从server中下载,从而减轻了server的压力
面临问题
- 如何找到有资源的peer,可以通过tracker,类似于pt站
- 如何让peers协作完成下载,将一个文件分割为很多的pieces,从不同的peers中下载不同的pieces,然后进行一次校验,看和种子文件中的信息是否匹配(是否完整)
Torrent File格式
- 第一个和track相关的是announce,第二个和文件相关的是info
- announce和url相关
- info和文件相关
Bencode协议
plan
创建bencode库用于编解码
基本数据类型
type BType uint8 //给uint8起了个别名为BType,type关键字用于定义类型的别名 const ( BSTR BType = 0x01 BINT BType = 0x02 BLIST BType = 0x03 BDICT BType = 0x04 ) type BValue interface{} type BObject struct { type_ BType val_ BValue } func (o *BObject) Str() (string, error) { if o.type_ != BSTR { return "", ErrTyp } return o.val_.(string), nil } func (o *BObject) int() (int, error) { if o.type_ != BINT { return 0, ErrTyp } return o.val_.(int), nil } func (o *BObject) List([]*BObject, error) { if o.type_ != BLIST { return nil, ErrTyp } return o.val_([]*BObject), nil } func (o *BObject) Dict() (map[string]*BObject, error) { if o.type_ != BDICT { return nil, ErrTyp } return o.val_.(map[string]*BObject), nil }
string数据类型
Torrent file解析
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 h3110w0r1d's Blog!