zoukankan      html  css  js  c++  java
  • BT原理分析

    BT全名為BitTorrent,是一個p2p軟件,你在下載download的同時,也在為其他用戶提供上傳upload,因為大家是「互相幫助」,所以不會隨著用戶數的增加而降低下載速度。 

    其實跟ED也十分相似,ED跟BT不同的地方有: 
      ED--要連上一個固定server BT--沒有固定server,只要分享者製作出該分享檔案的.torrent檔公佈出來便可 
      ED--分享的人越多速度越快? BT--種子seed越多速度越快 
      ED--世界性的分享 BT--團體性的分享(可做到速度保證) 
      ED--知道在分享者的user name &速度 BT--沒顯示使用者/分享者名字 
      
    比起其它的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/anno ... 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:intervali1800e5eersld2:ip14:xxx.xxx.xx.xxx7eerid20:00180531904b7e3abdd74orti6881eeee 
    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的確要比公網用戶要慢很多。 
    BT全名為BitTorrent,是一個p2p軟件,你在下載download的同時,也在為其他用戶提供上傳upload,因為大家是「互相幫助」,所以不會隨著用戶數的增加而降低下載速度。

  • 相关阅读:
    ztree
    SAMEORIGIN
    Unity shader学习之折射
    Unity shader学习之反射
    Unity shader学习之标准的Unity shader
    Unity shader学习之Alpha Test的阴影
    Unity shader学习之阴影,衰减统一处理
    Unity shader学习之阴影
    Unity shader学习之Forward Rendering Path
    AsyncClientUtils
  • 原文地址:https://www.cnblogs.com/wpjamer/p/4531335.html
Copyright © 2011-2022 走看看