P2P網(wǎng)絡(luò)穿透技術(shù)在比特幣中的應(yīng)用

本文是《循序漸進(jìn)比特幣》系列第五篇文章-《P2P網(wǎng)絡(luò)穿透技術(shù)在比特幣中的應(yīng)用》,希望對你有所幫助。

1 一個場景

你是否想過這樣一個場景,同一個局域網(wǎng)內(nèi)部的兩部手機同時訪問百度,百度怎么知道應(yīng)該響應(yīng)哪部手機,并且將響應(yīng)內(nèi)容分開?

2 打洞

上述問題就涉及到了“穿透內(nèi)網(wǎng)”的技術(shù),也叫打洞。打洞一般分為兩種:
(1)路由器上做端口映射。這兒提供一篇參考文章,大家如果想弄,自己照著文章配置即可 https://blog.csdn.net/Andrewniu/article/details/75506723
(2)NAT打洞。意思是不在路由器上做映射了,而是在NAT上做映射。
那什么是NAT呢?什么又是NAT打洞呢?

3 NAT介紹

NAT: Network Address Translation. 網(wǎng)絡(luò)地址轉(zhuǎn)換。其是在 IPv4 地址不夠,而IPv6 又推廣不給力的場景下產(chǎn)生的。A/B/C 三類網(wǎng)絡(luò)都留了一個地址端,用作局域網(wǎng)內(nèi)的機器使用,局域網(wǎng)對外只有一個外網(wǎng)IP。
NAT很好,但是如果從外部想訪問局域網(wǎng)內(nèi)的某個服務(wù),是很難的。那就需要NAT打洞。

4 NAT打洞

NAT打洞就是在NAT上 配置內(nèi)網(wǎng)服務(wù)端口 跟對外輸出時的映射關(guān)系, 這樣如果外部請求想找內(nèi)部的某個服務(wù),只要知道內(nèi)部服務(wù)對應(yīng)的外網(wǎng)ip以及 在NAT上對應(yīng)的轉(zhuǎn)發(fā)端口 就可以直接訪問內(nèi)網(wǎng)服務(wù)了。
NAT打洞有多種實現(xiàn)技術(shù)(STUN、TURN、UPNP),由于比特幣中使用了UPNP,所以我們這兒只講一下UPNP的步驟:

(1) 發(fā)送查找消息:

  • 一個設(shè)備添加到網(wǎng)絡(luò)以后,會多播大量發(fā)現(xiàn)消息來通知其嵌入式設(shè)備和服務(wù),所有的控制點都可以監(jiān)聽多播地址以接收通知,標(biāo)準(zhǔn)的多播地址是239.255.255.250:1900。

(2) 獲得根設(shè)備描述url

  • 如果網(wǎng)絡(luò)中存在upnp設(shè)備,此設(shè)備會向發(fā)送了查找請求的多播通道的源IP地址和端口發(fā)送響應(yīng)消息

(3) 通過(2)中找到的設(shè)備描述URL的地址得到設(shè)備描述URL得到XML文檔。

(4) 進(jìn)行端口映射
拿到設(shè)備的控制URL以后就可以發(fā)送控制信息了,比如添加本地節(jié)點到映射表等。

5 比特幣中的UPNP應(yīng)用

比特幣網(wǎng)絡(luò)中的 UPNP 實現(xiàn)了上述的流程。

Discover 過程:

  • 首先是newServer 時,如果配置了upnp, 則會執(zhí)行Discover方法。Discover中通過多播找到upnp設(shè)備, 然后組裝一個upnpNAT對象,等待在server.start中使用。如果沒有找到upnp設(shè)備,則返回nil.

upnpUpdateThread過程:

到了服務(wù)啟動時(server.start ), 如果檢查到第一步中Discover返回的NAT不為空,則執(zhí)行upnpUpdateThread操作。
upnpUpdateThread 的核心邏輯是
(1)執(zhí)行AddPortMapping : 利用內(nèi)網(wǎng)的port 從upnp router上獲取本地節(jié)點對應(yīng)的外網(wǎng)port;并在外部UPNP設(shè)備上加載自己的映射信息。
(2)執(zhí)行GetExternalAddress: 獲取當(dāng)前節(jié)點的外網(wǎng)IP
(3)執(zhí)行 AddLocalAddress: 將映射信息也加載到本地的映射表。

6 總結(jié)

本文從一個場景出發(fā),描述了P2P網(wǎng)絡(luò)中的內(nèi)網(wǎng)穿透問題,進(jìn)而引出了NAT以及NAT打洞,接下來講解了比特幣網(wǎng)絡(luò)中采用的打洞技術(shù)UPNP的原理,最后又簡單描述了在比特幣代碼中是如何實現(xiàn)的。

7 參考文獻(xiàn)

https://yq.aliyun.com/articles/683326
https://juejin.im/post/5b019ee66fb9a07ac85ab314
比特幣源碼

8 其他

本文是《循序漸進(jìn)比特幣》的第六篇-P2P網(wǎng)絡(luò)穿透技術(shù)在比特幣中的應(yīng)用。
如果有疑問,可以直接留言,也可以關(guān)注公眾號 “鏈人成長chainerup” 提問留言,或者加入知識星球“鏈人成長”~

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

相關(guān)閱讀更多精彩內(nèi)容

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