详解P2P技术
P2P = Peer to Peer
現(xiàn)在P2P也有很多不同架構,以下是常見的一些P2P架構
純P2P架構
- 沒有總是在線的服務器
- 任意端系統(tǒng)之間直接通信
- 對等方之間可以間斷連接并可 以改變IP地址
例子:
-
文件分發(fā)
-
流媒體
-
VoIP
復雜應用純P2P無法實現(xiàn)
P2P: 集中式目錄
Napster公司首先設計,由中央集中服務器管理
- 當對等方啟動時,它通知目錄 服務器以下信息
-
IP地址
-
可供共享的對象名稱
- Alice查詢文件“Hey Jude” 3) Alice 向Bob請求文件
通過架構我們可以看到一些問題
集中式目錄問題
- 單點故障
- 性能瓶頸
- 侵犯版權
文件傳輸是分散的, 但是定位內容的過 程是高度集中的
Gnutella(使用洪泛法查詢)
類似于廣播,范圍有限,發(fā)出請求后,能響應的服務器回應
-
全分布
-
沒有集中式服務器
-
公共域協(xié)議
-
許多Gnutella客戶機實現(xiàn)Gnutella協(xié)議
覆蓋網(wǎng)絡:
-
如果對等方X和Y維護了一條TCP連接,則說X和Y之間有一條邊
-
所有活躍的對等方和邊組成覆蓋網(wǎng)絡
-
邊不是物理通信鏈路
-
給定對等方連接的覆蓋網(wǎng)絡路徑中的節(jié)點少于10個,即TTL小于10
查詢報文在已有的TCP連接上發(fā)送
對等方轉發(fā)報文
QueryHit 報文按反向路徑傳送
Gnutella: 加入對等方
-
加入對等方X必須發(fā)現(xiàn)在Gnutella網(wǎng)絡中的其他對等方:使用對等方列表 。
-
X試圖與該列表上的對等方建立一條TCP連接,直到與Y創(chuàng)建一條連接。
-
向Y發(fā)送一個Ping報文;Y轉發(fā)該Ping報文。
-
所有的對等方接收Ping報文并響應一個Pong報 文。
-
X接收到許多Pong報文。然后能同某些其他對等 方建立TCP連接。
Gnutella: 對等方離開
-
主動離開:離開接點的所有對等方都會刷新自身 的激活對等方列表,并開始與列表中的新的對等 方建立連接
-
斷網(wǎng):發(fā)送信息的時候對等方?jīng)]有響應,則表明對 等方離開,節(jié)點刷新自身的激活對等方列表,并開 始與列表中的新的對等方建立連接
KaZaA
純P2P的改進,超級節(jié)點技術
-
每個對等方要不被指派 為組長,要不被指派給一個組長
-
對等方和組長之間建立 TCP連接
-
組長之間建立TCP連接
-
-
組長維護它的子對等方 共享的內容
過程:
- 每個文件有文件的散列碼標識
- 客戶機送向組長發(fā)送關鍵詞的查詢
- 組長響應匹配
- 逐項匹配:
- 元數(shù)據(jù)
- 散列值
- IP地址
- 如果組長轉發(fā)查詢給其他組長則其他組長響應匹 配
- 客戶端選擇要下載的文件
特點:
-
請求排隊:限制對等方并行上載數(shù)量,新的請求進行排隊。
-
激勵優(yōu)先權:根據(jù)不同的上載下載比例優(yōu)先服務貢獻大者。
-
并行下載:將一個文件分成若干段,從多個對等方并行下載。
P2P文件分發(fā):BitTorrent
-
BitTorrent是一種用于文件分發(fā)的流行P2P協(xié)議。
-
參與一個特定文件分發(fā)的所有對等方的集合被稱為一個洪流 (torrent)。
-
一個洪流中的對等方彼此下載等長度的文件塊(chunk),典型 塊長度為256KB。
追蹤器tracker服務器
P2P文件分發(fā)流程
- 對等方加入 torrent:
- 沒有文件塊,但會隨著時間流逝從其它對等方處累積文件 塊
- 在tracker處注冊,取得對等方列表,連到所有對等方的 一個子集(鄰居)
- 在下載的同時給其它對等方上傳文件塊
- 對等方可能改變和其交換文件塊的對象
- 對等方會不斷進入或者離開
- 一旦某對等方下載完了整個文件,它可以離開(自 私)或者繼續(xù)留在torrent系統(tǒng)里(無私)
BitTorrent:請求、發(fā)送
請求文件塊
-
在任何給定的時刻,不同的對等方擁有不同的文件塊子集
-
每個對等方會周期性的詢 問其它每個它連接的對等方當前所擁有的文件塊列 表
-
對等方將請求下載最稀缺的文件塊
**發(fā)送文件塊: tit-for-**tat(一報還一報)
-
Alice發(fā)送文件塊的對象是 所有鄰居中向自己發(fā)送速率 最快的4個
-
其它鄰居被阻塞
-
每10秒重新計算速率
-
-
每30秒,隨機選擇一個其 他鄰居,發(fā)送文件塊
DHT(分布式Hash表)
DHT: 一個分布式的P2P數(shù)據(jù)庫
- 數(shù)據(jù)庫由許多(key,value)((鍵, 值)) 對構成。例如:
- key: 社保號; value: 人名
- key: 電影名稱; value: IP地址
- 所有(key, value) 對被分發(fā)到成千上萬的對等方用戶群中
- 一個對等方利用key來查詢DHT
- DHT返回與之匹配的value
- 對等方還可以插入(key, value)對
怎樣把鍵值分配給對等方?
核心問題:
- 分配 (key, value) 對給各對等方
基本思想:
- 把每個key轉化成一個整數(shù)
- 給每個對等方分配一個整數(shù)標識符
- 把 (key,value) 對分配給標識符離key最近的 那個對等方
DHT 標識符
- 給每個對等方分配一個[0,2n-1]之間的整數(shù)標識符,n為某給定值.
- 每個標識符由 n 比特構成.
- 需要每個key也在同樣的范圍內
- 為得到整數(shù)key,將原key做hash
- 例如*,* key = hash(“Led Zeppelin IV”)
- 這就是為什么叫做分布式hash表的原因
將key分配給對等方
規(guī)則:把key分配給具有最鄰近ID的對等方.
- 為方便起見: 最臨近被定義為該key的直接后繼 (immediate successor )
- 例如:
- n=4; peers: 1,3,4,5,8,10,12,14;
- key = 13, then successor peer = 14
- key = 15, then successor peer = 1
環(huán)形DHT
-
每個對等方僅和其直接后繼和直接前任( predecessor)聯(lián)系.
-
“覆蓋網(wǎng)絡”
當有N個對等方時,為找 到負責的鍵,發(fā)送消息數(shù) 量的負責度是O(N)
帶捷徑的環(huán)形DHT
-
每個對等方知曉直接前任、后繼以及捷徑方的IP
-
本例中,將消息數(shù)從6減至2
-
DHT可以設計為每個對等方的鄰居和每個請求的報文數(shù)均為O(log N)
對等方擾動
- 對等方可能進入或者離去
- 對等方需要知曉它后面兩個后繼的地址
- 每個對等方周期性的ping這兩個后繼以 檢查它們的存活性
- 如果直接后繼離開了,則選擇它的下一 個后繼作為直接后繼
例如: peer 5離開
- peer 4檢測到5的離開,將8當作其直接后繼,并且問 8它的直接后繼是誰(10),然后將10當作其第二后繼。
- 如果編號為13的peer要加入怎么辦? 后續(xù)還有很多問題,篇幅有限,感興趣可以下來了解。
希望你能通過這篇文章了解到現(xiàn)在網(wǎng)絡上常見的幾個P2P的模式。
總結
- 上一篇: 16 bit float 存储_面试官问
- 下一篇: python无师自通配套资源_Pytho