P2P網(wǎng)絡(luò)是什么
P2P是指位于同一網(wǎng)絡(luò)中的每臺計算機(jī)都彼此平等,身份對等,各個節(jié)點(diǎn)共同提供網(wǎng)絡(luò)服務(wù),不存在任何“特殊”節(jié)點(diǎn)。網(wǎng)絡(luò)節(jié)點(diǎn)以“扁平”的拓?fù)浣Y(jié)構(gòu)相互連通。 網(wǎng)絡(luò)中不存在任何服務(wù)器端、中央化的服務(wù)、以及層級結(jié)構(gòu)。點(diǎn)對點(diǎn)網(wǎng)絡(luò)中的節(jié)點(diǎn)同時提供和消費(fèi)服務(wù),互惠互利。點(diǎn)對點(diǎn)網(wǎng)絡(luò)也因此具有可靠性、去中心化,以及開放性。
早期的互聯(lián)網(wǎng)就是點(diǎn)對點(diǎn)網(wǎng)絡(luò)架構(gòu)的一個典型用例:IP網(wǎng)絡(luò)中的各個節(jié)點(diǎn)完全平等。當(dāng)今的互聯(lián)網(wǎng)架構(gòu)具有分層架構(gòu),但是IP協(xié)議仍然保留了扁平拓?fù)涞慕Y(jié)構(gòu)。
先問幾個問題
- IP協(xié)議解決了什么問題?其他網(wǎng)絡(luò)協(xié)議呢?
- 計算機(jī)如何發(fā)現(xiàn)對方?數(shù)據(jù)如何傳輸?shù)竭h(yuǎn)程計算機(jī)?
P2P的例子
- Skype
- BitTorrent
- Gnutella
- VoIP
- Spotify
- SMTP(server - server)
- WebRTC
- Blockchain
現(xiàn)有的網(wǎng)絡(luò)

- IP 有限
- 大量的局域網(wǎng)IP
問題:咱們國內(nèi)的網(wǎng)到底是個局域網(wǎng)還是廣域網(wǎng)
P2P 的技術(shù)難點(diǎn)
- Discovery - Registration
- NAT Traversal
- Firewalls
- Asymmetrical bandwidth
- Security
- Optimization

P2P網(wǎng)絡(luò)的數(shù)據(jù)流動
//udp
sendto(ip,port,buffer);
//tcp
send(fd,buffer,length,0)

上面的紅色箭頭是P2P真實(shí)的數(shù)據(jù)流動,那么數(shù)據(jù)怎么發(fā)送到客戶端B的呢?
說下鏈路層地址與IP地址。許多鏈路層協(xié)議也有自己的地址,一般是MAC地址,比如最常用的以太網(wǎng)。鏈路層地址在鏈路層協(xié)議中使用,表明這個鏈路層報文會被發(fā)給誰;而IP地址在IP層協(xié)議中使用,表明這個報文最終要發(fā)給誰。可以分為兩種情況:
- 直接通過鏈路層發(fā)送:
鏈路層地址: (源MAC地址) (目的MAC地址)
IP地址: (源IP地址) (目的IP地址) - 經(jīng)過網(wǎng)關(guān)轉(zhuǎn)發(fā)
從本機(jī)出發(fā)發(fā)往網(wǎng)關(guān)時,鏈路層的目的是網(wǎng)關(guān)而IP層的目的不是網(wǎng)關(guān):
鏈路層地址: (本機(jī)源MAC地址) (網(wǎng)關(guān)MAC地址)
IP地址: (本機(jī)IP地址) (目的IP地址)
網(wǎng)關(guān)轉(zhuǎn)發(fā)到其他網(wǎng)關(guān):
鏈路層地址: (網(wǎng)關(guān)MAC地址) (下一跳網(wǎng)關(guān)MAC地址)
IP地址: (本機(jī)IP地址) (目的IP地址)
最后一個網(wǎng)關(guān)轉(zhuǎn)發(fā)到目標(biāo):
鏈路層地址: (最后一個網(wǎng)關(guān)MAC地址) (目的MAC地址)
IP地址: (本機(jī)IP地址) (目的IP地址)
在轉(zhuǎn)發(fā)過程中,IP報文的源和目的保持不變,鏈路層地址則只和這一跳的雙方有關(guān),甚至如果中間經(jīng)過了不一樣的鏈路層,還會更換二層數(shù)據(jù)包的格式。
NAT (Network Address Translation) 穿透
我們知道了網(wǎng)關(guān)(路由器)可以幫助我們轉(zhuǎn)發(fā)數(shù)據(jù),那么剩下的就是找到對方IP地址。這就涉及到NAT穿透。

完全錐形:不攔截
IP限制錐形NAT:限制特定IP
端口限制錐形NAT:限制IP加端口
對稱NAT:網(wǎng)關(guān)給不同端發(fā)送數(shù)據(jù)分配不同的ip和端口
問題:
- 如何判斷客戶端網(wǎng)關(guān)的NAT類型
- 如果對所有的網(wǎng)關(guān)NAT穿透
- 如何測試客戶端數(shù)量
- 有沒有穿透不了的情況?
網(wǎng)絡(luò)拓?fù)?/h2>
最早的BitTorrent 網(wǎng)絡(luò),需要一個中心服務(wù)器也就是種子服務(wù)器,來幫助各個 Peers 節(jié)點(diǎn)找到彼此進(jìn)行文件下載


DHT
在 P2P(peer-to-peer) 網(wǎng)絡(luò)中,節(jié)點(diǎn)的相互發(fā)現(xiàn)及網(wǎng)絡(luò)成型的過程會面臨一些問題。
早年間的 P2P 文件共享技術(shù),比如 Napster,使用單個服務(wù)器共享信息,信息中記錄誰擁有什么文件。某個節(jié)點(diǎn)向中心服務(wù)器發(fā)起連接并提交記錄自己所擁有文件的列表。另一個節(jié)點(diǎn)之后向同一個中心服務(wù)器發(fā)起連接,尋找自己所需文件的存儲節(jié)點(diǎn),然后和找到的節(jié)點(diǎn)建立聯(lián)系。然而這是一個有缺陷的系統(tǒng) —— 系統(tǒng)很容易遭受攻擊,而且中心化服務(wù)器節(jié)點(diǎn)可能會吃官司。(譯者注:單個服務(wù)器上存儲文件內(nèi)容和節(jié)點(diǎn)的對應(yīng)關(guān)系,如果提供了一些受版權(quán)保護(hù)內(nèi)容的鏈接關(guān)系,那么這個中心化服務(wù)器的提供者將直接受到原版權(quán)方的法律追責(zé))
因此,點(diǎn)對點(diǎn)網(wǎng)絡(luò)亟需另一種解決方案。研究者們經(jīng)過數(shù)年研究和實(shí)驗(yàn),提出了分布式哈希表(DHT)。
Kademlia 是 Petar Maymounkov 和 David Mazières 于 2002 年發(fā)明的 DHT 協(xié)議。我覺得這個協(xié)議可能是最流行,而且使用最廣泛的 DHT 協(xié)議
Kademlia 使用 XOR(異或操作符) 作為距離函數(shù)。XOR 函數(shù)的特點(diǎn)在于,只有當(dāng)輸入不同時,輸出才為 true。下面是用二進(jìn)制標(biāo)識符表示的例子。
XOR 10011001 00110010 -------- 10101011
上面的這個例子是說,十進(jìn)制數(shù)字 153 和 50 之間的距離是 171。
基本算法
Kademlia 是分布式散列表(DHT,Distributed Hash Table)的一種,類似的還有 Chord,Pastry 等。DHT 技術(shù)是去中心化 P2P 網(wǎng)絡(luò)中最核心的一種路由尋址技術(shù),可以在無中心服務(wù)器(trackerless)的情況下,在網(wǎng)絡(luò)中快速找到目標(biāo)節(jié)點(diǎn)。
https://zhuanlan.zhihu.com/p/40286711
假設(shè)現(xiàn)在的當(dāng)前節(jié)點(diǎn)是 001,它想要查的目標(biāo)節(jié)點(diǎn)是 101 節(jié)點(diǎn)。

我們可以看到,整個檢索過程是不斷收斂的,查詢復(fù)雜度是可以證明是 Log N
BTC節(jié)點(diǎn)類型及角色
管比特幣點(diǎn)對點(diǎn)網(wǎng)絡(luò)中的各個節(jié)點(diǎn)地位對等,但是根據(jù)所提供的功能不同,各節(jié)點(diǎn)可能具有不同的角色。比特幣節(jié)點(diǎn)是路由、區(qū)塊鏈數(shù)據(jù)庫、挖礦、錢包服務(wù)這些功能的集合。全節(jié)點(diǎn)(full node)包括如下圖所示的四個功能(錢包,礦工,完整的區(qū)塊鏈數(shù)據(jù)庫和網(wǎng)絡(luò)路由的比特幣網(wǎng)絡(luò)節(jié)點(diǎn)):

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

礦工網(wǎng)絡(luò)分成礦機(jī)、礦池、錢包等幾個主要部分,有時礦池軟件與錢包安裝在一起,可合稱為礦池。
礦機(jī)與礦池軟件之間的通訊協(xié)議是stratum,而礦池軟件與錢包之間的通訊是bitcoinrpc接口
比特幣傳輸網(wǎng)絡(luò)
雖然比特幣點(diǎn)對點(diǎn)網(wǎng)絡(luò)服務(wù)于各種各樣類型節(jié)點(diǎn)的一般需求,但是對于比特幣挖礦節(jié)點(diǎn)的特殊需求,它的網(wǎng)絡(luò)延遲就顯得太高了。
比特幣礦工參與的是時效性很強(qiáng)的競爭,以解決工作證明問題,延長區(qū)塊鏈。在參與這項(xiàng)競爭的同時,比特幣礦工必須盡可能縮短從傳播一個獲勝區(qū)塊到開始下一輪競爭之間的時間。挖礦中,網(wǎng)絡(luò)延遲與利潤率直接相關(guān)。
傳輸網(wǎng)絡(luò)不是替代比特幣的點(diǎn)對點(diǎn)網(wǎng)絡(luò)。相反,它們是重疊網(wǎng)絡(luò),在具有特殊需求的節(jié)點(diǎn)之間提供額外的連接,就像高速公路不能替代鄉(xiāng)村道路,而是交通繁忙的兩點(diǎn)之間的捷徑,仍然需要通過小路連接高速公路。
Matt Corallo創(chuàng)建的Fast Internet Bitcoin Relay Engine 或者 FIBRE。 FIBER是一種基于UDP的傳輸網(wǎng)絡(luò),可以節(jié)點(diǎn)網(wǎng)絡(luò)內(nèi)傳輸區(qū)塊。 FIBRE實(shí)現(xiàn)了壓縮區(qū)塊優(yōu)化,以進(jìn)一步減少數(shù)據(jù)傳輸量和網(wǎng)絡(luò)延遲。
康奈爾大學(xué)研究的另一個傳輸網(wǎng)絡(luò)(仍在提案階段)是 Falcon。 Falcon使用“直通路由”而不是“存儲轉(zhuǎn)發(fā)”來減少延遲,方法是在接收到區(qū)塊時就開始部分傳輸,而不是等到接收到完整的區(qū)塊。
網(wǎng)絡(luò)發(fā)現(xiàn)
當(dāng)新的網(wǎng)絡(luò)節(jié)點(diǎn)啟動后,它必須發(fā)現(xiàn)網(wǎng)絡(luò)中的其他比特幣節(jié)點(diǎn)才能參與。要啟動這個過程,新節(jié)點(diǎn)必須在網(wǎng)絡(luò)上發(fā)現(xiàn)至少一個現(xiàn)有節(jié)點(diǎn)并連接到該節(jié)點(diǎn)。其他節(jié)點(diǎn)的地理位置在哪兒都沒有關(guān)系,比特幣網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)沒有地理位置的定義。因此,可以隨機(jī)選擇任何現(xiàn)有的比特幣節(jié)點(diǎn)。
為了連接到一個已知的對等點(diǎn),節(jié)點(diǎn)會建立一個TCP連接,通常連接到端口8333(通常被稱為比特幣使用的端口),或者如果指定了另一個端口,則連接到另一個端口。
新節(jié)點(diǎn)如何找到對等節(jié)點(diǎn)? 第一種方法是使用一些“DNS種子”來查詢DNS,DNS種子就是提供比特幣節(jié)點(diǎn)IP地址列表的DNS服務(wù)器。 其中一些DNS種子提供了穩(wěn)定的比特幣偵聽節(jié)點(diǎn)的IP地址靜態(tài)列表。 一些DNS種子是BIND(Berkeley Internet Name Daemon)的自定義實(shí)現(xiàn),它從爬蟲程序或長時間運(yùn)行的比特幣節(jié)點(diǎn)收集的比特幣節(jié)點(diǎn)地址列表中返回一個隨機(jī)子集。 Bitcoin Core客戶端包含五種不同DNS種子的名稱。 不同DNS種子的所有權(quán)的多樣性和實(shí)現(xiàn)的多樣性為初始引導(dǎo)過程提供了高水平的可靠性。
或者,一個剛剛啟動的節(jié)點(diǎn),對網(wǎng)絡(luò)一無所知,必須被賦予至少一個比特幣節(jié)點(diǎn)的IP地址,之后才可以通過進(jìn)一步的引見建立連接。 在使用初始種子節(jié)點(diǎn)完成引見后,客戶端將斷開連接并使用新發(fā)現(xiàn)的對等節(jié)點(diǎn)。



總結(jié)
- 先說明了IP協(xié)議本身就是去中心化和扁平的,P2P是最天然的基于IP協(xié)議的傳輸方式。
- 由于IP是有限的,我們利用網(wǎng)關(guān)組件了局域網(wǎng)。
- 局域網(wǎng)通過網(wǎng)關(guān)發(fā)送數(shù)據(jù)到目標(biāo)IP,這時候我們?nèi)绻虢2P就需要知道對方的真實(shí)IP。
- P2P網(wǎng)絡(luò)可以有不同的拓?fù)浣Y(jié)構(gòu)。
- 區(qū)塊鏈?zhǔn)菦]有中心化tracker的拓?fù)浣Y(jié)構(gòu)。
- Kademlia及其改進(jìn)協(xié)議提供了對數(shù)級別的查找節(jié)點(diǎn)的算法。
- BTC的網(wǎng)絡(luò)分為不同的角色。
- BTC網(wǎng)絡(luò)建立也需要有網(wǎng)絡(luò)發(fā)現(xiàn)和數(shù)據(jù)同步的過程。
參考
Stratum_mining_protocol
MasterBitcoin2CN
P2P 網(wǎng)絡(luò)核心技術(shù):Kademlia 協(xié)議
內(nèi)網(wǎng),外網(wǎng),NAT,網(wǎng)絡(luò)穿透的故事