區(qū)塊鏈從P2P通信開始(區(qū)塊鏈從p2p開始 一)——Zfund量化套利

當(dāng)今互聯(lián)網(wǎng)到處存在著一些中間件(MIddleBoxe-s)熏挎,如NAT和防火墻浩嫌,導(dǎo)致兩個(不在同一內(nèi)網(wǎng))中的客戶端無法直接通信,這個問題在開發(fā)區(qū)塊鏈錢包或移動錢包時極為明顯。

本專題將會花幾篇文章詳細(xì)闡述如何解決這一類問題。

這類問題即便是到了IPV6時代也會存在地梨,因?yàn)榧词共恍枰狽AT仲器,但還有其他中間件如防火墻阻擋了鏈接的建立稻爬。 目前部署的中間件多都是在C/S架構(gòu)上設(shè)計的崖疤,其中相對隱匿的客戶機(jī)主動向周知的服務(wù)端(擁有靜態(tài)IP地址和DNS名稱)發(fā)起鏈接請求称龙。 大多數(shù)中間件實(shí)現(xiàn)了一種非對稱的通訊模型,即內(nèi)網(wǎng)中的主機(jī)可以初始化對外的鏈接戳晌,而外網(wǎng)的主機(jī)卻不能初始化對內(nèi)網(wǎng)的鏈接, 除非經(jīng)過中間件管理員特殊配置(如端口映射或PNP)痴柔。

在中間件為常見的NAPT的情況下(也是本文主要討論的)沦偎,內(nèi)網(wǎng)中的客戶端沒有單獨(dú)的公網(wǎng)IP地址, 而是通過NAPT轉(zhuǎn)換咳蔚,和其他同一內(nèi)網(wǎng)用戶共享一個公網(wǎng)IP豪嚎。這種內(nèi)網(wǎng)主機(jī)隱藏在中間件后的不可訪問性對于一些客戶端軟件如瀏覽器來說 并不是一個問題,因?yàn)槠渲恍枰跏蓟瘜ν獾逆溄犹富穑瑥哪撤矫鎭砜捶炊€對隱私保護(hù)有好處侈询。然而在P2P應(yīng)用中, 內(nèi)網(wǎng)主機(jī)(客戶端)需要對另外的終端(Peer)直接建立鏈接糯耍,但是發(fā)起者和響應(yīng)者可能在不同的中間件后面扔字, 兩者都沒有公網(wǎng)IP地址囊嘉。而外部對NAT公網(wǎng)IP和端口主動的鏈接或數(shù)據(jù)都會因內(nèi)網(wǎng)未請求被丟棄掉。本文討論的就是如何跨越NAT實(shí)現(xiàn)內(nèi)網(wǎng)主機(jī)直接通訊的問題革为。

01

術(shù)語

防火墻(Firewall): 防火墻主要限制內(nèi)網(wǎng)和公網(wǎng)的通訊扭粱,通常丟棄未經(jīng)許可的數(shù)據(jù)包。防火墻會檢測(但是不修改)試圖進(jìn)入內(nèi)網(wǎng)數(shù)據(jù)包的IP地址和TCP/UDP端口信息震檩。

網(wǎng)絡(luò)地址轉(zhuǎn)換器(NAT): NAT不止檢查進(jìn)入數(shù)據(jù)包的頭部琢蛤,而且對其進(jìn)行修改,從而實(shí)現(xiàn)同一內(nèi)網(wǎng)中不同主機(jī)共用更少的公網(wǎng)IP(通常是一個)抛虏。

基本NAT(Basic NAT): 基本NAT會將內(nèi)網(wǎng)主機(jī)的IP地址映射為一個公網(wǎng)IP博其,不改變其TCP/UDP端口號∮睾铮基本NAT通常只有在當(dāng)NAT有公網(wǎng)IP池的時候才有用慕淡。

網(wǎng)絡(luò)地址-端口轉(zhuǎn)換器(NAPT): 到目前為止最常見的即為NAPT,其檢測并修改出入數(shù)據(jù)包的IP地址和端口號错忱,從而允許多個內(nèi)網(wǎng)主機(jī)同時共享一個公網(wǎng)IP地址儡率。

錐形NAT(Cone NAT): 在建立了一對(公網(wǎng)IP,公網(wǎng)端口)和(內(nèi)網(wǎng)IP以清,內(nèi)網(wǎng)端口)二元組的綁定之后儿普,Cone NAT會重用這組綁定用于接下來該應(yīng)用程序的所有會話(同一內(nèi)網(wǎng)IP和端口),只要還有一個會話還是激活的掷倔。 例如眉孩,假設(shè)客戶端A建立了兩個連續(xù)的對外會話,從相同的內(nèi)部端點(diǎn)

(10.0.0.1:1234)

到兩個不同的外部服務(wù)端S1和S2勒葱。Co-ne NAT只為兩個會話映射了一個公網(wǎng)端點(diǎn) (155.99.25.11:6 2000)

確崩送簦客戶端端口的“身份”在地址轉(zhuǎn)換的時候保持不變。由于基本NAT和防火墻都不改變數(shù)據(jù)包的端口號凛虽,因此這些類型的中間件也可以看作是退化的Cone NAT死遭。

其中Cone NAT根據(jù)NAT如何接收已經(jīng)建立的(公網(wǎng)IP,公網(wǎng)端口)對的輸入數(shù)據(jù)還可以細(xì)分為以下三類:

全錐形NAT(Full Cone NAT) 在一個新會話建立了公網(wǎng)/內(nèi)網(wǎng)端口綁定之后凯旋,全錐形NAT接下來會接受對應(yīng)公網(wǎng)端口的所有數(shù)據(jù)呀潭,無論是來自哪個(公網(wǎng))終端。 全錐NAT有時候也被稱為“混雜”NAT(promiscuous NAT)至非。

受限錐形NAT(Restricted Cone NAT) 受限錐形NAT只會轉(zhuǎn)發(fā)符合某個條件的輸入數(shù)據(jù)包钠署。條件為:外部(源)IP地址匹配內(nèi)網(wǎng)主機(jī)之前發(fā)送一個或多個數(shù)據(jù)包的結(jié)點(diǎn)的IP地址。 AT通過限制輸入數(shù)據(jù)包為一組“已知的”外部IP地址荒椭,有效地精簡了防火墻的規(guī)則谐鼎。

端口受限錐形NAT(Port-Restricted Cone NAT) 端口受限錐形NAT也類似,只當(dāng)外部數(shù)據(jù)包的IP地址和端口號都匹配內(nèi)網(wǎng)主機(jī)發(fā)送過的地址和端口號時才進(jìn)行轉(zhuǎn)發(fā)趣惠。 端口受限錐形NAT為內(nèi)部結(jié)點(diǎn)提供了和對稱NAT相同等級的保護(hù)狸棍,以隔離未關(guān)聯(lián)的數(shù)據(jù)身害。

對稱NAT(Symmetric NAT): 對稱NAT正好相反,不在所有公網(wǎng)-內(nèi)網(wǎng)對的會話中維持一個固定的端口綁定隔缀。其為每個新的會話開辟一個新的端口题造。

02

P2P通信

根據(jù)客戶端的不同,客戶端之間進(jìn)行P2P傳輸?shù)姆椒ㄒ猜杂胁煌常@里介紹了現(xiàn)有的穿越中間件進(jìn)行P2P通信的幾種技術(shù)界赔。

中繼(Relaying)

這是最可靠但也是最低效的一種P2P通信實(shí)現(xiàn)。其原理是通過一個有公網(wǎng)IP的服務(wù)器中間人對兩個內(nèi)網(wǎng)客戶端的通信數(shù)據(jù)進(jìn)行中繼和轉(zhuǎn)發(fā)牵触。如下圖所示:

客戶端A和客戶端B不直接通信淮悼,而是先都與服務(wù)端S建立鏈接,然后再通過S和對方建立的通路來中繼傳遞的數(shù)據(jù)揽思。這鐘方法的缺陷很明顯袜腥, 當(dāng)鏈接的客戶端變多之后,會顯著增加服務(wù)器的負(fù)擔(dān)钉汗,完全沒體現(xiàn)出P2P的優(yōu)勢羹令。但這種方法的好處是能保證成功,因此在實(shí)踐中也常作為一種備選方案损痰。

逆向鏈接(Connection reversal)

第二種方法在當(dāng)兩個端點(diǎn)中有一個不存在中間件的時候有效福侈。例如,客戶端A在NAT之后而客戶端B擁有全局IP地址卢未,如下圖:

客戶端A內(nèi)網(wǎng)地址為10.0.0.1肪凛,且應(yīng)用程序正在使用TCP端口1234。A和服務(wù)器S建立了一個鏈接辽社,服務(wù)器的IP地址為18.181.0.31伟墙,監(jiān)聽1235端口。NAT A給客戶端A分配了TCP端口62000滴铅,地址為NAT的公網(wǎng)IP地址155.99.25.11戳葵, 作為客戶端A對外當(dāng)前會話的臨時IP和端口。因此S認(rèn)為客戶端A就是155.99.25.11:6200 0汉匙。而B由于有公網(wǎng)地址拱烁,所以對S來說B就是138.76.29.7:1234。當(dāng)客戶端B想要發(fā)起一個對客戶端A的P2P鏈接時盹兢,要么鏈接A的外網(wǎng)地址155.99.25.11:62000,要么鏈接A的內(nèi)網(wǎng)地址10.0.0.1:1234守伸,然而兩種方式鏈接都會失敗绎秒。 鏈接10.0.0.1:123 4失敗自不用說,為什么鏈接155.99.25.1 1:62000也會失敗呢尼摹?來自B的TCP SYN握手請求到達(dá)NAT A的時候會被拒絕见芹,因?yàn)閷AT A來說只有外出的鏈接才是允許的剂娄。 在直接鏈接A失敗之后,B可以通過S向A中繼一個鏈接請求玄呛,從而從A方向“逆向“地建立起A-B之間的點(diǎn)對點(diǎn)鏈接阅懦。

很多當(dāng)前的P2P系統(tǒng)都實(shí)現(xiàn)了這種技術(shù),但其局限性也是很明顯的徘铝,只有當(dāng)其中一方有公網(wǎng)IP時鏈接才能建立耳胎。越來越多的情況下, 通信的雙方都在NAT之后惕它,因此就要用到我們下面介紹的第三種技術(shù)了怕午。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淹魄,隨后出現(xiàn)的幾起案子郁惜,更是在濱河造成了極大的恐慌,老刑警劉巖甲锡,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兆蕉,死亡現(xiàn)場離奇詭異,居然都是意外死亡缤沦,警方通過查閱死者的電腦和手機(jī)虎韵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疚俱,“玉大人劝术,你說我怎么就攤上這事〈艮龋” “怎么了养晋?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長梁钾。 經(jīng)常有香客問我绳泉,道長,這世上最難降的妖魔是什么姆泻? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任零酪,我火速辦了婚禮,結(jié)果婚禮上拇勃,老公的妹妹穿的比我還像新娘四苇。我一直安慰自己,他們只是感情好方咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布月腋。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榆骚。 梳的紋絲不亂的頭發(fā)上片拍,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音妓肢,去河邊找鬼捌省。 笑死,一個胖子當(dāng)著我的面吹牛碉钠,可吹牛的內(nèi)容都是我干的纲缓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼放钦,長吁一口氣:“原來是場噩夢啊……” “哼色徘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起操禀,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤褂策,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颓屑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斤寂,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年揪惦,在試婚紗的時候發(fā)現(xiàn)自己被綠了遍搞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡器腋,死狀恐怖溪猿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纫塌,我是刑警寧澤诊县,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站措左,受9級特大地震影響依痊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怎披,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一胸嘁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凉逛,春花似錦性宏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝌借。三九已至,卻和暖如春指蚁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背自晰。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工凝化, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酬荞。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓搓劫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親混巧。 傳聞我的和親對象是個殘疾皇子枪向,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容