P2P網(wǎng)絡雜燴

P2P網(wǎng)絡是什么

P2P是指位于同一網(wǎng)絡中的每臺計算機都彼此平等,身份對等,各個節(jié)點共同提供網(wǎng)絡服務,不存在任何“特殊”節(jié)點。網(wǎng)絡節(jié)點以“扁平”的拓撲結構相互連通。 網(wǎng)絡中不存在任何服務器端、中央化的服務、以及層級結構。點對點網(wǎng)絡中的節(jié)點同時提供和消費服務,互惠互利。點對點網(wǎng)絡也因此具有可靠性、去中心化,以及開放性。

早期的互聯(lián)網(wǎng)就是點對點網(wǎng)絡架構的一個典型用例:IP網(wǎng)絡中的各個節(jié)點完全平等。當今的互聯(lián)網(wǎng)架構具有分層架構,但是IP協(xié)議仍然保留了扁平拓撲的結構。

先問幾個問題

  1. IP協(xié)議解決了什么問題?其他網(wǎng)絡協(xié)議呢?
  2. 計算機如何發(fā)現(xiàn)對方?數(shù)據(jù)如何傳輸?shù)竭h程計算機?

P2P的例子

  1. Skype
  2. BitTorrent
  3. Gnutella
  4. VoIP
  5. Spotify
  6. SMTP(server - server)
  7. WebRTC
  8. Blockchain

現(xiàn)有的網(wǎng)絡

網(wǎng)絡
  1. IP 有限
  2. 大量的局域網(wǎng)IP

問題:咱們國內(nèi)的網(wǎng)到底是個局域網(wǎng)還是廣域網(wǎng)

P2P 的技術難點

  1. Discovery - Registration
  2. NAT Traversal
  3. Firewalls
  4. Asymmetrical bandwidth
  5. Security
  6. Optimization
p2p模型

P2P網(wǎng)絡的數(shù)據(jù)流動

//udp
sendto(ip,port,buffer);
//tcp
send(fd,buffer,length,0)
去中心化網(wǎng)絡

上面的紅色箭頭是P2P真實的數(shù)據(jù)流動,那么數(shù)據(jù)怎么發(fā)送到客戶端B的呢?

說下鏈路層地址與IP地址。許多鏈路層協(xié)議也有自己的地址,一般是MAC地址,比如最常用的以太網(wǎng)。鏈路層地址在鏈路層協(xié)議中使用,表明這個鏈路層報文會被發(fā)給誰;而IP地址在IP層協(xié)議中使用,表明這個報文最終要發(fā)給誰。可以分為兩種情況:

  1. 直接通過鏈路層發(fā)送:
    鏈路層地址: (源MAC地址) (目的MAC地址)
    IP地址: (源IP地址) (目的IP地址)
  2. 經(jīng)過網(wǎng)關轉(zhuǎn)發(fā)
    從本機出發(fā)發(fā)往網(wǎng)關時,鏈路層的目的是網(wǎng)關而IP層的目的不是網(wǎng)關:
    鏈路層地址: (本機源MAC地址) (網(wǎng)關MAC地址)
    IP地址: (本機IP地址) (目的IP地址)
    網(wǎng)關轉(zhuǎn)發(fā)到其他網(wǎng)關:
    鏈路層地址: (網(wǎng)關MAC地址) (下一跳網(wǎng)關MAC地址)
    IP地址: (本機IP地址) (目的IP地址)
    最后一個網(wǎng)關轉(zhuǎn)發(fā)到目標:
    鏈路層地址: (最后一個網(wǎng)關MAC地址) (目的MAC地址)
    IP地址: (本機IP地址) (目的IP地址)
    在轉(zhuǎn)發(fā)過程中,IP報文的源和目的保持不變,鏈路層地址則只和這一跳的雙方有關,甚至如果中間經(jīng)過了不一樣的鏈路層,還會更換二層數(shù)據(jù)包的格式。

NAT (Network Address Translation) 穿透

我們知道了網(wǎng)關(路由器)可以幫助我們轉(zhuǎn)發(fā)數(shù)據(jù),那么剩下的就是找到對方IP地址。這就涉及到NAT穿透。

NAT

完全錐形:不攔截
IP限制錐形NAT:限制特定IP
端口限制錐形NAT:限制IP加端口
對稱NAT:網(wǎng)關給不同端發(fā)送數(shù)據(jù)分配不同的ip和端口

問題:

  1. 如何判斷客戶端網(wǎng)關的NAT類型
  2. 如果對所有的網(wǎng)關NAT穿透
  3. 如何測試客戶端數(shù)量
  4. 有沒有穿透不了的情況?

網(wǎng)絡拓撲

最早的BitTorrent 網(wǎng)絡,需要一個中心服務器也就是種子服務器,來幫助各個 Peers 節(jié)點找到彼此進行文件下載


tracker
trackerless

DHT

在 P2P(peer-to-peer) 網(wǎng)絡中,節(jié)點的相互發(fā)現(xiàn)及網(wǎng)絡成型的過程會面臨一些問題。
早年間的 P2P 文件共享技術,比如 Napster,使用單個服務器共享信息,信息中記錄誰擁有什么文件。某個節(jié)點向中心服務器發(fā)起連接并提交記錄自己所擁有文件的列表。另一個節(jié)點之后向同一個中心服務器發(fā)起連接,尋找自己所需文件的存儲節(jié)點,然后和找到的節(jié)點建立聯(lián)系。然而這是一個有缺陷的系統(tǒng) —— 系統(tǒng)很容易遭受攻擊,而且中心化服務器節(jié)點可能會吃官司。(譯者注:單個服務器上存儲文件內(nèi)容和節(jié)點的對應關系,如果提供了一些受版權保護內(nèi)容的鏈接關系,那么這個中心化服務器的提供者將直接受到原版權方的法律追責)
因此,點對點網(wǎng)絡亟需另一種解決方案。研究者們經(jīng)過數(shù)年研究和實驗,提出了分布式哈希表(DHT)。

Kademlia 是 Petar Maymounkov 和 David Mazières 于 2002 年發(fā)明的 DHT 協(xié)議。我覺得這個協(xié)議可能是最流行,而且使用最廣泛的 DHT 協(xié)議

Kademlia 使用 XOR(異或操作符) 作為距離函數(shù)。XOR 函數(shù)的特點在于,只有當輸入不同時,輸出才為 true。下面是用二進制標識符表示的例子。

XOR 10011001 00110010 -------- 10101011
上面的這個例子是說,十進制數(shù)字 153 和 50 之間的距離是 171。

基本算法

Kademlia 是分布式散列表(DHT,Distributed Hash Table)的一種,類似的還有 Chord,Pastry 等。DHT 技術是去中心化 P2P 網(wǎng)絡中最核心的一種路由尋址技術,可以在無中心服務器(trackerless)的情況下,在網(wǎng)絡中快速找到目標節(jié)點。

https://zhuanlan.zhihu.com/p/40286711

假設現(xiàn)在的當前節(jié)點是 001,它想要查的目標節(jié)點是 101 節(jié)點。


查找

我們可以看到,整個檢索過程是不斷收斂的,查詢復雜度是可以證明是 Log N

BTC節(jié)點類型及角色

管比特幣點對點網(wǎng)絡中的各個節(jié)點地位對等,但是根據(jù)所提供的功能不同,各節(jié)點可能具有不同的角色。比特幣節(jié)點是路由、區(qū)塊鏈數(shù)據(jù)庫、挖礦、錢包服務這些功能的集合。全節(jié)點(full node)包括如下圖所示的四個功能(錢包,礦工,完整的區(qū)塊鏈數(shù)據(jù)庫和網(wǎng)絡路由的比特幣網(wǎng)絡節(jié)點):

角色

下圖描述了擴展比特幣網(wǎng)絡中多種類型的節(jié)點、網(wǎng)關服務器、邊緣路由器、錢包客戶端以及它們相互連接所需的各類協(xié)議。z


image.png

礦工網(wǎng)絡分成礦機、礦池、錢包等幾個主要部分,有時礦池軟件與錢包安裝在一起,可合稱為礦池。

礦機與礦池軟件之間的通訊協(xié)議是stratum,而礦池軟件與錢包之間的通訊是bitcoinrpc接口

比特幣傳輸網(wǎng)絡

雖然比特幣點對點網(wǎng)絡服務于各種各樣類型節(jié)點的一般需求,但是對于比特幣挖礦節(jié)點的特殊需求,它的網(wǎng)絡延遲就顯得太高了。

比特幣礦工參與的是時效性很強的競爭,以解決工作證明問題,延長區(qū)塊鏈。在參與這項競爭的同時,比特幣礦工必須盡可能縮短從傳播一個獲勝區(qū)塊到開始下一輪競爭之間的時間。挖礦中,網(wǎng)絡延遲與利潤率直接相關。

傳輸網(wǎng)絡不是替代比特幣的點對點網(wǎng)絡。相反,它們是重疊網(wǎng)絡,在具有特殊需求的節(jié)點之間提供額外的連接,就像高速公路不能替代鄉(xiāng)村道路,而是交通繁忙的兩點之間的捷徑,仍然需要通過小路連接高速公路。

Matt Corallo創(chuàng)建的Fast Internet Bitcoin Relay Engine 或者 FIBRE。 FIBER是一種基于UDP的傳輸網(wǎng)絡,可以節(jié)點網(wǎng)絡內(nèi)傳輸區(qū)塊。 FIBRE實現(xiàn)了壓縮區(qū)塊優(yōu)化,以進一步減少數(shù)據(jù)傳輸量和網(wǎng)絡延遲。

康奈爾大學研究的另一個傳輸網(wǎng)絡(仍在提案階段)是 Falcon。 Falcon使用“直通路由”而不是“存儲轉(zhuǎn)發(fā)”來減少延遲,方法是在接收到區(qū)塊時就開始部分傳輸,而不是等到接收到完整的區(qū)塊。

網(wǎng)絡發(fā)現(xiàn)

當新的網(wǎng)絡節(jié)點啟動后,它必須發(fā)現(xiàn)網(wǎng)絡中的其他比特幣節(jié)點才能參與。要啟動這個過程,新節(jié)點必須在網(wǎng)絡上發(fā)現(xiàn)至少一個現(xiàn)有節(jié)點并連接到該節(jié)點。其他節(jié)點的地理位置在哪兒都沒有關系,比特幣網(wǎng)絡拓撲結構沒有地理位置的定義。因此,可以隨機選擇任何現(xiàn)有的比特幣節(jié)點。

為了連接到一個已知的對等點,節(jié)點會建立一個TCP連接,通常連接到端口8333(通常被稱為比特幣使用的端口),或者如果指定了另一個端口,則連接到另一個端口。

新節(jié)點如何找到對等節(jié)點? 第一種方法是使用一些“DNS種子”來查詢DNS,DNS種子就是提供比特幣節(jié)點IP地址列表的DNS服務器。 其中一些DNS種子提供了穩(wěn)定的比特幣偵聽節(jié)點的IP地址靜態(tài)列表。 一些DNS種子是BIND(Berkeley Internet Name Daemon)的自定義實現(xiàn),它從爬蟲程序或長時間運行的比特幣節(jié)點收集的比特幣節(jié)點地址列表中返回一個隨機子集。 Bitcoin Core客戶端包含五種不同DNS種子的名稱。 不同DNS種子的所有權的多樣性和實現(xiàn)的多樣性為初始引導過程提供了高水平的可靠性。

或者,一個剛剛啟動的節(jié)點,對網(wǎng)絡一無所知,必須被賦予至少一個比特幣節(jié)點的IP地址,之后才可以通過進一步的引見建立連接。 在使用初始種子節(jié)點完成引見后,客戶端將斷開連接并使用新發(fā)現(xiàn)的對等節(jié)點。

建立連接
地址傳播和發(fā)現(xiàn)
交換庫存

總結

  1. 先說明了IP協(xié)議本身就是去中心化和扁平的,P2P是最天然的基于IP協(xié)議的傳輸方式。
  2. 由于IP是有限的,我們利用網(wǎng)關組件了局域網(wǎng)。
  3. 局域網(wǎng)通過網(wǎng)關發(fā)送數(shù)據(jù)到目標IP,這時候我們?nèi)绻虢2P就需要知道對方的真實IP。
  4. P2P網(wǎng)絡可以有不同的拓撲結構。
  5. 區(qū)塊鏈是沒有中心化tracker的拓撲結構。
  6. Kademlia及其改進協(xié)議提供了對數(shù)級別的查找節(jié)點的算法。
  7. BTC的網(wǎng)絡分為不同的角色。
  8. BTC網(wǎng)絡建立也需要有網(wǎng)絡發(fā)現(xiàn)和數(shù)據(jù)同步的過程。

參考

Stratum_mining_protocol
MasterBitcoin2CN
P2P 網(wǎng)絡核心技術:Kademlia 協(xié)議
內(nèi)網(wǎng),外網(wǎng),NAT,網(wǎng)絡穿透的故事

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容