请教:BT下载软件的工作原理,100分(100分)

  • 主题发起人 主题发起人 yyj111
  • 开始时间 开始时间
Y

yyj111

Unregistered / Unconfirmed
GUEST, unregistred user!
BT 是一个 free 的下载工具,用类似 eDonkey 的方式,不象 FTP 或者 P2P 软件(IRC/PP/WinMX)那样只有一个发送源,而是所有正在抓某个文件或者已经抓好了某个文件但还没有把下载窗口关闭的人都是发送源。
 
就我的理解,其工作原理大致如下
根据torrent文件得到文件所在的服务器,这一步应该和我们一般的下载过程没什么区别
同时连接BT服务器,获取正在下载此文件的所有机器列表及下载情况,检查这些机器列表,如果有机器下载的内容比本机下载的内容更多,则向其发出数据请求,这一点和我们普通下载所说的镜象文件有一些类似,不过通常所说的镜象文件是指存在于某一服务器的完整文件,而这里的"镜象"则是指所有正在下载同一文件的所有机器,可能对方也没有完全下载完,但只有对方下载的数据比自己多,就可以作为"镜象",同样的,本机也可以作为别人的"镜象"。。。
描述的不是很清楚,大概就是这个意思吧[:)]
 
BT首先在上传者端把一个文件分成了Z个部分,甲在服务器随机下载了第N各部分,乙在服务器随机下载了第M个部分,这样甲的BT就会根据情况到乙的电脑上去拿乙已经下载好的M部分,乙的BT就会根据情况去到甲的电脑上去拿甲已经下载好的N部分,这样就不但减轻了服务器端得负荷,也加快了用户方(甲乙)的下载速度,效率也提高了,更同样减少了地域之间的限制。比如说丙要连到服务器去下载的话可能才几K,但是要是到甲和乙的电脑上去拿就快得多了。所以说用的人越多,下载的人越多,大家也就越快,BT的优越性就在这里。而且,在你下载的同时,你也在上传(别人从你的电脑上拿那个文件的某个部分),所以说在享受别人提供的下载的同时,你也在贡献。
 
楼上的,那我想问一声,甲乙双方那怎样判断双方的地址呢??
 
本期<<程序员>>杂志上有,是有服务器的,象qq一样。
 
独钓寒江
说的对
 
2者结合就差不多了。
www.3men.org这个论坛不错。
去看看吧~~~`
 
所有正在下载的机器的地址、速度、当前下载状态都在Tracking服务器上动态可查,下载客户端根据Tracking服务器的数据安排下载策略。
 
以前寫,你看看吧

BT運行原理分析及內網提速方法

由於內網用戶無法提供一個對外的端口,所以無法做服務器.但用BT的時候,發現它可以讓內網用戶做 Send,作為程序員就忍不住下載了它的源代碼分析了一把(為了看它,還專門去寫了一下Python:})

比起其他的P2P軟件,BT有個獨特的地方,它存在一個中間的WEB服務器,就是我們在發布的時所填寫的announce.該服務器提供了發布的統一管理,不像其他P2P軟件那樣到處去找哪些非常不穩定的個人服務器,相對起來讓人安心的多.
該WEB服務器更大的作用是內網用戶可以做 Send(下面會說明原理),這是其他軟件無法做到的,但不好的地方是announce當機的時候就無法下載了,要知道P2P下載關鍵是要人氣要高,announce停一下就搞到人氣全沒有了

.torrent 的作用
大家都知道我們要用BT下載 ,就要先下載一個.torrent文件,這個文件到底有甚麼呢:
首先是 announce 紀錄了發布服務器的位置,讓BT知道是那個WEB服務器發布的
然後是一些文件信息,文件名,目錄名,長度等等
最後是片段長度,和片段的 Sha1 校驗碼
(BT為了事現續傳和文件校驗,就把文件分成若干個片段)
大家可以用寫字板打看torrent文件看看,就是知道個大概,後面的亂碼是片段 Sha1 校驗碼

開始-續傳的實現 sha校驗

BT 打開一個 torrent文件後,先要你選擇文件保存那裡.然後判斷文件不存在的話就建立新文件,存在的話就用 Sha1 校驗碼去校驗文件---錯誤的就是還沒下載的,這樣就可以實現續傳了,但128位校驗,想不慢都不行 :(

得到 peer

現在知道要下載甚麼了,到那裡下載呢?這就要尋找有誰提供上傳了,這里BT是通過WEB服務器來實現的,首先BT會通過分析 torrent 來得到一面一串網址

http://btfans.3322.org:6969/announce?info_hash=%CDg%D4%19%AD%96%9D%93%03%DB%E4%FFXA%C6%5D%043%17O&peer_id=%00%00%00%00%00%00%00%00%00%00%00%00%A3E%E0%9BeB%90d&port=6882&uploaded=0&downloaded=0&left=19171922&event=started

http://btfans.3322.org:6969/announce 是發布服務器的地址
info_hash 是torrent文件中的 info 部分的Sha校驗碼,WEB通過它在發布列表找到對應的紀錄,
peer_id 是自身的標識,它是12個0和當前時間+全球的唯一標識碼(GUID)的Sha校驗的前八位,共20位
port 你提供上傳的 port
IP 你的ip地址,沒有的話服務器會自己找到
uploaded downloaded 你上傳和下載了多少,服務器可以用它來做流量分析
left 你還要下載多少個字節
event 狀態,告訴服務器你是準備開始下載,還是停止,還是下載完成了
以上這個操作默認 5 分鐘做一次,或由服務器設定


服務器會做甚麼

服務器中有個一個 track 程序來管理這些請求
得到這一串代碼後就會用 info_hash 來查找列表,找到你就可以下載,找不到就對不起啦
接著它會反連(NatCheck)你的 IP 和 Port這樣就可以知道你是內網用戶還是共網用戶(如果你是內網用戶,它是連不通的,因為它會連到你的服務器上,你的服務器當然沒有這個端口啦)
然後服務器返回現在正在下載這個文件的所有公網用戶的IP和port,就像是這樣
d8:intervali1800e5:peersld2:ip14:xxx.xxx.xx.xxx7:peer id20:00180531904b7e3abdd74:porti6881eeee
interval 1800 是告訴 BT 隔多少秒來查詢一次這裡是 30 分鐘 (有點過分了:))
最後如果你是公網用戶它會把你提交的 IP 和 Port 放到info_hash 對應的列表中,這樣其他人就
可以找到你

下載
得到這些 peer IP後,BT就可以找到對應的IP下載了
Bt會到所有的peer去尋找自己要下載的東西,不是一定要到seed下載.
Bt每找到一個peer就和建立一個Socket來下載,所以下載的人越多,速度就越快.


內網用戶可以做Send的原理


上面說到服務器只會返回公網的ip的,那內網用戶怎麼可以做Send呢,這是因為BT是一個主動連接的軟件(即使你已經下載完了,也不也會主動連接他人)
下面是一個模擬流程:

1 內網用戶開始做 seed,
2 服務器收到請求,由於是第一個所以也沒有peer返回
3 公網用戶提交請求,由於seed是內網用戶所以也沒有peer返回,等待下載,但服務器會把它的IP放到列表中
4 內網經過 interval 時間間隔後,再向服務器放出請求,得到上面得公網IP
5 得到公網IP後,內網馬上進行連接
6 公網用戶建立連接,數據開始傳輸 (注意現在是公網用戶做服務器,內網用戶做客戶端,是不是有點怪)
7 其他內網用戶去上面公網用戶下載數據

所以,內網用戶做 seed 一定要有公網用戶得參與,否則其他內網用戶無法下載.如果全部是內網用戶,那個所有連接都不會成立,當然這是比較極端的情況.
以上可見,內網用戶不能和內網用戶連接,其他用戶無法從服務器查到你,所以無法主動連接你,你只能每隔30分鐘從服務器找到公網用戶一個個進行連接.
由於中國很多用戶的是內網用戶(我從服務器上查回來的peer還沒試過超過10個的),所以內網用戶用BT的確要比公網用戶要慢很多.於是有了下面的

內網提速大法

了解了原理我們就有解決的方法,不就是外面的人找不到我們嗎,讓他們找到不就行了
終極武器 NAT --端口映射(又叫網絡地址翻譯) 其原理這裡就不說了(其實也不是很復雜), 其作用是讓服務器把指定端口的請求轉發到指定的IP上,讓其他的機器來響應這些請求,而內網向外網發送的時候不再是像其他網關服務那樣隨機分配端口,而是用上面指定的端口

可以用的軟件有
WinRoute Pro
PortTunnel
軟件下載和使用方法見 http://www.pconline.com.cn/pcedu/soft/lan/jywgl/10301/127157_2.html

但如果你的服務器是 win2000,並用自帶的網絡共享功能,那麼有更簡單的方法
在你共享的連接上按右鍵 ->屬性
到公用設定板按下面的設定按鈕,系統會彈出設置窗口
到服務板,按新增
名稱 隨便填
端口 6881
勾選TCP
私人網絡中的電腦名稱或ip 填你的本機ip
然後保存,再按同樣的方法增加 6882-6889端口的映射,把它們通通指向你的電腦
(因為我的系統是繁體系統,所以以上的名稱不一定和你的相同)
不明白的可以看看WIn2000幫助系統中有關 NAT的說明

用了端口映射後,只有你一個人爽,其他人還是老樣子(包括服務器) ,不過你可以搞一台BT下載專用機:)
現在享受以下速度的快感吧

BT的缺點:
1 用Python編寫,須然可以跨平台,但再Windows下耗資源比較多,特別是服務器應該考慮用C重寫 track www.torrentse.cx好像已經這樣做(其返回得東西和標準的不大一樣),但是不是重寫不得而知.

2 track 碰到內網Seed的時候,應該把 interval 設小一點
3 正在想.......
 
多人接受答案了。
 
后退
顶部