1. 程式人生 > >C++從零開始區塊鏈:P2P模組之簡單介紹一下原理

C++從零開始區塊鏈:P2P模組之簡單介紹一下原理

想徹底說明P2P的原理太麻煩了,而且這種東西網上一搜就是一大堆(雖然好多連結其實都是同一篇文章),這裡就不贅述了,只簡單說一下本例所用到的一些東西。
如果所有節點都在公網上,p2p通訊就非常容易,找臺搭橋伺服器,每個節點啟動的時候都向搭橋伺服器註冊自己,並獲取其他節點資訊,然後就可以節點間互相通訊了。
但在實際的網路環境中,很多節點處於內網中,外面的節點很難直接訪問到處於內網中的節點,也就無法實現p2p通訊,所以就需要對內網節點打洞,使外網的節點也能訪問到內網的幾點。
打洞原理就不細說了,簡單描述一下,處於同一內網的主機,它們共用同一個外網IP,當內網的主機想要發資料給外網的IP,首先用內網的IP和埠傳送訊息給內網NAT,NAT收到訊息後,開啟一個埠,並講該埠與內網主機的IP和埠進行對映,NAT在此埠上接收到的資料都轉發到對映的內網主機和埠上。
比如內網某臺主機的IP埠號是192.168.1.1:8000,外網IP是202.12.34.56,該主機想訪問處於外網上的主機的IP埠號是67.89.12.34:80,那麼實際的資料流通的是從192.168.1.1:8000發出資料到內網NAT,內網NAT開了個埠10000,並將資料傳送到67.89.12.34:80,而67.89.12.34:80接收到的資料實際上是從202.12.34.56:10000傳送過來的。當67.89.12.34:80要回發資料的時候,實際上是向202.12.34.56:10000傳送,內網NAT的10000號埠接收到資料後,發現10000埠繫結的是192.168.1.1:8000,便將資料在內網網路上傳送到192.168.1.1:8000。
簡單說完打洞原理後,在介紹下本例的P2P中的資料流程。
首先需要一臺打洞伺服器,負責記錄與分發節點資訊。
當節點啟動後,首先要向打洞伺服器註冊自己,註冊的時候將本機IP埠傳送給打洞伺服器。
打洞伺服器在接收的該節點的註冊請求,先讀取該節點發送過來的IP埠,再查詢一下自己實際收到訊息的IP和埠,然後將兩個IP埠資訊作為一個節點資訊儲存到節點列表,再將該節點資訊傳送回去。
節點接收到註冊反饋後,將自己的節點資訊儲存,註冊流程結束。
當節點想要與其他節點進行通訊時,首先向打洞伺服器索要其他的節點資訊,打洞伺服器將其他節點資訊返回。
在節點接收到其他節點資訊後,先判斷自己的節點資訊,如果打洞伺服器返回的自己的IP和自己查詢的自己的IP相同,則自身處於外網環境,否則是內網環境。
如果自身是內網環境,在判斷自己的外網IP和通訊節點的外網IP是否相同,如果相同則處於同一內網,不同則不在同一內網。
如果自身和通訊節點處於同一內網,則使用內網IP埠進行通訊,否則就使用外網IP埠進行通訊。
(個人猜測,QQ檔案傳輸功能的內網加速是不是就是這麼幹的)