1. 程式人生 > >BT 執行及內網穿透原理

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/announc...2&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/so...1/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 正在想.......