[缓存]迅雷下载原理
來自: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
總結
以上是生活随笔為你收集整理的[缓存]迅雷下载原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “玩转课堂”基本构想
- 下一篇: Visual Studio Team S