日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

導(dǎo)語(yǔ)

最近介入測(cè)試P2P的相關(guān)邏輯,因此對(duì)NAT穿透原理做了一定程度的了解(當(dāng)然也沒(méi)有很深入)。。寫本文的目的就是,用自己的語(yǔ)言描述了這個(gè)過(guò)程,同時(shí)也在描述過(guò)程中加入了一些自己的理解,形成一篇文章作為要點(diǎn)的記錄。對(duì)于這一塊的知識(shí),自己也有很多盲點(diǎn),還請(qǐng)各路大神多多指教。

一、背景知識(shí)介紹

1.什么是NAT?

NAT(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換),也叫做網(wǎng)絡(luò)掩蔽或者IP掩蔽。NAT是一種網(wǎng)絡(luò)地址翻譯技術(shù),主要是將內(nèi)部的私有IP地址(private IP)轉(zhuǎn)換成可以在公網(wǎng)使用的公網(wǎng)IP(public IP)。

2.為什么會(huì)有NAT?

時(shí)光回到上個(gè)世紀(jì)80年代,當(dāng)時(shí)的人們?cè)谠O(shè)計(jì)網(wǎng)絡(luò)地址的時(shí)候,覺(jué)得再怎么樣也不會(huì)有超過(guò)32bits位長(zhǎng)即2的32次冪臺(tái)終端設(shè)備連入互聯(lián)網(wǎng),再加上增加ip的長(zhǎng)度(即使是從4字節(jié)增到6字節(jié))對(duì)當(dāng)時(shí)設(shè)備的計(jì)算、存儲(chǔ)、傳輸成本也是相當(dāng)巨大的。后來(lái)逐漸發(fā)現(xiàn)IP地址不夠用了,然后就NAT就誕生了!(雖然ipv6也是解決辦法,但始終普及不開(kāi)來(lái),而且未來(lái)到底ipv6夠不夠用仍是未知)。

因此,NAT技術(shù)能夠興起的原因還是因?yàn)樵谖覀儑?guó)家公網(wǎng)IP地址太少了,不夠用,所以才會(huì)采取這種地址轉(zhuǎn)換的策略。可見(jiàn),NAT的本質(zhì)就是讓一群機(jī)器公用同一個(gè)IP,這樣就暫時(shí)解決了IP短缺的問(wèn)題。

3.NAT有什么優(yōu)缺點(diǎn)?

優(yōu)勢(shì)其實(shí)上面已經(jīng)剛剛討論過(guò)了,根據(jù)定義,比較容易看出,NAT可以同時(shí)讓多個(gè)計(jì)算機(jī)同時(shí)聯(lián)網(wǎng),并隱藏其內(nèi)網(wǎng)IP,因此也增加了內(nèi)網(wǎng)的網(wǎng)絡(luò)安全性;此外,NAT對(duì)來(lái)自外部的數(shù)據(jù)查看其NAT映射記錄,對(duì)沒(méi)有相應(yīng)記錄的數(shù)據(jù)包進(jìn)行拒絕,提高了網(wǎng)絡(luò)安全性。

那么,NAT與此同時(shí)也帶來(lái)一些弊端:首先是,NAT設(shè)備會(huì)對(duì)數(shù)據(jù)包進(jìn)行編輯修改,這樣就降低了發(fā)送數(shù)據(jù)的效率;此外,各種協(xié)議的應(yīng)用各有不同,有的協(xié)議是無(wú)法通過(guò)NAT的(不能通過(guò)NAT的協(xié)議還是蠻多的),這就需要通過(guò)穿透技術(shù)來(lái)解決。我們后面會(huì)重點(diǎn)討論穿透技術(shù)。

簡(jiǎn)單的背景了解過(guò)后,下面介紹下NAT實(shí)現(xiàn)的主要方式,以及NAT都有哪些類型。

二、NAT實(shí)現(xiàn)方式及主要類型

1.NAT實(shí)現(xiàn)方式

1)靜態(tài)NAT:也就是靜態(tài)地址轉(zhuǎn)換。是指一個(gè)公網(wǎng)IP對(duì)應(yīng)一個(gè)私有IP,是一對(duì)一的轉(zhuǎn)換,同時(shí)注意,這里只進(jìn)行了IP轉(zhuǎn)換,而沒(méi)有進(jìn)行端口的轉(zhuǎn)換。舉個(gè)栗子:

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

2)NAPT:端口多路復(fù)用技術(shù)。與靜態(tài)NAT的差別是,NAPT不但要轉(zhuǎn)換IP地址,還要進(jìn)行傳輸層的端口轉(zhuǎn)換。具體的表現(xiàn)形式就是,對(duì)外只有一個(gè)公網(wǎng)IP,通過(guò)端口來(lái)區(qū)別不同私有IP主機(jī)的數(shù)據(jù)。再舉個(gè)栗子。

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

通過(guò)上面NAT實(shí)現(xiàn)方式的介紹,我們其實(shí)不難看出,現(xiàn)實(shí)環(huán)境中NAPT的應(yīng)用顯然是更廣泛的。因此下面就重點(diǎn)介紹下NAPT的主要類型有哪些。

2.NAT的主要類型

對(duì)于NAPT我們主要分為兩大類:錐型NAT和對(duì)稱型NAT。其中錐型NAT又分:完全錐型,受限錐型和端口受限錐型。概括的說(shuō):對(duì)稱型NAT是一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)端口;錐型NAT(非對(duì)稱NAT)是多個(gè)請(qǐng)求(外部發(fā)向內(nèi)部)對(duì)應(yīng)一個(gè)端口,只要源IP端口不變,無(wú)論發(fā)往的目的IP是否相同,在NAT上都映射為同一個(gè)端口,形象的看起來(lái)就像錐子一樣。下面分別介紹這四種類型及其差異。

1)完全錐型NAT(Full Cone NAT,后面簡(jiǎn)稱FC)

特點(diǎn):IP和端口都不受限。

表現(xiàn)形式:將來(lái)自內(nèi)部同一個(gè)IP地址同一個(gè)端口號(hào)(IP_IN_A : PORT_IN_A)的主機(jī)監(jiān)聽(tīng)/請(qǐng)求,映射到公網(wǎng)IP某個(gè)端口(IP_OUT_B : PORT_OUT_B)的監(jiān)聽(tīng)。任意外部IP地址與端口對(duì)其自己公網(wǎng)的IP這個(gè)映射后的端口訪問(wèn)(IP_OUT_B : PORT_OUT_B),都將重新定位到內(nèi)部這個(gè)主機(jī)(IP_IN_A : PORT_IN_A)。該技術(shù)中,基于C/S架構(gòu)的應(yīng)用可以在任何一端發(fā)起連接。是不是很繞啊。再簡(jiǎn)單一點(diǎn)的說(shuō),就是,只要客戶端,由內(nèi)到外建立一個(gè)映射(NatIP:NatPort -> A:P1)之后,其他IP的主機(jī)B或端口A:P2都可以使用這個(gè)洞給客戶端發(fā)送數(shù)據(jù)。見(jiàn)下圖(圖片來(lái)自網(wǎng)絡(luò))。

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

2)受限錐型NAT(Restricted Cone NAT)

特點(diǎn):IP受限,端口不受限。

表現(xiàn)形式:與完全錐形NAT不同的是,在公網(wǎng)映射端口后,并不允許所有IP進(jìn)行對(duì)于該端口的訪問(wèn),要想通信必需內(nèi)部主機(jī)對(duì)某個(gè)外部IP主機(jī)發(fā)起過(guò)連接,然后這個(gè)外部IP主機(jī)就可以與該內(nèi)部主機(jī)通信了,但端口不做限制。舉個(gè)栗子。當(dāng)客戶端由內(nèi)到外建立映射(NatIP:NatPort –> A:P1),A機(jī)器可以使用他的其他端口(P2)主動(dòng)連接客戶端,但B機(jī)器則不被允許。因?yàn)镮P受限啦,但是端口隨便。見(jiàn)下圖(綠色是允許通信,紅色是禁止通信)。

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

3)端口受限型NAT(Port Restricted Cone NAT)

特點(diǎn):IP和端口都受限。

表現(xiàn)形式:該技術(shù)與受限錐形NAT相比更為嚴(yán)格。除具有受限錐形NAT特性,對(duì)于回復(fù)主機(jī)的端口也有要求。也就是說(shuō):只有當(dāng)內(nèi)部主機(jī)曾經(jīng)發(fā)送過(guò)報(bào)文給外部主機(jī)(假設(shè)其IP地址為A且端口為P1)之后,外部主機(jī)才能以公網(wǎng)IP:PORT中的信息作為目標(biāo)地址和目標(biāo)端口,向內(nèi)部主機(jī)發(fā)送UDP報(bào)文,同時(shí),其請(qǐng)求報(bào)文的IP必須是A,端口必須為P1(使用IP地址為A,端口為P2,或者IP地址為B,端口為P1都將通信失敗)。例子見(jiàn)下圖。這一要求進(jìn)一步強(qiáng)化了對(duì)外部報(bào)文請(qǐng)求來(lái)源的限制,從而較Restrictd Cone更具安全性。

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

4)對(duì)稱型NAT(Symmetric NAT)

特點(diǎn):對(duì)每個(gè)外部主機(jī)或端口的會(huì)話都會(huì)映射為不同的端口(洞)。

表現(xiàn)形式:只有來(lái)自同一內(nèi)部IP:PORT、且針對(duì)同一目標(biāo)IP:PORT的請(qǐng)求才被NAT轉(zhuǎn)換至同一個(gè)公網(wǎng)(外部)IP:PORT,否則的話,NAT將為之分配一個(gè)新的外部(公網(wǎng))IP:PORT。并且,只有曾經(jīng)收到過(guò)內(nèi)部主機(jī)請(qǐng)求的外部主機(jī)才能向內(nèi)部主機(jī)發(fā)送數(shù)據(jù)包。內(nèi)部主機(jī)用同一IP與同一端口與外部多IP通信。客戶端想和服務(wù)器A(IP_A:PORT_A)建立連接,是通過(guò)NAT映射為NatIP:NatPortA來(lái)進(jìn)行的。而客戶端和服務(wù)器B(IP_B:PORT_B)建立連接,是通過(guò)NAT映射為NatIP:NatPortB來(lái)進(jìn)行的。即同一個(gè)客戶端和不同的目標(biāo)IP:PORT通信,經(jīng)過(guò)NAT映射后的公網(wǎng)IP:PORT是不同的。此時(shí),如果B想要和客戶端通信,也只能通過(guò)NatIP:NatPortB(也就是紫色的洞洞)來(lái)進(jìn)行,而不能通過(guò)NatIP:NatPortA(也就是黃色的洞洞)。

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

以上,就是NAPT的四種NAT類型。可以看出由類型1)至類型4),NAT的限制是越來(lái)越大的。

三、NAT路由類型判斷

根據(jù)上面的介紹,我們可以了解到,在實(shí)際的網(wǎng)絡(luò)情況中,各個(gè)設(shè)備所處的網(wǎng)絡(luò)環(huán)境是不同的。那么,如果這些設(shè)備想要進(jìn)行通信,首先判斷出設(shè)備所處的網(wǎng)絡(luò)類型就是非常重要的一步。舉個(gè)例子來(lái)說(shuō):對(duì)于視頻會(huì)議和VoIP軟件,對(duì)位于不同NAT內(nèi)部的主機(jī)通信需要靠服務(wù)器來(lái)轉(zhuǎn)發(fā)完成,這樣就會(huì)增加服務(wù)器的負(fù)擔(dān)。為了解決這種問(wèn)題,要盡量使位于不同NAT內(nèi)部的主機(jī)建立直接通信,其中,最重要的一點(diǎn)就是要判斷出NAT的類型,然后才能根據(jù)NAT的類型,設(shè)計(jì)出直接通信方案。不然的話,兩個(gè)都在NAT的終端怎么通信呢?我們不知道對(duì)方的內(nèi)網(wǎng)IP,即使把消息發(fā)到對(duì)方的網(wǎng)關(guān),然后呢?網(wǎng)關(guān)怎么知道這條消息給誰(shuí),而且誰(shuí)允許網(wǎng)關(guān)這么做了?

為了解決這個(gè)問(wèn)題,也就是處于內(nèi)網(wǎng)的主機(jī)之間能夠穿越它們之間的NAT建立直接通信,已經(jīng)提出了許多方法,STUN(Session Traversal Utilities for NAT,NAT會(huì)話穿越應(yīng)用程序)技術(shù)就是其中比較重要的一種解決方法,并得到了廣泛的應(yīng)用。在這個(gè)部分,我們將重點(diǎn)介紹下STUN技術(shù)的原理。(PS:除此之外,還有UPNP技術(shù),ALG應(yīng)用層網(wǎng)關(guān)識(shí)別技術(shù),SBC會(huì)話邊界控制,ICE交互式連接建立,TURN中繼NAT穿越技術(shù)等等,本文不一一做介紹。)

四、STUN協(xié)議

STUN是一種網(wǎng)絡(luò)協(xié)議,它允許位于NAT(或多重NAT)后的客戶端找出自己的公網(wǎng)地址,查出自己位于哪種類型的NAT之后以及NAT為某一個(gè)本地端口所綁定的Internet端端口。這些信息被用來(lái)在兩個(gè)同時(shí)處于NAT路由器之后的主機(jī)之間建立UDP通信。該協(xié)議由RFC 5389定義。STUN由三部分組成:STUN客戶端、STUN服務(wù)器端、NAT路由器。STUN服務(wù)端部署在一臺(tái)有著兩個(gè)公網(wǎng)IP的服務(wù)器上。大概的結(jié)構(gòu)參考下圖。STUN客戶端通過(guò)向服務(wù)器端發(fā)送不同的消息類型,根據(jù)服務(wù)器端不同的響應(yīng)來(lái)做出相應(yīng)的判斷,一旦客戶端得知了Internet端的UDP端口,通信就可以開(kāi)始了。

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

STUN協(xié)議定義了三類測(cè)試過(guò)程來(lái)檢測(cè)NAT類型。

Test1:STUN Client通過(guò)端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}發(fā)送一個(gè)Binding Request(沒(méi)有設(shè)置任何屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-S1:Port-S1}把它所看到的STUN Client的IP和端口{IP-M1,Port-M1}作為Binding Response的內(nèi)容回送給STUN Client。 Test1#2:STUN Client通過(guò)端口{IP-C1:Port-C1}向STUN Server{IP-S2:Port-S2}發(fā)送一個(gè)Binding Request(沒(méi)有設(shè)置任何屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M1#2,Port-M1#2}作為Binding Response的內(nèi)容回送給STUN Client。

Test2:STUN Client通過(guò)端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}發(fā)送一個(gè)Binding Request(設(shè)置了Change IP和Change Port屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M2,Port-M2}作為Binding Response的內(nèi)容回送給STUN Client。

Test3:STUN Client通過(guò)端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}發(fā)送一個(gè)Binding Request(設(shè)置了Change Port屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-S1:Port-S2}把它所看到的STUN Client的IP和端口{IP-M3,Port-M3}作為Binding Response的內(nèi)容回送給STUN Client。

STUN協(xié)議的輸出是: 1)公網(wǎng)IP和Port 2)防火墻是否設(shè)置 3)客戶端是否在NAT之后,及所處的NAT的類型

因此我們進(jìn)而整理出,通過(guò)STUN協(xié)議,我們可以檢測(cè)的類型一共有以下七種:

A:公開(kāi)的互聯(lián)網(wǎng)IP。主機(jī)擁有公網(wǎng)IP,并且沒(méi)有防火墻,可自由與外部通信 B:完全錐形NAT。 C:受限制錐形NAT。 D:端口受限制形NAT。 E:對(duì)稱型UDP防火墻。主機(jī)出口處沒(méi)有NAT設(shè)備,但有防火墻,且防火墻規(guī)則如下:從主機(jī)UDP端口A發(fā)出的數(shù)據(jù)包保持源地址,但只有從之前該主機(jī)發(fā)出包的目的IP/PORT發(fā)出到該主機(jī)端口A的包才能通過(guò)防火墻。 F:對(duì)稱型NAT G:防火墻限制UDP通信。

輸入和輸出準(zhǔn)備好后,附上一張維基百科的流程圖,就可以描述STUN協(xié)議的判斷過(guò)程了。

通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

 

STEP1:檢測(cè)客戶端是否有能力進(jìn)行UDP通信以及客戶端是否位于NAT后 -- Test1 客戶端建立UDP socket,然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port,客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包。重復(fù)幾次。 a)如果每次都超時(shí)收不到服務(wù)器的響應(yīng),則說(shuō)明客戶端無(wú)法進(jìn)行UDP通信,可能是:G防火墻阻止UDP通信 b)如果能收到回應(yīng),則把服務(wù)器返回的客戶端的(IP:PORT)同(Local IP: Local Port)比較: 如果完全相同則客戶端不在NAT后,這樣的客戶端是:A具有公網(wǎng)IP可以直接監(jiān)聽(tīng)UDP端口接收數(shù)據(jù)進(jìn)行通信或者E。 否則客戶端在NAT后要做進(jìn)一步的NAT類型檢測(cè)(繼續(xù))。

STEP2:檢測(cè)客戶端防火墻類型 -- Test2 STUN客戶端向STUN服務(wù)器發(fā)送請(qǐng)求,要求服務(wù)器從其他IP和PORT向客戶端回復(fù)包: a)收不到服務(wù)器從其他IP地址的回復(fù),認(rèn)為包前被前置防火墻阻斷,網(wǎng)絡(luò)類型為E b)收到則認(rèn)為客戶端處在一個(gè)開(kāi)放的網(wǎng)絡(luò)上,網(wǎng)絡(luò)類型為A

STEP3:檢測(cè)客戶端NAT是否是FULL CONE NAT -- Test2 客戶端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用另一對(duì)(IP-2,Port-2)響應(yīng)客戶端的請(qǐng)求往回發(fā)一個(gè)數(shù)據(jù)包,客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包。 重復(fù)這個(gè)過(guò)程若干次。 a)如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶端的NAT不是一個(gè)Full Cone NAT,具體類型有待下一步檢測(cè)(繼續(xù))。 b)如果能夠接受到服務(wù)器從(IP-2,Port-2)返回的應(yīng)答UDP包,則說(shuō)明客戶端是一個(gè)Full Cone NAT,這樣的客戶端能夠進(jìn)行UDP-P2P通信。

STEP4:檢測(cè)客戶端NAT是否是SYMMETRIC NAT -- Test1#2 客戶端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port, 客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包。 重復(fù)這個(gè)過(guò)程直到收到回應(yīng)(一定能夠收到,因?yàn)榈谝徊奖WC了這個(gè)客戶端可以進(jìn)行UDP通信)。 用同樣的方法用一個(gè)socket向服務(wù)器的(IP-2,Port-2)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶端的IP和Port。 比較上面兩個(gè)過(guò)程從服務(wù)器返回的客戶端(IP,Port),如果兩個(gè)過(guò)程返回的(IP,Port)有一對(duì)不同則說(shuō)明客戶端為Symmetric NAT,這樣的客戶端無(wú)法進(jìn)行UDP-P2P通信(檢測(cè)停止)因?yàn)閷?duì)稱型NAT,每次連接端口都不一樣,所以無(wú)法知道對(duì)稱NAT的客戶端,下一次會(huì)用什么端口。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(cè)(繼續(xù))。

STEP5:檢測(cè)客戶端NAT是Restricted Cone 還是 Port Restricted Cone -- Test3 客戶端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用IP-1和一個(gè)不同于Port-1的端口發(fā)送一個(gè)UDP 數(shù)據(jù)包響應(yīng)客戶端, 客戶端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包。重復(fù)這個(gè)過(guò)程若干次。如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶端是一個(gè)Port Restricted Cone NAT,如果能夠收到服務(wù)器的響應(yīng)則說(shuō)明客戶端是一個(gè)Restricted Cone NAT。以上兩種NAT都可以進(jìn)行UDP-P2P通信。

通過(guò)以上過(guò)程,至此,就可以分析和判斷出客戶端是否處于NAT之后,以及NAT的類型及其公網(wǎng)IP,以及判斷客戶端是否具備P2P通信的能力了。

分享到:
標(biāo)簽:穿透 NAT
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定