《libp2p詳解》的主題演講演講視頻:https://bbs.dji.com/thread-22883-1-1.html
10月20日骨坑,在由晨霧科技主辦的中國IPFS開發(fā)者沙龍上锻全,晨霧科技的聯(lián)合創(chuàng)始人徐瀟眯杏,他帶來了名為《libp2p詳解》的主題演講开瞭。
libp2p為什么重要呢懒震?今年7月份,協(xié)議實驗室將libp2p提升為一級項目嗤详,與IPFS和Filecoin比肩个扰,libp2p還是IPFS與Filecoin的基礎(chǔ)設(shè)施,也就是說它們的底層技術(shù)完全是基于libp2p實現(xiàn)的葱色。而且递宅,libp2p更是未來p2p應(yīng)用、區(qū)塊鏈和物聯(lián)網(wǎng)的基礎(chǔ)設(shè)施苍狰。它高度抽象了主流的傳輸協(xié)議办龄,使得上層應(yīng)用搭建時完全不必關(guān)注底層的具體實現(xiàn)最終實現(xiàn)跨環(huán)境、跨協(xié)議的設(shè)備互聯(lián)淋昭。
徐瀟的演講聚焦于libp2p的實現(xiàn)原理與核心流程俐填。他對libp2p中的核心組件在系統(tǒng)中的功能與實現(xiàn)細(xì)節(jié)一一做了介紹,并詳細(xì)解讀了libp2p初始化結(jié)點响牛、撥號玷禽、監(jiān)聽、rpc和數(shù)據(jù)交換等核心流程呀打。
我主要為大家講的是go的實現(xiàn)矢赁,它其實還有rust和JS實現(xiàn)。之所以只講go贬丛,是因為go是它的第一個產(chǎn)品庫撩银,也是實現(xiàn)最全面的一個庫。
一豺憔、libp2p概要
1额获、libp2p是什么够庙?
libp2p就是幫助你鏈接節(jié)點的一個庫。它的特性是什么抄邀?就是任意兩個節(jié)點耘眨,不管在哪里,不管處于什么環(huán)境境肾,不管運行什么操作系統(tǒng)剔难,不管是不是在NAT之后,只要他們有物理上鏈接的可能性奥喻,那么libp2p就會幫你完成這個鏈接偶宫。
現(xiàn)在對于協(xié)議實驗室來說,libp2p處于非常重要的一個模塊环鲤,它是IPFS和filecoin的網(wǎng)絡(luò)層纯趋。大家如果對它有很深的認(rèn)識,就會發(fā)現(xiàn)IPFS里的很多功能就是對libp2p的一個簡單抽象與包裝冷离。換句話說吵冒,如果你有一些新的想法,完全可以基于libp2p這個庫實現(xiàn)一個新的IPFS酒朵。
libp2p是一個rpc框架桦锄。rpc過程指的是節(jié)點1想告訴節(jié)點2一些數(shù)據(jù),我先序列化成字節(jié)流蔫耽,能夠在網(wǎng)絡(luò)中傳輸,然后進(jìn)入真正的傳輸層留夜,節(jié)點2再反序列化拿到這個數(shù)據(jù)匙铡。其實libp2p還不是最底層的模塊,它下面還有一個Multiformats的庫碍粥,Multiformats提供各種功能的抽象層鳖眼,并把這些功能抽象成一個統(tǒng)一的接口。
libp2p還是一個工具庫嚼摩。為什么這么說呢钦讳?因為我們平常在做軟件開發(fā)的時候,不光要關(guān)注底層枕面,比如tcp鏈接愿卒,還需要關(guān)注鏈接狀態(tài)等信息。協(xié)議實驗室通過他過去的一些經(jīng)驗潮秘,總結(jié)出了所有開發(fā)者基本都需要的一些功能琼开,把它們放到了libp2p庫里面,相當(dāng)于完善了傳輸層枕荞。我簡單列了一些柜候,這些工具的功能主要包括鏈接復(fù)用搞动、ID交換、中繼渣刷、NAT穿越鹦肿、dht發(fā)現(xiàn)、RTT統(tǒng)計等辅柴。
2箩溃、為什么要做libp2p?
之所以要做libp2p碌识,是因為在做IPFS的時候碾篡,遇到了大量的異構(gòu)設(shè)備,運行著不同的操作系統(tǒng)筏餐,網(wǎng)絡(luò)環(huán)境非常復(fù)雜开泽,比如在中國有各個NAT,還有某些場景下魁瞪,可能用不了tcp鏈接穆律,還有就是文件系統(tǒng)多樣性,以及很可能需要協(xié)議變遷导俘,比如比特幣已經(jīng)經(jīng)歷過很多次的協(xié)議變遷峦耘,每次都需要51%的節(jié)點支持。那么其實可以通過一種比較巧妙的方式來完成旅薄。
未來等IPv6出來以后辅髓,很可能是物聯(lián)網(wǎng)、P2P應(yīng)用少梁、區(qū)塊鏈的大爆發(fā)時期洛口,尤其是物聯(lián)網(wǎng)。所以協(xié)議實驗室決定把他們遇到的問題全部抽象出來凯沪,做個libp2p的庫第焰,讓其他開發(fā)者能夠直接使用這個庫,屏蔽掉所有問題妨马,只關(guān)注業(yè)務(wù)邏輯即可挺举。
3、libp2p目標(biāo)及現(xiàn)狀
libp2p的目標(biāo)很遠(yuǎn)大烘跺,但是協(xié)議實驗室現(xiàn)在只做到了一部分湘纵,不過已經(jīng)可以基本滿足使用了。我列出了libp2p的目標(biāo)和現(xiàn)狀液荸,大家可以大致看一下瞻佛。
二、libp2p原理
1、核心組件關(guān)系圖
如下圖所示伤柄,這是libp2p核心組件的關(guān)系圖绊困。
先簡單介紹一下,第一層是接口層适刀,最上面就是它幫我們實現(xiàn)的一些接口功能秤朗。然后就是host,這兩個host是有互相繼承關(guān)系的笔喉,routed的是basic的一個擴(kuò)展實現(xiàn)取视。在libp2p中,一個host是一個節(jié)點常挚,所以在IPFS中作谭,都是以host為單位進(jìn)行數(shù)據(jù)分發(fā)與傳輸?shù)摹=酉聛砦衣齺碇v細(xì)節(jié)奄毡。
2折欠、核心組件詳解
transport
首先我要講transport,它在應(yīng)用層和傳輸層中間吼过,看這個就知道其實很簡單锐秦,之所以要把它封裝起來,基于兩個理由盗忱,一是現(xiàn)在世界上流行的傳輸協(xié)議可能只有這些酱床,但協(xié)議是不斷演進(jìn)的。 二是我們平常去找ip地址趟佃,有個弊端就是沒法指定協(xié)議扇谣。所以這個東西的核心就是把各個傳輸層全部抽象為一個統(tǒng)一的接口,只要匹配好接口就可以了闲昭。這也是為什么我們說開發(fā)p2p網(wǎng)絡(luò)不用再關(guān)注底層傳輸協(xié)議的原因揍堕。
upgrader
接下來講一下upgrader,我們知道傳統(tǒng)的https協(xié)議中汤纸,底層是tcp,上面加了一個加密套接字層芹血,其實這個加密套接字層就是upgrader贮泞,但是libp2p中,它的功能更多了一些幔烛,大概有四層啃擦,我會逐層講解。
首先以tcp鏈接舉例饿悬,我的一個原始鏈接令蛉,先經(jīng)過filter,filter是一個地址過濾器,protector就是私網(wǎng)珠叔,IPFS也是通過它來實現(xiàn)的蝎宇。Secure就是加密層,muxer是復(fù)用機(jī)制祷安。
filter upgrader姥芥,這一層非常簡單,它就是判斷一個地址在不在我的黑白名單里面汇鞭。
protector upgrader凉唐,這一層叫保護(hù)網(wǎng)絡(luò),其實也叫私有網(wǎng)絡(luò)霍骄,因為它的運行原理就是你如果建了一個分布式應(yīng)用台囱,如果在私網(wǎng)下建,首先你要生成一個密鑰读整,然后把這個密鑰分發(fā)到所有的節(jié)點中簿训,在每一個節(jié)點在初始化的時候,會用這個密鑰對鏈接進(jìn)行設(shè)定绘沉,設(shè)定了以后煎楣,在通信的時候,就會先互換一個隨機(jī)數(shù)车伞,再用這個隨機(jī)數(shù)以及這個密鑰來加密整個的傳輸信道择懂。為什么叫私有網(wǎng)絡(luò)呢,因為你沒有這個密鑰另玖,根本就無法跟別人通信困曙。
Secure upgrader,就是類似TLS的加密鏈接層谦去。這一層目前使用的加密方式有兩種慷丽,一個是對稱加密,一個是非對稱加密鳄哭,非對稱加密用來握手要糊,對稱加密用來加密信道。比如兩個節(jié)點間的三次握手妆丘,第一次握手互換信息锄俄,比如你的公鑰是多少,nonce是什么勺拣,還有我支持的非對稱加密的列表和對稱加密列表奶赠,以及我們支持的哈希方式列表。協(xié)商之后開始第二次握手药有,交換信息毅戈,包括臨時密鑰和簽名信息,根據(jù)對方的公鑰進(jìn)行加密,對方用自己的私鑰去解密就好苇经。然后兩個人之間已經(jīng)協(xié)商出了可用的通信密鑰赘理。第三次握手其實是驗證信息,驗證對方有沒有按照正確的方式生成塑陵。
Mux upgrader感憾,它也叫鏈路復(fù)用器。顧名思義就是復(fù)用了同一個鏈路令花,在一個鏈路上面可以打開多個鏈接阻桅。
relay
再來講一下中繼transport,它對中國的部分場景還是非常有用的兼都,主要是因為涉及到NAT的問題嫂沉。中繼的實現(xiàn)方案是這樣一個框架圖,底層是tcp鏈接扮碧,再監(jiān)聽趟章,然后新的tcp鏈接進(jìn)來并進(jìn)行升級,得到了中繼的一個流慎王,如果中繼是代理到這里就結(jié)束了蚓土。如果是末端節(jié)點,那么它把這個stream又抽象成了一個鏈接的概念赖淤,進(jìn)而在監(jiān)聽器上面起了一個新的鏈接蜀漆,叫中繼鏈接,對中繼鏈接進(jìn)行升級咱旱,得到一個stream确丢,就到業(yè)務(wù)邏輯了。中繼很有意思的一點吐限,不管中繼listener監(jiān)聽到了多少物理鏈接鲜侥,底層對應(yīng)的都是一個物理鏈接,所以中繼場景下的鏈接都是輕量級的诸典。
peerinfo
再來講一下peerinfo描函,它代表了一個節(jié)點的相關(guān)信息,它包含的內(nèi)容就兩點狐粱,一個是ID赘阀,ID是誰?就是我的名字脑奠,ID怎么來的?通過公鑰幅慌,經(jīng)過一次哈希得到的宋欺,也是一個節(jié)點的唯一標(biāo)志。另外就是地址信息,我這個ID的具體地址是什么齿诞,包含3份信息酸休,監(jiān)聽地址、觀測地址祷杈、NAT映射地址斑司。
peerstore
peer store的結(jié)構(gòu)如上圖,它類似于我們傳統(tǒng)生活中的電話本但汞、通信地址薄宿刮,會記錄所有你知道的人的相關(guān)信息,比如說key book會記錄一些公私鑰的信息私蕾,metrics會記錄鏈接的耗時時間僵缺,通過加權(quán)平均值的方式對這個節(jié)點進(jìn)行評估。addr book就是地址的一個信息踩叭,默認(rèn)的實現(xiàn)里面是一個帶超時的地址信息磕潮,當(dāng)然這個超時時間可以設(shè)為零。最后一個data store就是給地址打標(biāo)簽的意思容贝。
swarm
swarm可以說是libp2p的一個核心自脯,因為它才是真正的網(wǎng)絡(luò)層。所有跟網(wǎng)絡(luò)相關(guān)的東西全部在swarm里面斤富,地址簿膏潮、鏈接、監(jiān)聽器都在這管理茂缚,它得有一個回調(diào)機(jī)制戏罢。讓上層注冊,當(dāng)有一個新的stream進(jìn)來以后脚囊,要調(diào)用一個相當(dāng)于中轉(zhuǎn)函數(shù)的概念龟糕。transport管理是說一個節(jié)點可以支持多種transport,dialer就是撥號器悔耘,不過它實際上有點復(fù)雜讲岁,同時我覺得也很厲害!感興趣的朋友可以關(guān)注一下衬以。它里面有三種撥號器缓艳,一個是同步撥號器,一個是后臺限制撥號器看峻,一個是有限制的撥號器阶淘,這三個撥號器會共同作用于整個撥號的過程。
然后講一下NAT互妓,這塊可能大家都會比較關(guān)注溪窒,從目前實現(xiàn)方式來講坤塞,NAT叫穿越不如叫映射。當(dāng)下它的一個實現(xiàn)方式澈蚌,就是我啟動一個節(jié)點摹芙,先檢查一下我附近的NAT設(shè)備運行的是什么協(xié)議,再獲取到NAT的一個設(shè)備地址宛瞄,然后對這個監(jiān)聽地址進(jìn)行周期性的端口映射浮禾。但很可惜的是,目前只限于兩種協(xié)議(Upnp份汗、NAT-pmp)且在僅有一層NAT的時候有可能成功盈电。美國的情況和中國的差異非常大,在美國裸影,普通人的手機(jī)都能拿到公網(wǎng)ip地址挣轨。
host
最后說一下host,是我們操作的核心轩猩,一個host底下有這么幾個部分組成卷扮,首先network,ID service就是我們身身份互換的一個功能均践,然后nat-manager就是剛剛我說的映射晤锹,conn-manager是鏈接管理。
3彤委、核心流程詳解
(此處流程比較復(fù)雜鞭铆,如果沒有技術(shù)背景且沒有看過相關(guān)源碼,可能難以理解焦影;如有需要车遂,可與徐瀟團(tuán)隊聯(lián)系。此處暫不闡述)
三斯辰、libp2p應(yīng)用場景
應(yīng)用場景這部分我簡單講一下舶担,畢竟libp2p還處于不斷的迭代中,現(xiàn)在還處于開發(fā)的階段彬呻,目前基本上處于demo這樣一個階段的應(yīng)用衣陶。
首先是物聯(lián)網(wǎng),我認(rèn)為對于物聯(lián)網(wǎng)場景來說, P2P鏈接是很重要的一環(huán), 闸氮,比如, 安防場景下, 安防攝像頭與手機(jī)之間剪况,建立鏈接的話最好是直連,否則中央服務(wù)器的帶寬撐不住蒲跨,此時對于該場景來說, libp2p可以幫助其完成鏈路上的鏈接工作, 并額外完成了諸如NAT打洞(目前尚未實現(xiàn), 但正在完善中), 流量及RTT統(tǒng)計, 長連接, 流式加密傳輸, 服務(wù)端主動與終端通信等工作.此外, libp2p也能適用于諸如車聯(lián)網(wǎng), 無人車等終端不斷在各個網(wǎng)絡(luò)間切換, 導(dǎo)致其ip信息不斷變化的場景, 基于節(jié)點ID的鏈接方式及DHT路由發(fā)現(xiàn)機(jī)制, 可以有效屏蔽掉底層物理鏈接與上層邏輯的耦合度. 對于信息化時代的逐步到來與演進(jìn), 由個體產(chǎn)生的UGC內(nèi)容在全網(wǎng)的占比將越來越多, 如何有效的將對的信息快速分發(fā)到對的人手里(如抖音與快手的關(guān)注視頻, 直播平臺的實時推流等), 同時降低中心化服務(wù)器的帶寬壓力, 將是未來發(fā)展的一條重要路線.
第二個就是區(qū)塊鏈译断,已經(jīng)有項目在利用libp2p作為它的底層,相當(dāng)于分發(fā)層或悲、調(diào)用層镐作、傳輸層藏姐、網(wǎng)絡(luò)層了。比如剛才多次提到filecoin该贾,在“區(qū)塊數(shù)據(jù)同步”、“文件傳輸”捌臊、“節(jié)點查找”等不少核心環(huán)節(jié)都使用了libp2p杨蛋。還有Polkadot波卡鏈, 作為可能成為區(qū)塊鏈3.0的開辟者, 并為了兼容現(xiàn)有的諸如eth以太坊等主鏈而采用的異構(gòu)多鏈架構(gòu), 更要考慮終端設(shè)備的復(fù)雜場景, 因此其選擇使用libp2p作為其底層傳輸層, 利用libp2p在各個模塊的高度抽象帶來的靈活性及可擴(kuò)展性, 來避免現(xiàn)在及未來因區(qū)塊鏈技術(shù)變遷導(dǎo)致的不兼容問題.
第三個是分布式聊天,就是我們通過ipfs網(wǎng)絡(luò)互相之間發(fā)送聊天信息理澎,也不用管對方鏈路到底是怎么樣的逞力,也不用管中央服務(wù)器。
第四個就是傳輸文件糠爬,IPFS就是用這個做的寇荧,所以這個應(yīng)用性非常之廣。
對LibP2P技術(shù)的小伙伴可以多了解一下执隧,多進(jìn)行踴躍的嘗試揩抡,謝謝。
星鑒網(wǎng)镀琉、巴比特聯(lián)合整理編輯