迅雷是一个多协议的的P2SP下载管理器,除了支持基本的HTTP、FTP下载,还支持同一个资源的多种P2P协议下载,例如BT和电驴协议。当然,最大的特点是,还是资源服务器S,这个S上保存了很多网络资源的分布下载点,因此,在客户端网络带宽的允许下,下载某个比较热点的资源时,会达到网络资源利用最大化。
在P2P出来之前,通常使用的是HTTP和FTP下载,那时决定网络下载速度有两个因素,一是客户端的带宽,二是要被下载某一资源所在服务器的带宽(感觉像废话,呵呵)。客户端的带宽软件没有办法解决,因为这个是由它本身资源的不足决定的,服务器的带宽对于用户来说,也没有办法控制。但是,同一个资源,可能会存在于不同的服务器上,所以,在客户端从其中一个服务器下载资源时,如果此时客户端还有剩余的带宽,那么它可以从其他的资源服务器并行下载同一个资源的不同部分,例如一个文件10M,如果从一个资源服务器下载可能需要3分钟,但是,当客户端知道另外有四个资源服务器都存在该资源时,那么它可以同时从另外四个服务器上下载该资源的其他部分,当所有部分下载完毕,下载程序将各自下载的部分合并成一个文件,那么总的下载时间可能只需要原有时间的1/5,从而达到客户端网络带宽利用最大化。
至于如何将资源分不同的部分进行下载,在这里不做过多的讨论,不同的协议,有不同的处理方式,都已实现或有标准,按照标准实现即可。
上面讨论提到了多资源服务器下载,但是客户端怎么知道其他还有哪一些资源服务器存在要下载的资源呢?必须有个地方,存在对资源的索引,当要下载某资源时,就在资源服务器上索引,然后将含有该资源的服务器列表传输至客户端,然后客户端才对资源分不同的部分进行下载。
在迅雷实现的协议中,当下载某个HTTP资源时,通过WIRESHARK抓包发现,它会往资源服务器发送一个POST请求,如下图:
从上图可以看出,使用的是标准的HTTP协议,但是内容已经加密,撇开HTTP POST的HEADER不看,前面4个字节一般都是固定的,后面的四个字节好像是随机,接下来的四个字节(红色矩形框)是POST内容的长度(不包括前面的12个字节)。
从上面的分析,基本就可以对迅雷进行识别了,但是我们更感兴趣的是它到底发了些什么给服务器(由于加密了,不知道发些啥),因此对迅雷程序做了简单的逆向,下图是发送内容的解密截图: