p2p實(shí)現(xiàn)原理
什么是打洞,為什么要打洞
由于Internet的快速發(fā)展 IPV4地址不夠用,不能每個(gè)主機(jī)分到一個(gè)公網(wǎng)IP 所以使用NAT地址轉(zhuǎn)換。
下面是我在網(wǎng)上找到的一副圖
一般來(lái)說(shuō)都是由私網(wǎng)內(nèi)主機(jī)(例如上圖中“電腦A-01”)主動(dòng)發(fā)起連接,數(shù)據(jù)包經(jīng)過(guò)NAT地址轉(zhuǎn)換后送給公網(wǎng)上的服務(wù)器(例如上圖中的“Server”),連接建立以后可雙向傳送數(shù)據(jù),NAT設(shè)備允許私網(wǎng)內(nèi)主機(jī)主動(dòng)向公網(wǎng)內(nèi)主機(jī)發(fā)送數(shù)據(jù),但卻禁止反方向的主動(dòng)傳遞,但在一些特殊的場(chǎng)合需要不同私網(wǎng)內(nèi)的主機(jī)進(jìn)行互聯(lián)(例如P2P軟件、網(wǎng)絡(luò)會(huì)議、視頻傳輸?shù)龋?,TCP穿越NAT的問(wèn)題必須解決。
下面是NAT的幾種類型
NAT設(shè)備的類型對(duì)于TCP穿越NAT,有著十分重要的影響,根據(jù)端口映射方式,NAT可分為如下4類,前3種NAT類型可統(tǒng)稱為cone類型。(1)全克隆( Full Clone) : NAT把所有來(lái)自相同內(nèi)部IP地址和端口的請(qǐng)求映射到相同的外部IP地址和端口。任何一個(gè)外部主機(jī)均可通過(guò)該映射發(fā)送IP包到該內(nèi)部主機(jī)。(2)限制性克隆(Restricted Clone) : NAT把所有來(lái)自相同內(nèi)部IP地址和端口的請(qǐng)求映射到相同的外部IP地址和端口。但是,只有當(dāng)內(nèi)部主機(jī)先給IP地址為X的外部主機(jī)發(fā)送IP包,該外部主機(jī)才能向該內(nèi)部主機(jī)發(fā)送IP包。(3)端口限制性克隆( Port Restricted Clone) :端口限制性克隆與限制性克隆類似,只是多了端口號(hào)的限制,即只有內(nèi)部主機(jī)先向IP地址為X,端口號(hào)為P的外部主機(jī)發(fā)送1個(gè)IP包,該外部主機(jī)才能夠把源端口號(hào)為P的IP包發(fā)送給該內(nèi)部主機(jī)。(4)對(duì)稱式NAT ( Symmetric NAT) :這種類型的NAT與上述3種類型的不同,在于當(dāng)同一內(nèi)部主機(jī)使用相同的端口與不同地址的外部主機(jī)進(jìn)行通信時(shí), NAT對(duì)該內(nèi)部主機(jī)的映射會(huì)有所不同。對(duì)稱式NAT不保證所有會(huì)話中的私有地址和公開(kāi)IP之間綁定的一致性。相反,它為每個(gè)新的會(huì)話分配一個(gè)新的端口號(hào)。
先假設(shè):有一個(gè)服務(wù)器S在公網(wǎng)上有一個(gè)IP,兩個(gè)私網(wǎng)分別由NAT-A和NAT-B連接到公網(wǎng),NAT-A后面有一臺(tái)客戶端A,NAT-B后面有一臺(tái)客戶端B,現(xiàn)在,我們需要借助S將A和B建立直接的TCP連接,即由B向A打一個(gè)洞,讓A可以沿這個(gè)洞直接連接到B主機(jī),就好像NAT-B不存在一樣。
實(shí)現(xiàn)過(guò)程如下:1、 S啟動(dòng)兩個(gè)網(wǎng)絡(luò)偵聽(tīng),一個(gè)叫【主連接】偵聽(tīng),一個(gè)叫【協(xié)助打洞】的偵聽(tīng)。2、 A和B分別與S的【主連接】保持聯(lián)系。3、 當(dāng)A需要和B建立直接的TCP連接時(shí),首先連接S的【協(xié)助打洞】端口,并發(fā)送協(xié)助連接申請(qǐng)。同時(shí)在該端口號(hào)上啟動(dòng)偵聽(tīng)。注意由于要在相同的網(wǎng)絡(luò)終端上綁定到不同的套接字上,所以必須為這些套接字設(shè)置 SO_REUSEADDR 屬性(即允許重用),否則偵聽(tīng)會(huì)失敗。4、 S的【協(xié)助打洞】連接收到A的申請(qǐng)后通過(guò)【主連接】通知B,并將A經(jīng)過(guò)NAT-A轉(zhuǎn)換后的公網(wǎng)IP地址和端口等信息告訴B。5、 B收到S的連接通知后首先與S的【協(xié)助打洞】端口連接,隨便發(fā)送一些數(shù)據(jù)后立即斷開(kāi),這樣做的目的是讓S能知道B經(jīng)過(guò)NAT-B轉(zhuǎn)換后的公網(wǎng)IP和端口號(hào)。6、 B嘗試與A的經(jīng)過(guò)NAT-A轉(zhuǎn)換后的公網(wǎng)IP地址和端口進(jìn)行connect,根據(jù)不同的路由器會(huì)有不同的結(jié)果,有些路由器在這個(gè)操作就能建立連接,大多數(shù)路由器對(duì)于不請(qǐng)自到的SYN請(qǐng)求包直接丟棄而導(dǎo)致connect失敗,但NAT-A會(huì)紀(jì)錄此次連接的源地址和端口號(hào),為接下來(lái)真正的連接做好了準(zhǔn)備,這就是所謂的打洞,即B向A打了一個(gè)洞,下次A就能直接連接到B剛才使用的端口號(hào)了。7、 客戶端B打洞的同時(shí)在相同的端口上啟動(dòng)偵聽(tīng)。B在一切準(zhǔn)備就緒以后通過(guò)與S的【主連接】回復(fù)消息“我已經(jīng)準(zhǔn)備好”,S在收到以后將B經(jīng)過(guò)NAT-B轉(zhuǎn)換后的公網(wǎng)IP和端口號(hào)告訴給A。8、 A收到S回復(fù)的B的公網(wǎng)IP和端口號(hào)等信息以后,開(kāi)始連接到B公網(wǎng)IP和端口號(hào),由于在步驟6中B曾經(jīng)嘗試連接過(guò)A的公網(wǎng)IP地址和端口,NAT-A紀(jì)錄了此次連接的信息,所以當(dāng)A主動(dòng)連接B時(shí),NAT-B會(huì)認(rèn)為是合法的SYN數(shù)據(jù),并允許通過(guò),從而直接的TCP連接建立起來(lái)了。
-
P2P
+關(guān)注
關(guān)注
0文章
152瀏覽量
27209 -
NAT
+關(guān)注
關(guān)注
0文章
148瀏覽量
16520
原文標(biāo)題:p2p實(shí)現(xiàn)原理及打洞技術(shù)介紹
文章出處:【微信號(hào):C_Expert,微信公眾號(hào):C語(yǔ)言專家集中營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
LC-DC01P2 LC-DC01P2

LC-AC01P2 LC-AC01P2

一文讀懂:LED 驅(qū)動(dòng)電路二極管挑選要點(diǎn)
請(qǐng)問(wèn)TSC2014IYZGT和TSC2017IYZGR是否可以P2P替換?
P2link內(nèi)網(wǎng)穿透兩大亮點(diǎn)—不限速使用—多設(shè)備集中管理
一款高性能內(nèi)網(wǎng)穿透工具——P2link

評(píng)論