[缓存]迅雷下载原理

来自:http://hi.baidu.com/gcjia/blog/item/2b77bc3df8544803bba1675f.html

1.迅雷是什么?

迅雷是基于P2SP的一款下载软件,能够大大增强下载速度,可谓迅雷不及掩耳盗铃之势如破竹。

P2SP的道理不复杂,就是指:如果多个服务器上有某个相同的文件,当某个用户下载其中一个服务器上的这一文件时,迅雷会自动查找到另外的几个服务器,同时下载这一文件,达到提速的目的。

迅雷比较流氓,在用户没有得到任何提示毫不知情的情况下,偷偷上传用户的本地文件,在所有网络流量的统计中排到了第7位。(注:CERNET上似乎可以进三强)迅雷比较小气,不说源代码不是公开的,连原理也不公开。

迅雷比较聪明,她的架构让人佩服啊佩服,佩服啊佩服,佩服啊佩服……

2 下载原理

还记得百度的mp3搜索么?你到mp3.baidu.com上搜索一个mp3,百度会给你列出她知道的所有服务器列表(这些服务器都是别人的),你可以在百度上点击该连接下载mp3,而不用登陆真正的服务器。

迅雷就是把这个过程自动化了,并且增加了判断文件唯一性的功能,画个图简单说明一下:

1.用户点击1.2.3.4上的QQ_1.exe文件的连接

2.用户客户机上的迅雷得到该文件的唯一的校验值。

3.迅雷自动向自己的资源服务器上搜索,查找到存放同一文件的其他的服务器列表

4.得到文件在该服务器上的目录和文件名(红色部分,有可能和原始连接中的文件名不相同),http://www.cnblogs.com/erwin/admin/ftp://1.2.3.5/QQ_2.exe,http://1.2.3.6/QQ_3.exe,以及公网用户1.2.3.7有QQ.exe

5.迅雷自动向1.2.3.5和1.2.3.6上下载该文件的不同文件块,以达到加速下载的目的(紫色部分)。

6.用户向公网用户1.2.3.7发送一个UDP资源请求

7.1.2.3.7回应一个资源请求说:偶这儿有你要的文件

8.用户向公网用户1.2.3.7的3077端口发起请求,并传输数据。

9.下载完毕后,如果迅雷资源服务器上,该文件的服务器列表中没有目前用户点击下载的服务器1.2.3.4,则将这个新的服务器地址加入到该文件的服务器列表(蓝色部分)。

注:

1.上述过程中的6、7、8步骤中隐含了一个过程:判断用户是否是公网用户。

如果是公网用户,则该用户的IP地址和提供下载服务的端口也将记录在迅雷的资源服务器中,后续用户可以从该用户处下载;第三节有这个过程的说明。

2.迅雷如何区分不同的文件?很多文件名字不同但是内容相同,很多文件名字相同但是内容不同。搜索迅雷的相关信息只是得到了几句无关痛痒的废话:迅雷还使用了独创的文件校验机制,保证了用户下载文件的正确性和完整。至于什么方法不得而知

3.我们如何查看迅雷搜索到的资源列表?

在迅雷搜索到一系列的资源列表并且任务没有完成时,会在相同下载目录下建立一个临时文件,里面有搜索到的资源信息,其中peer就是搜索到的包含要下载文件的公网用户。

3 协议解析

分析第二节原理图中的下载过程,第1、2、5步和正常的下载是一模一样的,我们无法根本无法区分。那好,我们就在3、4、6上做文章。

除了上述用户下载一个具体文件的过程的各个报文外,还有交换资源信息报文,用户和用户之间的文件块传输报文、判断用户是否是公网用户的报文等。

1.资源请求报文

每次迅雷都会向219.134.132.47的tcp端口3076发出资源请求,该地址是写死在迅雷软件中的,并非依靠DNS请求得到。

如果该地址不可用,则会切换到另外两个可替换的地址219.134.132.42、219.134.132.86。

Web迅雷则使用219.134.132.46。

过滤掉这个报文,那么迅雷客户端就无法完成资源请求,无法从多点下载。用TP过滤掉报文后迅雷只能从原始连接下载,如下图:

协议报文特征如下:

2.资源搜索回应报文

过滤掉这个报文,那么迅雷客户端就无法得到资源列表,无法从多点下载。

协议报文特征如下:

3.用户之间的文件传输(握手报文)

用户之间是可以传送文件块的,下面的报文就是传送文件块开始之前的握手报文,3077端口为客户端的监听端口,用来把本地的文件传输给别人。(如果3077不能用,会转到其他端口).

4.用户之间资源信息交换报文

5.提交新的资源信息报文

6.连接NAT测试服务器报文

迅雷每过几分钟就会向statnat1.sandai.net发送NAT测试报文,也就是告诉迅雷的资源服务器,自己是否是公网IP.该报文由于无返回报文,所以猜想采用的办法是采用STUN的方法:

将本机的IP地址放在UDP的payload里,如果迅雷的服务器收到报文发现IP层的源地址和payload里的IP地址一致,那么就是公网地址,否则就是处于防火墙后面或者需要经NAT才能上公网。

协议报文如下:

注:

sandai.net是xunlei旗下的一个网站,很少单独抛头露面,多出现在迅雷软件检索关联信息、显示广告的DNS请求报文中。

4TP过滤

如果TP武断的对迅雷进行过滤,只需要设定一个traffic management,把目的地址为219.134.132.0/24网段,目的端口为3076的报文全部过滤就可以防止迅雷下载,但是有可能会误报。下面的规则更详细一点,可以减少误报。

1.针对用户向服务器资源请求报文和资源回应报文的过滤

由于迅雷的服务器IP地址比较容易更换,所以建议过滤的DV:

协议:tcp

源端口/目的端口:3076

开始的四个字节:0x29000000

2.针对用户之间的资源信息交互报文的过滤

协议UDP

端口3076

前四个字节0x32000000

3.针对用户之间的文件传输(握手报文)的过滤

协议tcp

源端口或者目的端口可以为3077、3078

前四个字节为0x29000000

4.提交新的资源信息的报文的过滤

协议TCP

目的端口3076

前四个字节0x29000000

5.针对连接NAT测试服务器的报文的过滤

协议UDP

目的端口3076

前四个字节0x00000101

转载于:https://www.cnblogs.com/erwin/archive/2009/07/24/1529808.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 实现两列等宽布局的方式有哪些?

[html] 实现两列等宽布局的方式有哪些? 1.flex实现: .parent { display: flex; } .child { flex: 1; width: 50%; } 2.float实现(但是要注意清除浮动): .child { float: left; width: 50%; }个人简介 我是歌谣&#…

背景透明度 下拉菜单

下拉菜单 ——————> <style> /* 下拉按钮样式 */ .dropbtn {background-color: #4CAF50;color: white;padding: 16px;font-size: 16px;border: none;cursor: pointer; }/* 容器 <div> - 需要定位下拉内容 */ .dropdown {position: relative;display: inlin…

datavideo切换台说明书_巴掌大三轴稳定器,稳过微云台,试试飞宇VLOGPocket2

几乎全民VLOG的时代&#xff0c;我们随处可见有人举着手机、相机记录生活&#xff0c;甚至还有品牌推出了自带微云台的手机。不过&#xff0c;即便在手机上硬“塞”进一个微云台&#xff0c;效果也始终无法媲美真正的云台&#xff0c;对视频拍摄的提升相对有限&#xff0c;大部…

[html] 写一个滚动吸顶的布局

[html] 写一个滚动吸顶的布局 position: sticky; top:20px&#xff1b;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

C语言程序设计上机前三题,C语言程序设计(含上机实验与习题解答)

本书根据作者多年来教授不同基础学员的经验&#xff0c;针对初学者的特点&#xff0c;由浅入深&#xff0c;从一般程序设计语言的共性到C语言自身的特性&#xff0c;从C语言的语法规则到其内部实现&#xff0c;对C语言进行了系统的介绍。全书分上、下两篇。上篇介绍C语言程序设…

最新PC游戏下载链接

http://www.newyx.net/list/5_1.htm转载于:https://www.cnblogs.com/vilyLei/archive/2009/07/28/1533057.html

VSCode中Markdown目录显示异常

更新最新的VSCode之后编辑Markdown文件发现TOC标签的目录格式异常&#xff0c;发现是因为行尾字符导致&#xff0c;必须设置行尾字符进行解决。 转载于:https://www.cnblogs.com/phonecom/p/10904785.html

string转换成enum

String转换为Enum类型public enum TypeItemName{News,Bulletin,Dispatch} TypeItemName item (TypeItemName )Enum.Parse(typeof(TypeItemName ), inText, false);转载于:https://www.cnblogs.com/sceo/archive/2009/08/04/1538369.html

发纸牌c语言指针,算了算学了有一个月c语言了,写了个扑克牌程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*将5张扑克牌转化为9种牌型 */int change(int card[]){if(checkTongHuaShun(card))//同花顺牌型8{return 8;}else if(checkSiTiao(card))//四条牌型7{return 7;}else if(checkSanTiaoYiDui(card))//三条一对牌型6{return 6;}else …

[html] 写一个垂直的三栏布局,第一栏固定顶部,中间铺满,第三栏固定底部

[html] 写一个垂直的三栏布局&#xff0c;第一栏固定顶部&#xff0c;中间铺满&#xff0c;第三栏固定底部 好像有几种写法 我个人比较喜欢的是&#xff0c; <style> html, body { margin: 0; padding: 0; width: 100%; height: 100%; } .top-level { position: fixed; …

dlp防泄密系统卸载_怎样做好数据防泄密?奥赛系统早知道

前言大数据是趋势&#xff0c;泄密和数据泄露时常发生。员工离职、文件外传、在线拷贝..... 数据安全已经是每家公司必做功课。企业现状企业垂青“工作经历”和“自带资源”,“高薪挖人”被认为是企业事务快速增长、企业研制效果快速显现、企业快速兴起的捷径。当所“挖”人才来…

jsonp使用

浏览器可以向其他服务器发送数据&#xff0c;但是默认不会接收从其他服务器返回的数据&#xff0c;这叫做浏览器的同源策略&#xff0c;即XMLHttpRequest无法接收其他服务器的数据。但在实际生活场景中经常需要向其他服务器发送数据&#xff0c;这就需要用到jsonp实现跨域。 &l…

[Microsoft][SQL Server 2000 Driver for JDBC]Error establishing socket

1. Install SQL Server 2000 Sp4. 2. Install SQL Server Driver for JDBC, then set the CLASSPATH. Install JRE 1.5 maybe needed. 3. Enable port 1433 on firewall. Enable TCP of your SQL Server maybe needed转载于:https://www.cnblogs.com/NickyYe/archive/2009/08/0…

c语言定义数组6,C语言教程6数组.ppt

C语言教程6数组.ppt#include main( ){ char name[13]; int i; for (i 0; i <12; i )scanf(“ %c”,&name[i]); for (i 0; i <12; i )printf(“ %c”,name[i]); scanf(“ %s”,name); printf(“ %s”,name);} 例2&#xff1a;采用不同的方式输入输出字符串 运行结果:P…

[html] 移动端布局的自适应如何做?

[html] 移动端布局的自适应如何做&#xff1f; 移动端的布局&#xff0c;如果是采用框架的话&#xff0c;小程序和uni-app等都有响应式单位rpx来做自适应。 如果单纯的用Vue或React的话&#xff0c;一般来说就是flex配合rem或者vw布局来实现自适应。 rem布局的原理是根据rem是…

30万手表推荐_一年收入20万—30万的小生意,市场上有哪些呢?推荐几个供参考...

目前经济形势不乐观&#xff0c;许多创业者都陷入泥潭中&#xff0c;总是想挣脱&#xff0c;却总是徒劳无功。我认为在这样的时期&#xff0c;如果能静下心来&#xff0c;选择去做一些有前景的小生意&#xff0c;也是一个很好的选择。那么在目前市场上&#xff0c;有哪些能年收…

Dubbo中的监控和管理

一、Dubbo中的监控 1、原理 原理&#xff1a;服务消费者和提供者&#xff0c;在内存中累计调用次数和调用时间&#xff0c;定时每分钟发送一次统计数据到监控中心。 2、搭建监控服务 3、修改配置文件 修改注册中心的地址&#xff1a; 注意&#xff1a;这个有一个client参数&…

c语言中listempty函数,list_empty()和list_empty_careful()

大多数的读者在学习编程语言的时候都不喜欢那些枯燥的文字描述&#xff0c;包括我自己在开始学习编程的时候也是这样&#xff0c;对于代码的热情远远高于文字&#xff0c;所以我在我写东西的时候也不喜欢用枯燥的文字描述来向读者讲解&#xff0c;更喜欢用代码加上适当的文字描…

总是忘记的oracle 函数

怪自己总不操心&#xff0c;总有那么一些 常用函数的用法忘的一干二净&#xff0c;为了提高以后自己的工作效率&#xff0c;还是老老实实记录下来吧&#xff01; 日期类型函数 1.日期计算 Oracle 默认对日期是按“天”单位进行计算的&#xff0c;所以对日其他时分秒计算法如下&…

[html] 写一个水平竖直居中的弹窗,带遮罩层的布局

[html] 写一个水平竖直居中的弹窗&#xff0c;带遮罩层的布局 <div class"container"><div class"modal">modal<div> </div>个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷…