以前寫,你看看吧
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
eersld2:ip14:xxx.xxx.xx.xxx7
eer id20:00180531904b7e3abdd74
orti6881eeee
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 正在想.......