go_downloader

原理分析

  1. 传统的中心模式,user的速度会收到server总带宽的限制,如果下载的client越多,速度会越慢
  2. P2P传输模式,每个参与下载的都是一个peer,可以理解为节点,当有一个peer节点从server下载后,后面下载的client可以从这个已经下载好的peer节点来下载,而不是再次从server中下载,从而减轻了server的压力

面临问题

  1. 如何找到有资源的peer,可以通过tracker,类似于pt站
  2. 如何让peers协作完成下载,将一个文件分割为很多的pieces,从不同的peers中下载不同的pieces,然后进行一次校验,看和种子文件中的信息是否匹配(是否完整)

Torrent File格式

  1. 第一个和track相关的是announce,第二个和文件相关的是info
  2. announce和url相关
  3. info和文件相关

Bencode协议

plan

创建bencode库用于编解码

  1. 基本数据类型

    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
    }
  2. string数据类型

  3. 
    

Torrent file解析