P2P網絡是什么
P2P是指位于同一網絡中的每臺計算機都彼此平等,身份對等,各個節點共同提供網絡服務,不存在任何“特殊”節點。網絡節點以“扁平”的拓撲結構相互連通。 網絡中不存在任何服務器端、中央化的服務、以及層級結構。點對點網絡中的節點同時提供和消費服務,互惠互利。點對點網絡也因此具有可靠性、去中心化,以及開放性。
早期的互聯網就是點對點網絡架構的一個典型用例:IP網絡中的各個節點完全平等。當今的互聯網架構具有分層架構,但是IP協議仍然保留了扁平拓撲的結構。
先問幾個問題
- IP協議解決了什么問題?其他網絡協議呢?
- 計算機如何發現對方?數據如何傳輸到遠程計算機?
P2P的例子
- Skype
- BitTorrent
- Gnutella
- VoIP
- Spotify
- SMTP(server - server)
- WebRTC
- Blockchain
現有的網絡
- IP 有限
- 大量的局域網IP
問題:咱們國內的網到底是個局域網還是廣域網
P2P 的技術難點
- Discovery - Registration
- NAT Traversal
- Firewalls
- Asymmetrical bandwidth
- Security
- Optimization
P2P網絡的數據流動
//udp
sendto(ip,port,buffer);
//tcp
send(fd,buffer,length,0)
上面的紅色箭頭是P2P真實的數據流動,那么數據怎么發送到客戶端B的呢?
說下鏈路層地址與IP地址。許多鏈路層協議也有自己的地址,一般是MAC地址,比如最常用的以太網。鏈路層地址在鏈路層協議中使用,表明這個鏈路層報文會被發給誰;而IP地址在IP層協議中使用,表明這個報文最終要發給誰。可以分為兩種情況:
- 直接通過鏈路層發送:
鏈路層地址: (源MAC地址) (目的MAC地址)
IP地址: (源IP地址) (目的IP地址) - 經過網關轉發
從本機出發發往網關時,鏈路層的目的是網關而IP層的目的不是網關:
鏈路層地址: (本機源MAC地址) (網關MAC地址)
IP地址: (本機IP地址) (目的IP地址)
網關轉發到其他網關:
鏈路層地址: (網關MAC地址) (下一跳網關MAC地址)
IP地址: (本機IP地址) (目的IP地址)
最后一個網關轉發到目標:
鏈路層地址: (最后一個網關MAC地址) (目的MAC地址)
IP地址: (本機IP地址) (目的IP地址)
在轉發過程中,IP報文的源和目的保持不變,鏈路層地址則只和這一跳的雙方有關,甚至如果中間經過了不一樣的鏈路層,還會更換二層數據包的格式。
NAT (Network Address Translation) 穿透
我們知道了網關(路由器)可以幫助我們轉發數據,那么剩下的就是找到對方IP地址。這就涉及到NAT穿透。
完全錐形:不攔截
IP限制錐形NAT:限制特定IP
端口限制錐形NAT:限制IP加端口
對稱NAT:網關給不同端發送數據分配不同的ip和端口
問題:
- 如何判斷客戶端網關的NAT類型
- 如果對所有的網關NAT穿透
- 如何測試客戶端數量
- 有沒有穿透不了的情況?
網絡拓撲
最早的BitTorrent 網絡,需要一個中心服務器也就是種子服務器,來幫助各個 Peers 節點找到彼此進行文件下載
DHT
在 P2P(peer-to-peer) 網絡中,節點的相互發現及網絡成型的過程會面臨一些問題。
早年間的 P2P 文件共享技術,比如 Napster,使用單個服務器共享信息,信息中記錄誰擁有什么文件。某個節點向中心服務器發起連接并提交記錄自己所擁有文件的列表。另一個節點之后向同一個中心服務器發起連接,尋找自己所需文件的存儲節點,然后和找到的節點建立聯系。然而這是一個有缺陷的系統 —— 系統很容易遭受攻擊,而且中心化服務器節點可能會吃官司。(譯者注:單個服務器上存儲文件內容和節點的對應關系,如果提供了一些受版權保護內容的鏈接關系,那么這個中心化服務器的提供者將直接受到原版權方的法律追責)
因此,點對點網絡亟需另一種解決方案。研究者們經過數年研究和實驗,提出了分布式哈希表(DHT)。
Kademlia 是 Petar Maymounkov 和 David Mazières 于 2002 年發明的 DHT 協議。我覺得這個協議可能是最流行,而且使用最廣泛的 DHT 協議
Kademlia 使用 XOR(異或操作符) 作為距離函數。XOR 函數的特點在于,只有當輸入不同時,輸出才為 true。下面是用二進制標識符表示的例子。
XOR 10011001 00110010 -------- 10101011
上面的這個例子是說,十進制數字 153 和 50 之間的距離是 171。
基本算法
Kademlia 是分布式散列表(DHT,Distributed Hash Table)的一種,類似的還有 Chord,Pastry 等。DHT 技術是去中心化 P2P 網絡中最核心的一種路由尋址技術,可以在無中心服務器(trackerless)的情況下,在網絡中快速找到目標節點。
https://zhuanlan.zhihu.com/p/40286711
假設現在的當前節點是 001,它想要查的目標節點是 101 節點。
我們可以看到,整個檢索過程是不斷收斂的,查詢復雜度是可以證明是 Log N
BTC節點類型及角色
管比特幣點對點網絡中的各個節點地位對等,但是根據所提供的功能不同,各節點可能具有不同的角色。比特幣節點是路由、區塊鏈數據庫、挖礦、錢包服務這些功能的集合。全節點(full node)包括如下圖所示的四個功能(錢包,礦工,完整的區塊鏈數據庫和網絡路由的比特幣網絡節點):
下圖描述了擴展比特幣網絡中多種類型的節點、網關服務器、邊緣路由器、錢包客戶端以及它們相互連接所需的各類協議。z
礦工網絡分成礦機、礦池、錢包等幾個主要部分,有時礦池軟件與錢包安裝在一起,可合稱為礦池。
礦機與礦池軟件之間的通訊協議是stratum,而礦池軟件與錢包之間的通訊是bitcoinrpc接口
比特幣傳輸網絡
雖然比特幣點對點網絡服務于各種各樣類型節點的一般需求,但是對于比特幣挖礦節點的特殊需求,它的網絡延遲就顯得太高了。
比特幣礦工參與的是時效性很強的競爭,以解決工作證明問題,延長區塊鏈。在參與這項競爭的同時,比特幣礦工必須盡可能縮短從傳播一個獲勝區塊到開始下一輪競爭之間的時間。挖礦中,網絡延遲與利潤率直接相關。
傳輸網絡不是替代比特幣的點對點網絡。相反,它們是重疊網絡,在具有特殊需求的節點之間提供額外的連接,就像高速公路不能替代鄉村道路,而是交通繁忙的兩點之間的捷徑,仍然需要通過小路連接高速公路。
Matt Corallo創建的Fast Internet Bitcoin Relay Engine 或者 FIBRE。 FIBER是一種基于UDP的傳輸網絡,可以節點網絡內傳輸區塊。 FIBRE實現了壓縮區塊優化,以進一步減少數據傳輸量和網絡延遲。
康奈爾大學研究的另一個傳輸網絡(仍在提案階段)是 Falcon。 Falcon使用“直通路由”而不是“存儲轉發”來減少延遲,方法是在接收到區塊時就開始部分傳輸,而不是等到接收到完整的區塊。
網絡發現
當新的網絡節點啟動后,它必須發現網絡中的其他比特幣節點才能參與。要啟動這個過程,新節點必須在網絡上發現至少一個現有節點并連接到該節點。其他節點的地理位置在哪兒都沒有關系,比特幣網絡拓撲結構沒有地理位置的定義。因此,可以隨機選擇任何現有的比特幣節點。
為了連接到一個已知的對等點,節點會建立一個TCP連接,通常連接到端口8333(通常被稱為比特幣使用的端口),或者如果指定了另一個端口,則連接到另一個端口。
新節點如何找到對等節點? 第一種方法是使用一些“DNS種子”來查詢DNS,DNS種子就是提供比特幣節點IP地址列表的DNS服務器。 其中一些DNS種子提供了穩定的比特幣偵聽節點的IP地址靜態列表。 一些DNS種子是BIND(Berkeley Internet Name Daemon)的自定義實現,它從爬蟲程序或長時間運行的比特幣節點收集的比特幣節點地址列表中返回一個隨機子集。 Bitcoin Core客戶端包含五種不同DNS種子的名稱。 不同DNS種子的所有權的多樣性和實現的多樣性為初始引導過程提供了高水平的可靠性。
或者,一個剛剛啟動的節點,對網絡一無所知,必須被賦予至少一個比特幣節點的IP地址,之后才可以通過進一步的引見建立連接。 在使用初始種子節點完成引見后,客戶端將斷開連接并使用新發現的對等節點。
總結
- 先說明了IP協議本身就是去中心化和扁平的,P2P是最天然的基于IP協議的傳輸方式。
- 由于IP是有限的,我們利用網關組件了局域網。
- 局域網通過網關發送數據到目標IP,這時候我們如果想建立P2P就需要知道對方的真實IP。
- P2P網絡可以有不同的拓撲結構。
- 區塊鏈是沒有中心化tracker的拓撲結構。
- Kademlia及其改進協議提供了對數級別的查找節點的算法。
- BTC的網絡分為不同的角色。
- BTC網絡建立也需要有網絡發現和數據同步的過程。
參考
Stratum_mining_protocol
MasterBitcoin2CN
P2P 網絡核心技術:Kademlia 協議
內網,外網,NAT,網絡穿透的故事