開始接觸Kerio Winroute Firewall也是因為BT下載的原因,由於是局內網用戶,白天下載的速度最多不會超過10K,與我最初的期望相去甚遠,終於到了無法忍耐的地步,也就有了對BitTorrent下載深入研究的興趣。
首先說說我的網路拓撲,512K ADSL撥號Modem(電信所說的512K其實與我們理解的不一樣,512K=512Kbps=512K bits/s=64K bytes/s,也即個人用戶所能獨享的最大下載帶寬只有64K/s),代理伺服器Windows 2000 Advanced Server+SP4,使用Kerio Winroute FireWall 6.0代理上網,沒有安裝第三方防火牆和殺毒軟體。區域網路內BT下載客戶端機為Win98。
如果你是外網用戶,那麼BT下載沒有任何問題,基本上不需要做任何的配置就能達到理想的下載效果。怎樣區別局內網和外網,論壇上有很多類似的帖子,在這裡我就不囉嗦了。
很多帖子都提到通過連接阜映射來提速,個人認為完全沒有必要,對於局內網用戶來說是個誤導。這是根據BitTorrent傳輸協定使用Sniffer分析資料包得出來的結論。
BT原理
與其他的P2P軟體相比,BT有個獨特的地方,它存在一個中間的WEB伺服器,就是我們在發怖時所填寫的announce,該伺服器提供了發怖的統一管理。BT 開啟一個 torrent文件後,先要你選項文件儲存哪裡。然後判斷該檔案不存在的話就建立新文件,存在的話就用 Sha1 校驗碼去校驗文件---錯誤的就是還沒下載的,這樣就可以實現續傳了。
現在知道要下載什麼了,到哪裡下載呢?這就要尋找有誰提供上傳了,BT是通過WEB伺服器來實現的,首先BT會通過份析 torrent 來得到發怖網址,從而建立與服務端的連接。
l 外網環境下BT客戶端與WEB伺服器建立TCP連接的程序
Source Address 61.194.98.92 ADSL撥號軟體從ISP處獲得的外網位址
Destiation Address 222.141.64.184 WEB伺服器位址
Source Port 2198
Destiation Port 8000
我們關注的是封裝在TCP畫格中的HTTP傳輸協定部分:
GET /announce?info_hash=%FE%237eND%ED%3B%08%0A%118TH%03%BE%FD%86%E5%D2&peer_id=exbc%005%E1%F3Q%5EQM%B9%FD%5D%0FJ%33C%7B%BD&port=16351&natmapped=1&localip=61.149.98.92&uploaded=68468736&downloaded=52133888&left=411632144&compact=1&no_peer_id=1&event=started HTTP/1.0
Host: btfans.3322.org:8000
btfans.3322.org:8000是發怖伺服器的位址
info_hash 是torrent文件中的 info 部分的Sha校驗碼,WEB通過它在發怖列表找到對應的紀錄
peer_id 是自身的標識,它是12個0和當前時間+全球的唯一標識碼(GUID)的Sha校驗的前八位,共20位
port 你提供上傳的 port,亦即常說的監控連接阜,這裡是16531
IP 你的ip位址,沒有的話伺服器會自己找到,由於是在外網環境,所以IP為ISP提供的位址61.149.98.92(問題的關鍵就在這裡,如果你是局內網用戶,那麼BitTorrent客戶端在此填入的位址即為你的內部分配位址,比如10.10.10.x,這個位址當然是不可路由的,下面我會對局內網環境下TCP建立程序作相應的比較)
uploadED downloadED 你上傳和下載了多少,伺服器可以用它來做流量分析
left 你還要下載多少個字元
event 狀態,告訴伺服器你是準備開始下載,還是停止,還是下載完成了
以上這個操作預設值 5 分鐘做一次,或由伺服器設定
伺服器中有個一個 track 程序來管理這些請求,得到這一串程式碼後就會用 info_hash 來搜尋列表,找到你就可以下載。接著它會反連(NatCheck)你的 IP 和 Port來判斷你是局內網用戶還是公共外網用戶(象10.10.10.x這樣的位址,它是連不通的,這就是我說的為什麼局內網用戶做不做連接阜映射其實無所謂)。接下來伺服器返回現在正在下載這個文件的所有公共外網用戶的IP和port
從上圖可以看出服務端返回了一個公共外網用戶的IP和Port列表
HTTP: 6: d10:done peersi34e8:intervali1800e13:num completedi287e9:num peersi59e5
eersld2:ip14:218.184.78.2317
eer id20:exbc
HTTP: porti6881eed2:ip14:218.81.227.1217
eer id20:exbc
HTTP: 7: 4
orti15949eed2:ip13:61.64.155.1647
eer id20:exbc
HTTP: 8: ? 4
orti10502eed2:ip14:219.197.64.2327
eer id20:exbc 欿
HTTP: ??
orti19856eed2:ip12:61.62.11.1557
eer id20:exbc 蘸鉐
HTTP: ?S_4
orti21213eed2:ip13:210.68.150.147
eer id20:exbc
HTTP: :@?
orti14373eed2:ip14:218.197.203.367
eer id20:exbc
HTTP: '拻\%_4
orti13425eed2:ip11:219.95.7.177
eer id20:exbc
HTTP: >-O+d4
orti14673eed2:ip12:81.156.58.177
eer id20:exbc
HTTP: 緗_ ?
orti15498eed2:ip14:218.79.175.1637
eer id20:exbc
HTTP: +t4
orti25868eed2:ip13:218.23.104.467
eer id20:exbc 蚋札
HTTP: 搷__K??
orti26102eed2:ip14:222.83.221.2547
eer id20:exbc
HTTP: {??華4
orti17104eed2:ip14:218.81.227.1217
eer id20:exbc
HTTP: 9: 4
orti15949eed2:ip12:218.80.9.2467
eer id20:exbc
HTTP: ?4
orti11458eed2:ip13:220.173.6.2407
eer id20:exbc
HTTP: U o4
orti9711eed2:ip15:219.148.178.2147
eer id20:exbc 櫓
HTTP: _鞖g4
orti13128eed2:ip13:138.88.221.197
eer id20:exbc
HTTP: ?g?
orti15492eed2:ip11:219.95.7.177
eer id20:exbc
HTTP: _?
orti19753eed2:ip12:61.150.43.307
eer id20:exbc
HTTP:
象d10:done peersi34e8:intervali1800e13:num completedi287e9:num peersi59e5
eersld2:ip14:218.184.78.2317
eer id20:exbc
這裡Tracker的回應資訊以一種簡單高效可增強的格式(Bencoding,B編碼格式)傳送。
B編碼的規則如下:
·字元串表示為前綴十進制的字元串長度加冒號再跟原字元串。
如4:spam就相當於'spam'。
·整型資料的表示是前面加'i'後面加'e'中間是十進制數,如i3e就相當於3,i-3e就是-3。整型資料沒有長度限制。i-0e無效,所有以'i0'開頭的除了代表0的i0e,其它都無效。
·列表編碼為一個'l'開頭,後面跟它所包含的項目(已經被編碼過)最後加一個'e',比如 l4:spam4:eggse 就等於 ['spam', 'eggs'] 。
·字典編碼為一個'd'開頭,後面是關鍵值(key)及其對應值輪流出現,最後加一個'e'。
如:d3:cow3:moo4:spam4:eggse 相當於 {'cow': 'moo', 'spam': 'eggs'}
d4:spaml1:a1:bee 相當於 {'spam': ['a', 'b']}
關鍵值必須是處理過的字元串(用原始字元串編碼的,而不是數位字母混合編碼的)。
interval 1800 是告訴 BT 隔多少秒來查詢一次seed和peer這裡是 30 分鐘,如果你是公共外網用戶它會把你提交的 IP 和 Port 放到info_hash 對應的列表中,這樣其它人就可以找到你。
同樣我們可以注意到,公共外網用戶的監聽Port都是隨機選項產生的,換句話來說,監聽連接阜只是為了方便別人找到你。對於局內網用戶來說,即便你在網路閘道上做了監聽連接阜的映射,但是由於在與Tracer通訊的資料包中填入的是你的私有位址,Tracer就不會把你的IP和Port放入列表。因此你只能主動發起對列表中公共外網用戶的連接,而沒有遠端端能找到你。
局內網環境下客戶端與服務端的TCP通信
前面說過,局內網環境下,客戶端與WEB伺服器通信程序唯一不同的地方就在於填入的IP位址是本身的私有位址
GET /announce?info_hash=%FE%237eND%ED%3B%08%0A%118TH%03%BE%FD%86%E5%D2&peer_id=exbc%005%C8%8DqnvF%BFj%E4%12P%9E%D1%FC&port=15600&natmapped=1&localip=10.10.10.8&uploaded=299663360&downloaded=188547600&left=275317264&compact=1&no_peer_id=1&event=started
Host: btfans.3322.org:8000
綜上所述,在局內網環境下即便進行了連接阜映射,也因為Tracer不會把你提交的私有位址和連接阜放入info_hash列表中而導致沒有遠端端能主動發起與你監控連接阜的連接,所以下載的速度不會有根本的改善。除非你能強制客戶端程序把你共享上網的IP提交給Tracer伺服器作為你的綁定位址。
比特精靈就正好有此項功能,同時它還能提供所有Windows平台UPnP連接阜映射功能,包括Win98、Me、XP,但是2000並不支持UPNP,彌補這一缺陷的辦法是在Windows 2000代理伺服器上安裝Winroute Firewall。不需要做任何的連接阜映射,啟用它的UpnP即可。
接下來,在局內網客戶端機安裝BitSpirit,官方下載位址
搜尋成功後會產生提示
最關鍵的一步:
選項->個人設定->進階,在「強制指定IP」一欄前打勾,填入代理伺服器撥號上網後ISP分配的公共外網位址
這樣設定就行了,讓我們來做一下驗證,檢視BitSpirit的網路狀態日誌:
2004-06-22 20:06:11; 正在檢查Torrent文件...;
2004-06-22 20:06:11; 從Tracker伺服器獲取種子資訊 ...;
2004-06-2220:06:11;正在連接伺服器:
[img]http://btbtbt.vicp.net:8000/announce?info_hash=%c9%c7%af%3a%27%3bvN%3e%b0kK7%a1%ff%fc%16%2b%c7%cd&peer_id=%00%02BS%5f%da5%c0A%7d%5fVY%9e%8e%89b%9e%94O&port=20272&ip=61.149.98.129&uploaded=0&downloaded=0&left=614727680&event=started;
這樣一來,Tracer就把你當成了公共外網用戶,並把你的IP和Port放入hash_info列表當中,讓其它的BT下載也能找到你,既有本機連接,又有遠端端發起的主動連接,從而把局內網下載速度提高到極限。
如圖,平均下來也有60多K的下載速度,這已經是512K ADSL所能達到的極限下載速度了。
通過以上分析,希望你能對BitTorrent下載能有更深的認識,而不是在連接阜映射上做文章,那樣治標不治本。讓我們開始愉快的BT之旅吧!
作者:紫川楓