关于BT协议在网游更新领域的不足
BitTorrent是一个成熟稳定快速的P2P资源共享系统。其协议是为大文件下载而设计,然而在网游更新领域,BT有它与生俱来的缺陷。BT的种子文件,是将多个文件首尾相连视为一个大的“流”文件,然后根据指定的块大小,将这个“流”文件划分为若干块,再对每块数据生成一个20字节的sha1,再将这些sha1数据保存到种子文件里面,之后BT下载时,按块下载,按块校验。
而在游戏更新时,通常只有一部分文件或者某个文件的一部分被改变,这时应该仅仅下载并更新需要修改的数据块文件(因为互联网是最慢的环节)。但是如何计算出本次更新有哪些数据块需要下载?新生成的种子文件与旧的种子文件进行比较,无法计算出这些块数据!(能够算出哪块是第一块需要下载的,但是算不出这块之后哪些块是不需要下载的)
扩充的非标准的padding协议是一种解决方案,大致思路是当一个文件的最后一块的数据不足一块时,插入一个padding文件。但是我们提出并实现的是另外一种方案。
新的方案是不再将多个文件串联成为一个“流”文件(感觉BT最初的设计只是为了单文件设计,目录和多文件还是之后扩充的)。每个文件的sha1存到自己的数据段里,假如一个文件有256k+100字节,块大小为256k,则它分为2块,第一块256字节,第二块为100字节。这样假如下次更新,这个文件添加了100字节,则仅需要下载第二块,共200字节。而且很容易通过新旧种子文件内容的快速比较,得出本次更新需要下载哪些数据块。
这个方案的缺点是,块数会比较多,因为除了空文件,每个文件至少一块,会占用20字节的种子文件空间,尤其在很多小文件(每个文件仅几kb或几十kb)的场合,种子文件的大小会更加大一些。
另外一个缺点是,这是一个完全不兼容的新的种子文件格式,或者不该再称之为种子文件。
请参阅“网游更新平台”
posted on 2012-12-02 19:34 zhaozongzhe 阅读(248) 评论(0) 编辑 收藏 举报
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步