[缓存]迅雷下载原理
來自:http://hi.baidu.com/gcjia/blog/item/2b77bc3df8544803bba1675f.html
1.迅雷是什么?
迅雷是基于P2SP的一款下載軟件,能夠大大增強(qiáng)下載速度,可謂迅雷不及掩耳盜鈴之勢(shì)如破竹。
P2SP的道理不復(fù)雜,就是指:如果多個(gè)服務(wù)器上有某個(gè)相同的文件,當(dāng)某個(gè)用戶下載其中一個(gè)服務(wù)器上的這一文件時(shí),迅雷會(huì)自動(dòng)查找到另外的幾個(gè)服務(wù)器,同時(shí)下載這一文件,達(dá)到提速的目的。
迅雷比較流氓,在用戶沒有得到任何提示毫不知情的情況下,偷偷上傳用戶的本地文件,在所有網(wǎng)絡(luò)流量的統(tǒng)計(jì)中排到了第7位。(注:CERNET上似乎可以進(jìn)三強(qiáng))迅雷比較小氣,不說源代碼不是公開的,連原理也不公開。
迅雷比較聰明,她的架構(gòu)讓人佩服啊佩服,佩服啊佩服,佩服啊佩服……
2 下載原理
還記得百度的mp3搜索么?你到mp3.baidu.com上搜索一個(gè)mp3,百度會(huì)給你列出她知道的所有服務(wù)器列表(這些服務(wù)器都是別人的),你可以在百度上點(diǎn)擊該連接下載mp3,而不用登陸真正的服務(wù)器。
迅雷就是把這個(gè)過程自動(dòng)化了,并且增加了判斷文件唯一性的功能,畫個(gè)圖簡(jiǎn)單說明一下:
1.用戶點(diǎn)擊1.2.3.4上的QQ_1.exe文件的連接
2.用戶客戶機(jī)上的迅雷得到該文件的唯一的校驗(yàn)值。
3.迅雷自動(dòng)向自己的資源服務(wù)器上搜索,查找到存放同一文件的其他的服務(wù)器列表
4.得到文件在該服務(wù)器上的目錄和文件名(紅色部分,有可能和原始連接中的文件名不相同),http://www.cnblogs.com/erwin/admin/ftp://1.2.3.5/QQ_2.exe,http://1.2.3.6/QQ_3.exe,以及公網(wǎng)用戶1.2.3.7有QQ.exe
5.迅雷自動(dòng)向1.2.3.5和1.2.3.6上下載該文件的不同文件塊,以達(dá)到加速下載的目的(紫色部分)。
6.用戶向公網(wǎng)用戶1.2.3.7發(fā)送一個(gè)UDP資源請(qǐng)求
7.1.2.3.7回應(yīng)一個(gè)資源請(qǐng)求說:偶這兒有你要的文件
8.用戶向公網(wǎng)用戶1.2.3.7的3077端口發(fā)起請(qǐng)求,并傳輸數(shù)據(jù)。
9.下載完畢后,如果迅雷資源服務(wù)器上,該文件的服務(wù)器列表中沒有目前用戶點(diǎn)擊下載的服務(wù)器1.2.3.4,則將這個(gè)新的服務(wù)器地址加入到該文件的服務(wù)器列表(藍(lán)色部分)。
注:
1.上述過程中的6、7、8步驟中隱含了一個(gè)過程:判斷用戶是否是公網(wǎng)用戶。
如果是公網(wǎng)用戶,則該用戶的IP地址和提供下載服務(wù)的端口也將記錄在迅雷的資源服務(wù)器中,后續(xù)用戶可以從該用戶處下載;第三節(jié)有這個(gè)過程的說明。
2.迅雷如何區(qū)分不同的文件?很多文件名字不同但是內(nèi)容相同,很多文件名字相同但是內(nèi)容不同。搜索迅雷的相關(guān)信息只是得到了幾句無(wú)關(guān)痛癢的廢話:迅雷還使用了獨(dú)創(chuàng)的文件校驗(yàn)機(jī)制,保證了用戶下載文件的正確性和完整。至于什么方法不得而知
3.我們?nèi)绾尾榭囱咐姿阉鞯降馁Y源列表?
在迅雷搜索到一系列的資源列表并且任務(wù)沒有完成時(shí),會(huì)在相同下載目錄下建立一個(gè)臨時(shí)文件,里面有搜索到的資源信息,其中peer就是搜索到的包含要下載文件的公網(wǎng)用戶。
3 協(xié)議解析
分析第二節(jié)原理圖中的下載過程,第1、2、5步和正常的下載是一模一樣的,我們無(wú)法根本無(wú)法區(qū)分。那好,我們就在3、4、6上做文章。
除了上述用戶下載一個(gè)具體文件的過程的各個(gè)報(bào)文外,還有交換資源信息報(bào)文,用戶和用戶之間的文件塊傳輸報(bào)文、判斷用戶是否是公網(wǎng)用戶的報(bào)文等。
1.資源請(qǐng)求報(bào)文
每次迅雷都會(huì)向219.134.132.47的tcp端口3076發(fā)出資源請(qǐng)求,該地址是寫死在迅雷軟件中的,并非依靠DNS請(qǐng)求得到。
如果該地址不可用,則會(huì)切換到另外兩個(gè)可替換的地址219.134.132.42、219.134.132.86。
Web迅雷則使用219.134.132.46。
過濾掉這個(gè)報(bào)文,那么迅雷客戶端就無(wú)法完成資源請(qǐng)求,無(wú)法從多點(diǎn)下載。用TP過濾掉報(bào)文后迅雷只能從原始連接下載,如下圖:
協(xié)議報(bào)文特征如下:
2.資源搜索回應(yīng)報(bào)文
過濾掉這個(gè)報(bào)文,那么迅雷客戶端就無(wú)法得到資源列表,無(wú)法從多點(diǎn)下載。
協(xié)議報(bào)文特征如下:
3.用戶之間的文件傳輸(握手報(bào)文)
用戶之間是可以傳送文件塊的,下面的報(bào)文就是傳送文件塊開始之前的握手報(bào)文,3077端口為客戶端的監(jiān)聽端口,用來把本地的文件傳輸給別人。(如果3077不能用,會(huì)轉(zhuǎn)到其他端口).
4.用戶之間資源信息交換報(bào)文
5.提交新的資源信息報(bào)文
6.連接NAT測(cè)試服務(wù)器報(bào)文
迅雷每過幾分鐘就會(huì)向statnat1.sandai.net發(fā)送NAT測(cè)試報(bào)文,也就是告訴迅雷的資源服務(wù)器,自己是否是公網(wǎng)IP.該報(bào)文由于無(wú)返回報(bào)文,所以猜想采用的辦法是采用STUN的方法:
將本機(jī)的IP地址放在UDP的payload里,如果迅雷的服務(wù)器收到報(bào)文發(fā)現(xiàn)IP層的源地址和payload里的IP地址一致,那么就是公網(wǎng)地址,否則就是處于防火墻后面或者需要經(jīng)NAT才能上公網(wǎng)。
協(xié)議報(bào)文如下:
注:
sandai.net是xunlei旗下的一個(gè)網(wǎng)站,很少單獨(dú)拋頭露面,多出現(xiàn)在迅雷軟件檢索關(guān)聯(lián)信息、顯示廣告的DNS請(qǐng)求報(bào)文中。
4TP過濾
如果TP武斷的對(duì)迅雷進(jìn)行過濾,只需要設(shè)定一個(gè)traffic management,把目的地址為219.134.132.0/24網(wǎng)段,目的端口為3076的報(bào)文全部過濾就可以防止迅雷下載,但是有可能會(huì)誤報(bào)。下面的規(guī)則更詳細(xì)一點(diǎn),可以減少誤報(bào)。
1.針對(duì)用戶向服務(wù)器資源請(qǐng)求報(bào)文和資源回應(yīng)報(bào)文的過濾
由于迅雷的服務(wù)器IP地址比較容易更換,所以建議過濾的DV:
協(xié)議:tcp
源端口/目的端口:3076
開始的四個(gè)字節(jié):0x29000000
2.針對(duì)用戶之間的資源信息交互報(bào)文的過濾
協(xié)議UDP
端口3076
前四個(gè)字節(jié)0x32000000
3.針對(duì)用戶之間的文件傳輸(握手報(bào)文)的過濾
協(xié)議tcp
源端口或者目的端口可以為3077、3078
前四個(gè)字節(jié)為0x29000000
4.提交新的資源信息的報(bào)文的過濾
協(xié)議TCP
目的端口3076
前四個(gè)字節(jié)0x29000000
5.針對(duì)連接NAT測(cè)試服務(wù)器的報(bào)文的過濾
協(xié)議UDP
目的端口3076
前四個(gè)字節(jié)0x00000101
轉(zhuǎn)載于:https://www.cnblogs.com/erwin/archive/2009/07/24/1529808.html
總結(jié)
以上是生活随笔為你收集整理的[缓存]迅雷下载原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “玩转课堂”基本构想
- 下一篇: Visual Studio Team S