----紅亞太學鏈:yjh、bjgpdn
位元幣的前幾個版本使用irc作為位元幣p2p的seed,以此獲取到位元幣內節點的位址。本文講述irc的基本原理,及位元幣如何使用irc作為seed獲取其它節點位址。
irc基本原理
附一結構圖:
ircseed的原理
irc的資訊交流採用請求與應答模式,通過sockect程式設計與irc伺服器進行通訊可以達到使用irc的目的。
位元幣早期版本就是使用irc作為p2p的seed,想要連線到位元幣節點的使用者可以通過連線irc伺服器,並進入指定的#bitcoin頻道從而達到你獲取到頻道內其它節點位址的效果。
下面是詳細原理流程:
下面展示一些內聯**片
。
struct hostent* phostent =
gethostbyname
("chat.freenode.net");
caddress addrconnect(*
(u_long*
)phostent-
>h_addr_list[0]
,htons
(8001))
;socket hsocket;if(
!connectsocket
(addrconnect, hsocket)
)
首先tcp連線到irc的伺服器。irc伺服器有很多,之前國內也有,現在很少了,我們使用的是可以用於連線的埠號也有好幾個,可以去這個**上,有介紹文件,我們使用的是8001埠,連不上就換乙個連。
stringstrmyname =
encodeaddress
(addrlocalhost)
;//編碼外網**
之後本地節點獲得自己的外網位址(內網位址不行),並將位址通過base58格式進行編碼。編碼的內容前面加上字元『u』作為自己的暱稱。
值得一提的是,早期版本的位元幣通過特定ip服務**,讓**返回自己的外網ip,但是僅僅得到ip對現在的網路情況已經不適用了,後面會繼續做進一步解釋,從位元幣中間幾個版本開始,訪問的服務**將返回ip+port而不僅僅是ip位址。
send
(hsocket,
strprintf
("nick %s\r"
, strmyname.
c_str()
).c_str()
);send
(hsocket,
strprintf
("user %s 8 * : %s\r"
, strmyname.
c_str()
, strmyname.
c_str()
).c_str()
);
向irc伺服器傳送由位址編碼得到的暱稱資訊。
send
(hsocket,
"join #bitcoin\r");
send
(hsocket,
"who #bitcoin\r"
);
向irc伺服器傳送加入位元幣#bitcoin頻道的join請求,和請求頻道內使用者列表的who請求.
後續就是進入位元幣頻道,並開始接收伺服器發來的#bitcoin使用者列表訊息以及其它使用者的join訊息或者普通資訊。
if
(pszname[0]
=='u'
)}
前面提到,位元幣程式將位址用base58編碼並在前面加上字元』u』作為暱稱。當收到』u』開頭的暱稱時,則代表可能是位址,於是對該暱稱進行反編碼從而獲得對方位址。然後將位址加入mapaddresses位址表。後續會進行連線嘗試。
以上就是位元幣程式將irc作為seed的基本過程。
附一張時序圖:
下面是從位元幣原始碼中摘取的p2p**程式演示:
之後會收到一連串irc伺服器發來的訊息,就是伺服器發來的一些訊息。
在這之後伺服器響應請求,發來#bitcoin使用者列表(got who),當識別到有』u』開頭的暱稱時 ,代表可能是位元幣節點使用者,則對該暱稱進行反編碼得到位址並嘗試連線。由於現在位元幣不再使用irc來seed節點,所以現在位元幣頻道的使用者的名字幾乎都不是』u』開頭的,也就無從獲取位址了。另外還可以收到其它新使用者的join資訊。
感興趣的同學可以自己開乙個頻道,然後兩台電腦分別登入這個頻道,這樣兩台電腦應該可以互相識別對面的暱稱,並反編碼獲取位址。
不過需要說明的是,即使得到外網位址,兩個節點也無法連線。在現在的網路情況,電腦的ip幾乎都是隱藏在多層nat轉換之下的區域網ip,即使獲取到外網的ip,一來由於網路出口不同,外部ip動態變化,二來許多內網主機共用乙個外網ip,僅僅使用外網ip位址無法定位到目標主機(以前好像是有預設靜態nat,外網的8333埠會繫結到內網用8333作為埠傳送過訊息的主機)。所以位元幣後續的幾個版本改為接收指定伺服器發來的ip+port資訊,然後將該資訊編碼為暱稱。
位元幣網路與P2P
特幣採 了基於國際互聯 internet 的p2p peer to peer 絡架構。p2p是指位於同 絡中的每台計算機都彼此 對等,各個節點共同提供 絡服務,不存在任何 特殊 節點。每個 絡節點以 扁平 flat 的拓撲結構相互連通。在p2p 絡 中不存在任何服務端 server 化的服務 以及層...
P2P之NAT穿透問題
stun協議 rfc3489 詳見http www.ietf.org rfc rfc3489.txt 提出了4種nat型別的定義及其分類,並給出了如何檢測 在用的nat究竟屬於哪種分類的標準。但是,具體到p2p程式如何應用stun協議及其分類法穿越nat,則是仁者見仁 智者見智。因為stun協議並沒...
P2P之NAT穿透原理
p2p之nat穿透原理介紹 一次專案中,對於主動協議接入的裝置,客戶希望能夠裝置端直接推送碼流到客戶端以此減少中心 的負載。所以對p2p這塊方案做了了解,這裡做下整理。即對等計算機網路,是一種在對等者 peer 之間分配任務和工作負載的分布式應用架構 是對等計算模型在應用層形成的一種組網或網路形式。...