一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

通過(guò)middlebox實(shí)施P2P通訊

 筱肆 2013-12-19

通過(guò)middlebox實(shí)施P2P通訊

[文章信息]
作者blog:   http://www./User6/caimouse/index.html

作者的話:  我是一邊看一邊隨手翻的,翻的很差,本來(lái)不好意思貼出來(lái)的,可能大家看原文更明白些。希望對(duì)大家有一些幫助,我的目的是希望能和有興趣和正在做P2P的程序員們結(jié)交朋友,謝謝大家支持。 
作者的MSN:blovearcher@hotmail.com
作者的 QQ: 27443675

epan提示:下面有些圖看不清楚的可以copy到記事本看,記事本不要自動(dòng)換行.

 1. 介紹
 今天的Internet的"middleboxes"已經(jīng)普遍存在, 比如象網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT),主要是因?yàn)镮Pv4的地址空間消耗危機(jī)中產(chǎn)生的一個(gè)解決方案。然而,由這些"middleboxes"建立的不對(duì)稱尋址和連接,已經(jīng)成為點(diǎn)對(duì)點(diǎn) (P2P)應(yīng)用和協(xié)議中獨(dú)特的問(wèn)題, 這些應(yīng)用和協(xié)議包括例如網(wǎng)絡(luò)電話和多人在線游戲。這些話題甚至可能在使用 IPv6 協(xié)議后繼續(xù)存在, 比如說(shuō)在 NAT 常被當(dāng)作兼容 IPv4 機(jī)制[NAT-PT]的地方,還有當(dāng)NAT 不再需要之后,防火墻將會(huì)依然存在(這些問(wèn)題)。

 當(dāng)前發(fā)展的"middleboxes"最初計(jì)劃用在C/S結(jié)構(gòu)中,即在那些相關(guān)的匿名客戶端主動(dòng)去連接有著固定IP地址和DNS域名的可連接主機(jī)。大多數(shù)的"middleboxes"實(shí)現(xiàn)一個(gè)不對(duì)稱的溝通模型,即那些私有的內(nèi)部網(wǎng)絡(luò)上的主機(jī)可以和公網(wǎng)上的主機(jī)連接通訊,但是公網(wǎng)上的外部主機(jī)不能夠和內(nèi)網(wǎng)上的主機(jī)通訊除了被 middlebox''s 的管理者明確地配置之外。 在 NAPT 的通常情形中,在內(nèi)部網(wǎng)絡(luò)上的一位客戶機(jī)在公網(wǎng)上并沒(méi)有一個(gè)唯一獨(dú)特的IP地址,但是可以在同一私網(wǎng)上的其他客戶機(jī)一樣,分享一個(gè)公網(wǎng)IP地址,并有NAPT管理。 這些在一臺(tái)"middlebox"后的不知道名稱和不易訪問(wèn)的內(nèi)部主機(jī)對(duì)客戶端軟件比如網(wǎng)頁(yè)瀏覽器并不是一個(gè)問(wèn)題,它們之需要向外連接。而且這種不易訪問(wèn)的特性有時(shí)候被視為對(duì)保護(hù)隱私有利。

 但是,在點(diǎn)對(duì)點(diǎn)的應(yīng)用中,英特網(wǎng)上的主機(jī)通常會(huì)考慮要和"客戶"建立直接和彼此訪問(wèn)的通話連接。呼叫者和被叫者可能會(huì)在不同的"middleboxes" 后面,兩者都可能沒(méi)有任何的固定IP地址或者其他的公網(wǎng)存在表現(xiàn)。舉例來(lái)說(shuō),一個(gè)通常的在線游戲架構(gòu),是讓參加游戲的主人連接到一個(gè)大家都知道的服務(wù)器上設(shè)定一些初識(shí)值,以及連接后的使用目的。然后,為了在游戲期間有更加快速和有效的游戲速度,需要建立彼此直接的連接。同樣地,一個(gè)可共享的文件可能可以讓一個(gè)大家都知道的資源搜索引擎發(fā)現(xiàn)或者查找到,但如果需要文件數(shù)據(jù)傳輸,就需要和那臺(tái)共享文件的主機(jī)建立直接的連接了。在點(diǎn)對(duì)點(diǎn)連接時(shí),"middlebox"就生成了一個(gè)問(wèn)題。因?yàn)樵?middlebox"后面的那些需要用TCP或者UDP和其他機(jī)器連接的主機(jī)通常沒(méi)有固定可用的公網(wǎng)端口可以進(jìn)行連接。 RFC 3235[ NAT-APPL]簡(jiǎn)短地說(shuō)明了這個(gè)問(wèn)題,但是沒(méi)有提供任何的通常解決方案。

 在這一份文檔中,我們就 P2P/ middlebox 問(wèn)題有2點(diǎn)說(shuō)明。 首先,我們總結(jié)那些在middleboxes存在時(shí)P2P應(yīng)用程序可以工作的已知方法。其次,我們提供基于這些實(shí)踐的一套應(yīng)用程序設(shè)計(jì)指導(dǎo)方針使P2P在middleboxes下應(yīng)用的更健康。更進(jìn)一步,我們提供的設(shè)計(jì)指導(dǎo)方針可以讓將來(lái)的 middleboxes 更有效率的支持支援 P2P 應(yīng)用。 我們的重點(diǎn)是要能夠穿透 middleboxes,以提供更廣闊和更直接的P2P 應(yīng)用。

 2. 術(shù)語(yǔ)
 在本章中我們首先簡(jiǎn)要描述一下一些"middlebox"術(shù)語(yǔ),我們這里的重點(diǎn)是兩種常導(dǎo)致P2P應(yīng)用出現(xiàn)問(wèn)題的middlebox.

 防火墻
 一個(gè)防火墻限制私人內(nèi)網(wǎng)和公眾英特網(wǎng)之間的通訊,典型地防火墻就是丟棄那些它認(rèn)為未經(jīng)許可的數(shù)據(jù)包。在數(shù)據(jù)包穿越一個(gè)防火墻時(shí),它檢查但是不修改包里的 IP地址和TCP/ UDP 端口信息。
  
 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)
 當(dāng)數(shù)據(jù)包穿過(guò)NAT時(shí),NAT不僅檢查同時(shí)也修改數(shù)據(jù)的包頭信息,并且允許更多的在NAT后的主機(jī)分享少數(shù)公網(wǎng)IP地址(通常只有1個(gè))。

 NAT通常有2種主要類型:
 Basic Nat
 一個(gè)Basic NAT映射一個(gè)內(nèi)在的私有IP地址到一個(gè)公網(wǎng)IP地址,但當(dāng)數(shù)據(jù)包穿過(guò)NAT時(shí),不更換它的TCP/UDP端口號(hào)。Basic Nat通常是只用在一些具備公共IP地址池的NAT上,通過(guò)它可以地址綁定,即代表一臺(tái)內(nèi)部主機(jī)。

 Network Address/Port Translator (NAPT)
 但是最通常的,當(dāng)數(shù)據(jù)包穿過(guò)NAT時(shí),一個(gè)NAPT檢查并修改它的TCP/UDP端口,那么就可以允許多臺(tái)內(nèi)網(wǎng)主機(jī)同時(shí)共享一個(gè)單獨(dú)的公網(wǎng)IP地址了。

 關(guān)于 NAT 的分類和術(shù)語(yǔ),[NAT-TRAD] 和 [NAT-TERM]中有更多的信息。那些將來(lái)分類的NAPT的附加術(shù)語(yǔ)在較近的工作[STUN]中被定義。當(dāng)一個(gè)內(nèi)網(wǎng)的主機(jī)經(jīng)過(guò)一個(gè)NAT和外部進(jìn)行TCP或者UDP連接的期間,NAPT分配一個(gè)公網(wǎng)IP 住址和端口,以便來(lái)自外部終端響應(yīng)的數(shù)據(jù)包能被NAPT接收,解釋,并轉(zhuǎn)發(fā)給內(nèi)網(wǎng)的主機(jī)。這個(gè)結(jié)果是由 NAPT 建立一個(gè)(私有IP地址,私有端口)和(公網(wǎng)IP地址,公網(wǎng)端口)之間的端口綁定實(shí)現(xiàn)的。在這個(gè)期間NAPT將為綁定的端口執(zhí)行地址翻譯。一個(gè)關(guān)于P2P應(yīng)用的問(wèn)題是,當(dāng)一個(gè)內(nèi)部主機(jī)從一個(gè)私有IP,私有端口同時(shí)與外網(wǎng)上的多臺(tái)不同的主機(jī)建立多個(gè)連接時(shí),NAT是如何運(yùn)作的。

 Cone NAT
 建立一個(gè)端口,把一個(gè)(私有IP,私有端口)和(公用IP,公用端口)綁定后,對(duì)于以后來(lái)自同一私有IP和端口號(hào)的應(yīng)用連接,cone NAT將重復(fù)使用這個(gè)綁定的端口,只要有一個(gè)連接會(huì)話,這個(gè)綁定端口就會(huì)保持激活狀態(tài)。
 例如,下面圖表中,推想一下客戶端A通過(guò)一個(gè)cone NAT同時(shí)建立2個(gè)外部會(huì)話,從同樣的內(nèi)部網(wǎng)絡(luò)終端(10.0.0.1:1234)到2個(gè)不同的外部服務(wù)器,S1和S2。cone NAT只會(huì)分配一個(gè)公用的終端,155.99.25.11:62000,都會(huì)到兩個(gè)會(huì)話,并在地址轉(zhuǎn)換期間確??蛻舳硕丝诘囊恢?。Basic NAT和防火墻不修改通過(guò)middlebox的數(shù)據(jù)包中的端口號(hào),這些類型的middlebox可以被認(rèn)為是一種特殊的Cone Nat。

  Server S1                                     Server S2
         18.181.0.31:1235                              138.76.29.7:1235
                |                                             |
                |                                             |
                +----------------------+----------------------+
                                       |
           ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
           |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
           v 155.99.25.11:62000 v      |      v 155.99.25.11:62000 v
                                       |
                                    Cone NAT
                                  155.99.25.11
                                       |
           ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
           |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
           v   10.0.0.1:1234    v      |      v   10.0.0.1:1234    v
                                       |
                                    Client A
                                 10.0.0.1:1234

 Symmetric NAT
 對(duì)稱的NAT(Symmetric NAT),與Cone NAT有明顯差別,在所有會(huì)話期間中不會(huì)保持綁定(私有IP,私有端口)和(公共IP,公共端口)的端口不變。相反,它會(huì)為每個(gè)新對(duì)話重新分配一個(gè)新的公共端口。
 舉例來(lái)說(shuō),設(shè)想客戶A從同樣端口上要發(fā)起兩個(gè)外部對(duì)話,一個(gè)和S1連接,另一個(gè)和S2連接。Symmetric NAT可能會(huì)為第一個(gè)會(huì)話分配一個(gè)公共的端點(diǎn) 155.99.25.11:62000,而為第二個(gè)會(huì)話分配一個(gè)不同的公共端點(diǎn)155.99.25.11:62001。為了地址轉(zhuǎn)換,NAT可以區(qū)分這兩個(gè)會(huì)話傳輸?shù)哪康?,因?yàn)楹瓦@些會(huì)話有關(guān)的外部端點(diǎn)(就是S1、S2)是不同的,甚至在通過(guò)地址轉(zhuǎn)換時(shí)丟失了客戶端的目的標(biāo)示。(即丟了S1、S2的IP地址NAT也知道如何區(qū)分,我是這么理解的,可能有誤。)

            Server S1                                     Server S2
         18.181.0.31:1235                              138.76.29.7:1235
                |                                             |
                |                                             |
                +----------------------+----------------------+
                                       |
           ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
           |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
           v 155.99.25.11:62000 v      |      v 155.99.25.11:62001 v
                                       |
                                  Symmetric NAT
                                  155.99.25.11
                                       |
           ^  Session 1 (A-S1)  ^      |      ^  Session 2 (A-S2)  ^
           |  18.181.0.31:1235  |      |      |  138.76.29.7:1235  |
           v   10.0.0.1:1234    v      |      v   10.0.0.1:1234    v
                                       |
                                    Client A
                                 10.0.0.1:1234

 Cone NAT和Symmetric NAT之間的比較與TCP/UDP之間的比較有些類似。(TCP需要綁定,UDP不需要,Cone NAT需要綁定,Symmetric NAT不需要)

 按照NAT從已知的公共IP,公共端口接收的數(shù)據(jù)限制,Cone NAT可以更進(jìn)一步的進(jìn)行分類。這種分類通常都是UDP連接的,因?yàn)镹AT和防火墻會(huì)拒絕任何無(wú)條件的TCP連接,除非明確地以別的方式配置。

 Full Cone NAT
 在給一個(gè)新的外部會(huì)話建立了一個(gè)公共/私有的端口綁定后,一個(gè)full cone NAT就可以通過(guò)這個(gè)公共端口從公網(wǎng)上的任何外部端點(diǎn)接收數(shù)據(jù)通訊了。Full cone NAT也常常叫做"混合"NAT。

 Restricted Cone NAT
 當(dāng)網(wǎng)絡(luò)主機(jī)發(fā)一個(gè)或者幾個(gè)數(shù)據(jù)包給外部主機(jī)后,一個(gè)受限的cone NAT(Restricted Cone NAT)才會(huì)接受來(lái)自這個(gè)外部(源)IP地址的數(shù)據(jù)包。受限的cone NAT有效的運(yùn)用了防火墻的原理,拒絕沒(méi)有要求的數(shù)據(jù),只接收已知道的外部IP地址傳來(lái)的數(shù)據(jù)。(偏開(kāi)原文,大意就是網(wǎng)絡(luò)主機(jī)需要發(fā)一個(gè)請(qǐng)求給外部IP地址要求要數(shù)據(jù),NAT才會(huì)接收這個(gè)外部IP地址傳來(lái)的數(shù)據(jù),不然不接收。)

 Port-Restricted Cone NAT
 一個(gè)端口受限的cone NAT(Port-Restricted Cone NAT),也是這樣,只接收那些網(wǎng)絡(luò)主機(jī)曾經(jīng)發(fā)給一個(gè)外部IP地址和端口相匹配的數(shù)據(jù)。一個(gè)Port-Restricted cone NAT可以和對(duì)稱 NAT一樣(symmetric NAT),保護(hù)內(nèi)部節(jié)點(diǎn)不接收未被請(qǐng)求的數(shù)據(jù)包,但是保持一個(gè)私有端口在連接過(guò)程中不變。
 (偏開(kāi)原文,即不僅請(qǐng)求的IP和外部發(fā)來(lái)數(shù)據(jù)的IP是一樣的,PORT也要是一樣,這樣才接收數(shù)據(jù)。對(duì)稱NAT也有這個(gè)效果,但這種cone NAT保持端口不變,而對(duì)稱NAT要變端口號(hào)的)。

 最后,在這篇文檔中我們定義一些新的術(shù)語(yǔ)來(lái)給middleboxes中有關(guān)P2P的行為進(jìn)行分類:

 P2P-Application
 在這篇文檔中P2P-Application被當(dāng)做一個(gè)應(yīng)用程序,在那些參與P2P連接的并在一個(gè)公共的登錄服務(wù)器注冊(cè)的終端運(yùn)行,可以是一個(gè)私有端點(diǎn),也可以是一個(gè)公共端點(diǎn),或者兩者都是,并建立一個(gè)初步的會(huì)話。

 P2P-Middlebox
 P2P- Middlebox就是允許P2P應(yīng)用程序交換數(shù)據(jù)的的middlebox。

 P2P-firewall
 一個(gè)P2P-防火墻就是提供防火墻功能的P2P- Middlebox,但不具備地址映射功能。

 P2P-NAT
 P2P-NAT就是提供NAT功能,也提供防火墻功能的P2P- Middlebox。一臺(tái)P2P- Middlebox必須為UDP傳輸至少提供Cone NAT功能,允許應(yīng)用程序使用UDP建立完整的P2P連接。
   
 loopback translation(自環(huán)映射)
 當(dāng)一臺(tái)位于私有域的主機(jī),它的NAT試圖用此主機(jī)在公網(wǎng)的映射地址連接其他位于同樣NAT后的其他主機(jī),相當(dāng)于NAT裝置在數(shù)據(jù)包上做了兩次NAT轉(zhuǎn)換。在數(shù)據(jù)報(bào)到達(dá)目標(biāo)主機(jī)之前,源主機(jī)的私有端點(diǎn)被轉(zhuǎn)換成NAT分配的公共端點(diǎn),然后把目標(biāo)主機(jī)的公共端點(diǎn)轉(zhuǎn)換成目標(biāo)主機(jī)的私有端點(diǎn)。我們?cè)谏厦嫣岬降牡刂忿D(zhuǎn)換用一臺(tái)NAT裝置完成就稱為"Loopback translation"。

 3. 用middleboxes進(jìn)行P2P通訊的技術(shù)
 這段文章詳細(xì)的回顧一下使用現(xiàn)有的middlebox實(shí)現(xiàn)P2P通訊的技術(shù),主要從應(yīng)用程序或協(xié)議設(shè)計(jì)上來(lái)述說(shuō)。

 3.1 Relaying(傳輸)
 最可靠的,但是效率最低的,實(shí)現(xiàn)P2P通訊的方法就是在傳輸過(guò)程中,把P2P通訊看成向C/S通訊的網(wǎng)絡(luò)一樣。例如,推想2個(gè)客戶主機(jī),A和B,各自發(fā)起一個(gè)TCP或UDP的連接,連接到一個(gè)大家都知道的擁有固定IP地址的服務(wù)器S上??蛻糁鳈C(jī)都在各自的私有網(wǎng)絡(luò)中,但是它們各自的middlebox不允許自己的客戶端可以直接和其它主機(jī)連接。
                                 Server S
                                    |
                                    |
             +----------------------+----------------------+
             |                                             |
           NAT A                                         NAT B
             |                                             |
             |                                             |
          Client A                                      Client B

 不能直接連接,兩個(gè)客戶端就使用S服務(wù)器進(jìn)行消息的傳遞。例如,要發(fā)送一條信息到客戶端B,客戶端A以C/S連接方式簡(jiǎn)單的發(fā)送一條信息到S服務(wù)器,然后S服務(wù)器使用已經(jīng)和客戶端B建立的C/S連接發(fā)送這條信息到客戶端B。

 這種方法的優(yōu)勢(shì)在于只要兩個(gè)客戶端都連在服務(wù)器上,它就是有效的。它的明顯缺點(diǎn)是它需要了服務(wù)器的處理并占用了帶寬,而且即使服務(wù)器的網(wǎng)絡(luò)狀況良好,也有一定的通訊滯后問(wèn)題。TRUN協(xié)議[TURN]定義了這種P2P應(yīng)用的相關(guān)方法。
3.2 逆向連接 (Connection reversal)
 第二種技術(shù)是在只有一個(gè)客戶位于middlebox后的條件下運(yùn)用的。舉例來(lái)說(shuō), 推想客戶A在 NAT 后面但是客戶 B 有一個(gè)全球有效的 IP 地址, 參照下面圖表:

                                 Server S
                             18.181.0.31:1235
                                    |
                                    |
             +----------------------+----------------------+
             |                                             |
           NAT A                                           |
     155.99.25.11:62000                                    |
             |                                             |
             |                                             |
          Client A                                      Client B
       10.0.0.1:1234                               138.76.29.7:1234

 客戶A有一個(gè)私有IP地址10.0.0.1,并且一個(gè)應(yīng)用程序使用TCP端口1234。這個(gè)客戶端和服務(wù)器S的公網(wǎng)IP地址18.181.0.31和端口1235建立了一個(gè)連接。NAT A為了客戶端A和服務(wù)器S的會(huì)話,臨時(shí)分配了一個(gè)終端地址,其TCP端口62000,它自己的IP地址是155.99.25.11:因此,服務(wù)器S認(rèn)為客戶端A用的是IP地址155.99.25.11,端口是62000。然而,客戶端B有著自己的固定IP地址,138.76.29.7,并且在它上面的P2P應(yīng)用程序可以在端口1234接收TCP連接。

 現(xiàn)在推想客戶端B想要與客戶端A建立一個(gè)P2P連接會(huì)話。B可能用客戶端A本身的地址,即10.0.0.1:1234,也可能用在服務(wù)器S上得到到的地址,155,99.25.11:62000,去嘗試連接。然而無(wú)論在哪一種情況下,連接都會(huì)失敗。第一種情況下,指向IP地址10.0.0.1的通訊包會(huì)被丟棄,因?yàn)?0.0.0.1不是一個(gè)公網(wǎng)固定IP地址。第二種情況下,來(lái)自客戶端B的TCP SYN請(qǐng)求包將會(huì)到達(dá)NAT A的62000端口,但NAT A將會(huì)拒絕這個(gè)請(qǐng)求,因?yàn)镹AT A只允許向外發(fā)送數(shù)據(jù)。

 在嘗試和客戶端A建立直接連接失敗后,客戶端B會(huì)利用服務(wù)器S傳遞一個(gè)請(qǐng)求,讓客戶端A去主動(dòng)連接客戶??蛻舳薃在通過(guò)服務(wù)器S接收到傳遞的請(qǐng)求后,會(huì)使用客戶端B的公共IP地址和端口建立一個(gè)TCP連接。 因?yàn)檫@個(gè)連接是在防火墻內(nèi)部發(fā)起的,所以NAT A允許這個(gè)連接建立,而客戶端B也能接收這個(gè)連接,因?yàn)樗⒉惶幱趍iddlebox后面。當(dāng)前實(shí)現(xiàn)P2P系統(tǒng)的一種技術(shù),它有一個(gè)主要的局限性,就是它只能允許P2P中一方在NAT后面:而兩方都在NAT后面的情況是很常見(jiàn)的,這種方法就會(huì)失敗。因?yàn)檫@種逆向連接并不是解決問(wèn)題的普遍方法,通常不推薦這個(gè)方法。應(yīng)用程序可以選擇試一試逆向連接,但當(dāng)"向前"或"逆向"都不能建立連接時(shí),應(yīng)用程序應(yīng)該能夠自動(dòng)的可以選擇另外的連接機(jī)制,比如relaying(即3.1說(shuō)的)。

 3.3 UDP hole punching
 第三種技術(shù),也是這篇文章的一個(gè)重要點(diǎn)之一,就是被稱為"UDP Hole Punching"的技術(shù)。當(dāng)兩個(gè)需要通訊的主機(jī)可能都在middlebox后面的時(shí)候,UDP hole punching依賴于cone NAT和普通防火墻的一些特性,允許合適的P2P應(yīng)用程序以"punch holes"方式通過(guò)middlebox并且建立彼此之間直接的連接。這種技術(shù)在RFC 3027[NAT- PORT]的5.1節(jié)中簡(jiǎn)要的提及,并且在英特網(wǎng)[KEGEL]非證實(shí)的提到,也在最近的一些協(xié)議[TEREDO, ICE]中用到。正如名字中的所提到的,這種技術(shù)只能用于UDP連接。

 我們將會(huì)考慮兩個(gè)特別情況,并且考慮應(yīng)用程序如何完善的處理兩者之間的握手連接。第一種情況下,也是較為普通的情況,兩個(gè)在不通的NAT后面的客戶端要求直接的進(jìn)行P2P連接。第二種情況,兩臺(tái)客戶端位于同一個(gè)NAT后面,但不能肯定(兩臺(tái)客戶端位于同一個(gè)NAT后面)。

 3.3.1 位于不同NAT后面(Peers behind different NATs)
 假設(shè)客戶端A和B都有自己的私有IP地址,也都位于不同的NAT后面。P2P應(yīng)用程序在A、B和服務(wù)器S上運(yùn)行,用的都是UDP端口1234。A和B各自和服務(wù)器S建立UDP通訊連接,使NAT A為A的連接分配一個(gè)自己的公共端口62000,而NAT B為B的連接分配的是31000端口。

                                 Server S
                             18.181.0.31:1234
                                    |
                                    |
             +----------------------+----------------------+
             |                                             |
           NAT A                                         NAT B
     155.99.25.11:62000                            138.76.29.7:31000
             |                                             |
             |                                             |
          Client A                                      Client B
       10.0.0.1:1234                                 10.1.1.3:1234

 現(xiàn)在推想一下,客戶端A想要直接和B建立一個(gè)UDP通訊會(huì)話。假設(shè)A簡(jiǎn)單的發(fā)一個(gè)UDP信息包到B的公共地址138.76.29.7:31000,然而NAT B將會(huì)丟棄這些進(jìn)入的數(shù)據(jù)信息(除非它是一個(gè)FULL cone NAT),原因是NAT B和S已經(jīng)建立的外部會(huì)話,而A發(fā)送的信息中的源地址和端口號(hào)是和S不匹配的(可以參照一下上面的內(nèi)容,匹配才能接受)。同樣,假如B發(fā)送一個(gè)條UDP數(shù)據(jù)包給A的公網(wǎng)地址,NAT A也會(huì)丟棄。

 但是,假設(shè)A發(fā)出一個(gè)UDP數(shù)據(jù)信息給B的公網(wǎng)IP地址,同時(shí)也通過(guò)服務(wù)器S傳遞一個(gè)請(qǐng)求給B,要求B也發(fā)一個(gè)UDP信息給A的公網(wǎng)IP地址。A直接向B的公共IP地址(138.76.29.7:31000)發(fā)送的數(shù)據(jù)包會(huì)讓NAT A在A的私有地址和B的公網(wǎng)地址之間建立了一個(gè)新的連接會(huì)話。同時(shí),B到A的公網(wǎng)地址(155.99.25.11:62000)的信息會(huì)導(dǎo)致NAT B在B的私有地址和A的公共地址之間建立一個(gè)新的連接會(huì)話。一旦這種新的UDP連接在兩者之間建立起來(lái),客戶端A和B就不需要服務(wù)器S的"介紹"就能彼此直接通訊了。

 UDP hole punching技術(shù)有幾個(gè)很有用的特點(diǎn)。一旦在兩個(gè)位于middlebox后面的客戶端建立了一個(gè)直接的P2P連接,在連接中的任何一方都可以扮演一個(gè)"介紹人"的角色,依次繼續(xù)和另一個(gè)客戶端建立連接,減少了最初的服務(wù)器S的負(fù)擔(dān)。如果說(shuō)有[STUN]的話,假如兩個(gè)中的任意一個(gè)或兩個(gè)都碰巧不在middlebox后面,上述應(yīng)用程序?qū)⑼瑯涌梢越2P通訊通道,應(yīng)用程序不需要嘗試明確middlebox的類型。Hole punching技術(shù)甚至可以自動(dòng)的運(yùn)用在多級(jí)NAT下面,多重NAT就是那些客戶端需要經(jīng)歷多級(jí)地址轉(zhuǎn)換才能進(jìn)入公網(wǎng)。

 3.3.2 位于同一NAT后(Peers behind the same NAT)
 現(xiàn)在考慮兩臺(tái)客戶端(但并不確定)都在同一個(gè)NAT后面的情況,因此會(huì)有私有IP地址空間??蛻舳薃與服務(wù)器S建立一個(gè)UDP會(huì)話,NAT會(huì)分配一個(gè)公共端口62000。客戶端B與服務(wù)器S也建立一個(gè)簡(jiǎn)單的連接,NAT為此分配一個(gè)公共端口62001。

                                 Server S
                             18.181.0.31:1234
                                    |
                                    |
                                   NAT
                          A-S 155.99.25.11:62000
                          B-S 155.99.25.11:62001
                                    |
             +----------------------+----------------------+
             |                                             |
          Client A                                      Client B
       10.0.0.1:1234                                 10.1.1.3:1234

 假想A和B使用UDP hole punching技術(shù)與服務(wù)器S的建立一個(gè)外部的通訊路線做為中間介紹。然后A和B將可以通過(guò)服務(wù)器S得到各自公共IP地址和端口號(hào),然后使用這些地址各自向?qū)Ψ桨l(fā)送數(shù)據(jù)。兩個(gè)客戶能夠以這種方式彼此通訊,只要NAT不僅僅允許外網(wǎng)上的主機(jī)可以和內(nèi)網(wǎng)上的主機(jī)進(jìn)行UDP傳輸會(huì)話,也可以允許內(nèi)網(wǎng)上的主機(jī)可以和其他內(nèi)網(wǎng)的主機(jī)進(jìn)行UDP會(huì)話。我們?cè)?loopback translation"中設(shè)計(jì)到這種情況,因?yàn)閬?lái)自私有網(wǎng)絡(luò)的數(shù)據(jù)包到達(dá)NAT后,會(huì)"looped back"到私有網(wǎng)絡(luò)上就象從公網(wǎng)來(lái)的一樣。例如,當(dāng)A向B的公共IP地址發(fā)送一個(gè)UDP包,這個(gè)包的包頭有一個(gè)源IP地址和端口,是10.0.0.1:1234,而目的地址是155.99.25.11.62001。NAT接受到這個(gè)包,會(huì)把源地址轉(zhuǎn)換(映射)為155.99.25.11:62000(就是A的公網(wǎng)地址),把目的地址轉(zhuǎn)換為10.1.1.3:1234,然后發(fā)給B。即使NAT支持回環(huán)映射,NAT的轉(zhuǎn)換和發(fā)送步驟看上去是多余的,在A和B通訊時(shí)似乎為NAT添加了潛在的負(fù)擔(dān)。

 這個(gè)問(wèn)題的解決方法是直接的。當(dāng)A和B一開(kāi)始在服務(wù)器S上交換地址信息時(shí),它們就可以包含他們自己的IP地址和端口號(hào),并且是可見(jiàn)的,對(duì)服務(wù)器S也是可見(jiàn)的。客戶端根據(jù)它們得到的地址同時(shí)開(kāi)始向?qū)Ψ桨l(fā)數(shù)據(jù)包,并建立成功的通訊。假如這兩個(gè)客戶端都在同一NAT后面,數(shù)據(jù)包象通訊一開(kāi)始就能直接到達(dá),而不需要通過(guò)NAT就能建立直接連接。假如這兩個(gè)客戶端位于不同的NAT后,到達(dá)彼此私有地址的數(shù)據(jù)包會(huì)被丟棄,但是客戶端可以通過(guò)各自的公共地址來(lái)建立連接。重要的是這些數(shù)據(jù)包需要通過(guò)一些方法去鑒別,然而,在這種情況下,A發(fā)到B的私有地址的數(shù)據(jù)包完全有可能到達(dá)A私網(wǎng)內(nèi)其他無(wú)關(guān)的終端,B發(fā)到A的包也是這樣。

 3.3.3 Peers separated by multiple NATs(多級(jí)NAT)
 在有多重NAT設(shè)備的拓?fù)浣Y(jié)構(gòu)中,如果沒(méi)有一些拓?fù)涞闹R(shí),在兩個(gè)客戶端之間建立理想的P2P鏈路是不可能的。看看下面的舉的例子。

                                 Server S
                             18.181.0.31:1234
                                    |
                                    |
                                  NAT X
                          A-S 155.99.25.11:62000
                          B-S 155.99.25.11:62001
                                    |
                                    |
             +----------------------+----------------------+
             |                                             |
           NAT A                                         NAT B
     192.168.1.1:30000                             192.168.1.2:31000
             |                                             |
             |                                             |
          Client A                                      Client B
       10.0.0.1:1234                                 10.1.1.3:1234

 假設(shè)NAT X是由一個(gè)英特網(wǎng)服務(wù)提供者(ISP)設(shè)置的一個(gè)大型NAT,在一些公網(wǎng)IP地址上擁有許多用戶,NAT A和B是小用戶群的NAT網(wǎng)關(guān),由ISP的用戶自己獨(dú)自配置,有各自的私有網(wǎng)絡(luò)和用戶群,使用的是ISP提供的IP地址。只有SERVER S和NAT X有自己全球固定的IP地址,而NAT A和B用的"公共"IP地址實(shí)際上是ISP地址域中私有地址,而客戶端A和B的地址對(duì)NAT A和B來(lái)說(shuō)也是私有的地址。每當(dāng)客戶端需要和服務(wù)器S建立一個(gè)外部的連接,都會(huì)導(dǎo)致NAT A和B和客戶端建立一個(gè)單獨(dú)的公共/私有連接,然后讓NAT X為每個(gè)連接會(huì)話建立一個(gè)公共/私有連接。

 現(xiàn)在推想客戶A和B嘗試建立一個(gè)直接的P2P UDP連接。對(duì)客戶端A來(lái)說(shuō),最佳的方法是發(fā)送一個(gè)數(shù)據(jù)信息到客戶端B在NAT B上,屬于ISP的地址域的公共IP地址192.168.1.2:31000,對(duì)客戶端B來(lái)說(shuō)就是發(fā)信息到A在NAT A的公共IP地址192.168.1.1:30000(原文是NAT B,是不是筆誤,還是我理解有問(wèn)題?)。不幸的是,A和B并沒(méi)有知道這些地址的方法,因?yàn)榉?wù)器S只能看到客戶端"全局"的公共IP地址,就是155.99.25.11:62000和155.99.25.11:62001。甚至當(dāng)A和B有某些方法可以得到這些地址,但他們依然不能保證這些地址是有用的,因?yàn)檫@些由ISP的私有地址域分配的地址可能與客戶自己分配的私有地址由沖突??蛻舳艘虼藳](méi)有選擇只能使用由服務(wù)器S知道的公共IP地址來(lái)通訊,并且依賴NAT X來(lái)提供loopback translation。

3.3.4 Consistent prot binddings(保持端口綁定)
 hole punching 技術(shù)有一個(gè)需要注意的地方:它只能工作在兩臺(tái)NAT都是cone NAT(或沒(méi)有NAT 防火墻)的情況下,只要UDP端口還在使用,它就需要保持一個(gè)固定的端口把一個(gè)給定(私有IP,私有UDP端口)和一個(gè)(公共IP,公共UDP端口)綁定。象對(duì)稱NAT一樣,為每個(gè)新的連接會(huì)話分配一個(gè)新的公共端口,對(duì)一個(gè)UDP應(yīng)用程序來(lái)說(shuō),為了和不同的外部通訊重用一個(gè)已經(jīng)存在的地址轉(zhuǎn)換是不可以的。(這邊稍微有點(diǎn)糊涂,再多看看。) 既然cone NAT運(yùn)用是相當(dāng)普遍的,UDP hole punching技術(shù)應(yīng)用的也相當(dāng)廣泛,但是還有一小部分是對(duì)等NAT配置,因此不能支持這種技術(shù)。


 3.4 UDP port number prediction

 有關(guān)UDP hole punching技術(shù)在上面已經(jīng)被討論過(guò),它可以允許在一些對(duì)等NAT存在的地方也能建立P2P UDP連接會(huì)話。這種方法有時(shí)被稱為"N+1"技術(shù) [BIDIR ]并且由Takeda[SYM-STUN]詳細(xì)介紹。這種方法分析NAT的工作方式并且試圖預(yù)測(cè)它為將來(lái)的連接會(huì)話分配的公共端口。再次考慮那兩個(gè)客戶的狀態(tài),A和B,在各自分開(kāi)的NAT后面,已經(jīng)與一臺(tái)擁有永久地址的服務(wù)器S建立了UDP連接。
                                  Server S
                               18.181.0.31:1234
                                      |
                                      |
               +----------------------+----------------------+
               |                                             |
        Symmetric NAT A                               Symmetric NAT B
    A-S 155.99.25.11:62000                        B-S 138.76.29.7:31000
               |                                             |
               |                                             |
            Client A                                      Client B
         10.0.0.1:1234                                 10.1.1.3:1234

 NAT A分配一個(gè)屬于自己的UDP端口62000以在A和S之間建立通訊連接,而NAT B分配一個(gè)31000端口用于在B和S之間建立連接。通過(guò)與服務(wù)器的通訊,A和B可以從服務(wù)器S上得到對(duì)方的公共IP地址和端口號(hào)??蛻舳薃現(xiàn)在發(fā)送一個(gè)UDP數(shù)據(jù)包到地址138.76.29.7,端口31001(注意端口數(shù)目的增加),而客戶端B同時(shí)發(fā)送一個(gè)數(shù)據(jù)包到地址的155,99.25.11,端口62001上。如果NAT A和B依次為新的連接分配端口,如果從A-S和B-S連接建立后沒(méi)過(guò)多少時(shí)間,那在A和B之間的一個(gè)雙向通訊通道就可以工作起來(lái)。A到B的數(shù)據(jù)包讓NAT A建立一個(gè)新的連接,NAT A(所期望的)分配一個(gè)公共端口62001,因?yàn)橹癆和S的連接會(huì)話用的62000端口,接下來(lái)就是62001。同樣的,B到A的數(shù)據(jù)包將讓NAT B打開(kāi)一個(gè)新連接,并將(也是所期望的)分配一個(gè)端口31001。如果客戶端可以正確的預(yù)測(cè)到NAT為新的連接分配的端口,一條雙向的UDP通訊通道就會(huì)象如下圖所示一樣建立起來(lái)。

                                  Server S
                               18.181.0.31:1234
                                      |
                                      |
               +----------------------+----------------------+
               |                                             |
             NAT A                                         NAT B
    A-S 155.99.25.11:62000                        B-S 138.76.29.7:31000
    A-B 155.99.25.11:62001                        B-A 138.76.29.7:31001
               |                                             |
               |                                             |
            Client A                                      Client B
         10.0.0.1:1234                                 10.1.1.3:1234


 顯而易見(jiàn)有很多情況都能導(dǎo)致這種方法失敗。假如任意一個(gè)預(yù)測(cè)的端口碰巧已經(jīng)被其他無(wú)關(guān)的連接占用,NAT將會(huì)錯(cuò)過(guò)正確的端口,連接嘗試也將失敗。假如任意一個(gè)NAT有時(shí)或者總是選擇非連續(xù)的端口號(hào),這個(gè)方法也將失敗。假如在A(B)建立了它和S的連接之后,但在發(fā)送第一個(gè)數(shù)據(jù)包到B(A)之前,一個(gè)不同的客戶端在NAT(也或者B)打開(kāi)一個(gè)新的外部連接到任何外部主機(jī),無(wú)關(guān)的客戶端會(huì)不注意的"偷"了(A TO B或者B TO A)所要求的端口。因此在任一NAT都包含不止一臺(tái)客戶端時(shí),這種方法很少使用。

 實(shí)際上,如果那些NAT是cone NAT,或者一個(gè)是cone NAT,另一個(gè)是對(duì)稱NAT,這種情況下的P2P應(yīng)用程序依然需要工作,應(yīng)用程序需要實(shí)現(xiàn)查明在任何一個(gè)上與end [STUN]有關(guān)的NAT是哪一鐘,并按此來(lái)修改它的工作方式,這樣增加了算法的復(fù)雜程序并讓網(wǎng)絡(luò)變的脆弱。最終,假如任何一方客戶端在2級(jí)以上的NAT下并且離客戶端最近的NAT是對(duì)稱的,預(yù)測(cè)端口的方式是無(wú)法工作的。對(duì)所有這些原因來(lái)說(shuō),應(yīng)用程序是無(wú)法實(shí)現(xiàn)這種方法的,在這里被提及是為了歷史和信息目的(就是告訴大家有這么回事,我想)

 3.5. Simultaneous TCP open(TCP同時(shí)打開(kāi))
 在一對(duì)節(jié)點(diǎn)都在已存在middlebox后,有一種建立直接P2P TCP連接的方法有時(shí)候會(huì)被使用。大多數(shù)TCP連接都是從一個(gè)終端發(fā)從一個(gè)SYN包到另一個(gè)終端,另一個(gè)中斷同步響應(yīng)一個(gè)SYN-ACK包。無(wú)論怎樣,對(duì)于兩個(gè)終端來(lái)說(shuō),同時(shí)通過(guò)發(fā)送同步包到對(duì)方然后用一個(gè)ACK包應(yīng)答來(lái)建立一個(gè)TCP連接是可行的。這種過(guò)程就被稱為"simultaneous open"(同時(shí)打開(kāi))

 如果一個(gè)middlebox從嘗試建立一個(gè)TCP連接的私有網(wǎng)絡(luò)的外面接受一個(gè)TCP SYN包,middlebox通常以丟棄這個(gè)SYN包或者發(fā)送一個(gè)TCP RST(連接復(fù)位)包的方式來(lái)拒絕這個(gè)連接嘗試。但是,如果同步包與源和目的地址端口一起到達(dá),那么會(huì)讓middlebox相信一個(gè)TCP連接已經(jīng)建立起來(lái),然后middlebox將會(huì)允許數(shù)據(jù)包通過(guò)。特別是如果middlebox剛剛得到并轉(zhuǎn)換了一個(gè)從同樣地址和端口來(lái)的SYN包,它將認(rèn)為連接是成立的并允許進(jìn)來(lái)的SYN通過(guò)。如果客戶端A和B能彼此預(yù)測(cè)公共端口,它們各自的middlebox將分配下一個(gè)TCP連接端口,如果其中一個(gè)客戶端和另一個(gè)客戶端建立一個(gè)外部的TCP連接,可以在對(duì)方SYN到達(dá)本地middlebox之前就發(fā)送SYN包通過(guò)它本地自己的middlebox,那么P2P TCP連接就可以工作了。

 令人遺憾的是,這個(gè)方法也可能比上面說(shuō)的UDP端口號(hào)預(yù)測(cè)方法更脆弱并對(duì)時(shí)效更加敏感。首先,除非在進(jìn)行TCP連接時(shí),兩個(gè)middleboxes是簡(jiǎn)單的防火墻或者cone NAT,在各自嘗試猜測(cè)公共端口號(hào)來(lái)讓NAT分配新的連接時(shí),和上面(UDP端口預(yù)測(cè))說(shuō)到的完全一樣的事情會(huì)導(dǎo)致連接失敗。另外,如果有一方的客戶發(fā)送的同步包太迅速的到達(dá)對(duì)面的middlebox,遠(yuǎn)端middlebox可能會(huì)用一個(gè)RST包拒絕SYN包,接下來(lái)就會(huì)導(dǎo)致本地的middlebox關(guān)閉對(duì)話并且在將來(lái)SYN重發(fā)時(shí)使用了相同但無(wú)用的端口號(hào)。最終,對(duì)simultaneous open的支持作為一個(gè)TCP的特殊應(yīng)用,沒(méi)有在廣泛的系統(tǒng)中被使用。因此,這個(gè)方法也只為歷史因素在這里被同樣提及;它不建議被應(yīng)用程序使用。在現(xiàn)有NAT上想要實(shí)現(xiàn)P2P直接通訊的應(yīng)用程序應(yīng)該使用UDP。

 4. Application design guidelines(應(yīng)用程序設(shè)計(jì)思路)

 4.1 What works with P2P middleboxes(如何和P2P middlebox一起工作)
 既然UDP hole punching是在兩個(gè)都位于NAT后的主機(jī)之間建立P2P直接通訊方法中最有效率的一個(gè),并且它可以在多種現(xiàn)有NAT上使用,如果要求建立有效的P2P通訊,通常建議這種方法,但當(dāng)直接通訊不能建立時(shí),就得依靠簡(jiǎn)單的傳播。(還不怎么明白)

 4.2 Peers behind the same NAT(主機(jī)在同一個(gè)NAT后面)
 實(shí)際上有相當(dāng)數(shù)量的用戶不止2個(gè)IP地址,會(huì)有3個(gè)或者更多的IP地址。這樣的話,告訴登錄服務(wù)器究竟是哪一個(gè)地址變的就有些困難了。因此在這種情況下,應(yīng)用程序應(yīng)該發(fā)送它所有的IP地址。

 4.3 Peer discovery(主機(jī)發(fā)現(xiàn))

 應(yīng)用程序會(huì)發(fā)送一些數(shù)據(jù)包到幾個(gè)地址,以發(fā)現(xiàn)哪一個(gè)地址是最合適的,應(yīng)用程序可能變成(后面的不太明白,自己理解吧,sorry), 由于主機(jī)可能會(huì)不恰當(dāng)?shù)倪x擇一個(gè)路由地址當(dāng)做一個(gè)內(nèi)部局域網(wǎng)(例如11.0.1.1,已經(jīng)被DOD網(wǎng)絡(luò)分配,DOD是一種網(wǎng)絡(luò)模型)。因此應(yīng)用程序應(yīng)該小心的發(fā)送推測(cè)的呼叫包。
 申請(qǐng)把包送到幾地址發(fā)現(xiàn), 哪一個(gè)適宜適合一規(guī)定貴族使用可能成為一個(gè)亂扔凈價(jià)的'' 空間廢品''的顯著的源頭,

 4.4 TCP P2P applications (TCP P2P應(yīng)用程序)

 被程序員們廣泛使用的SOCKET API,常用于C/S結(jié)構(gòu)應(yīng)用設(shè)計(jì)中。在它的通常使用方式中,一個(gè)SOCKET能綁定一個(gè)TCP或UDP端口。一個(gè)應(yīng)用程序不會(huì)被允許用同樣的端口(TCP or UDP)和多個(gè)SOCKET綁定來(lái)和多個(gè)外部主機(jī)同時(shí)建立連接(或)用一個(gè)SOCKET在端口上監(jiān)聽(tīng)而其他SOCKET來(lái)建立外部連接。但是上述單個(gè)SOCKET的端口綁定限制在UDP上不是問(wèn)題,因?yàn)閁DP是基于數(shù)據(jù)報(bào)文的協(xié)議。UDP P2P應(yīng)用程序設(shè)計(jì)者可以用recvfrom()和sendto()函數(shù)來(lái)讓一個(gè)SOCKET不僅發(fā)送而且可以從多個(gè)主機(jī)上接受數(shù)據(jù)報(bào)文。

 這不是TCP具有的情況。由于TCP,每個(gè)輸入和輸出連接都要和一個(gè)單獨(dú)的SOCKET有聯(lián)系。Linux Sockets API用SO_REUSEADDR選項(xiàng)的幫助來(lái)解決這個(gè)問(wèn)題(是不是應(yīng)該這么說(shuō)?),這個(gè)選項(xiàng)好象不起作用,但可以
 (在標(biāo)準(zhǔn)Single Unix里沒(méi)有這個(gè)函數(shù))。Win32 API提供了一個(gè)相同的調(diào)用SetReuseAddress。使用任何上述的選擇,應(yīng)用程序可以復(fù)用一個(gè)TCP端口的多個(gè)SOCKET。就是說(shuō),可以打開(kāi)兩個(gè)綁定在同樣端口上的TCP stream Socket,一個(gè)用與listen(),另一個(gè)用與其它主機(jī)connect()

 4.5 Use of midcom protocol()

 如果應(yīng)用程序知道它們需要穿越的middlebox并且這些middlebox實(shí)現(xiàn)midcom 協(xié)議,應(yīng)用程序能使用midcom協(xié)議更容易的穿越middlebox。
 例如,P2P應(yīng)用程序需要NAT middlebox保持終端端口的綁定狀態(tài)。假如middlebox可以支持midcom,P2P應(yīng)用程序可以控制修改綁定端口(或者綁定地址)的參數(shù),例如生存時(shí)間,maxidletime(?),因此應(yīng)用程序不僅可以直接的連接外部主機(jī)而且也可以從外部主機(jī)接受連接;這樣就不需要定期保持端口綁定的狀態(tài)。當(dāng)應(yīng)用程序不再需要綁定,也可以使用midcom協(xié)議簡(jiǎn)單的取消綁定。

 5. NAT Design Guidelines (NAT設(shè)計(jì)指導(dǎo))
 這部分討論網(wǎng)絡(luò)地址轉(zhuǎn)換的設(shè)計(jì),他們會(huì)影響P2P應(yīng)用程序。

 5.1 Deprecat the use of symmetric NATs (不贊成使用對(duì)等NAT)
 對(duì)等NAT在那些C/S結(jié)構(gòu)的應(yīng)用中比如網(wǎng)絡(luò)瀏覽中得到廣泛應(yīng)用,它們只需要建立一個(gè)向外的連接即可。但是現(xiàn)在,比如實(shí)時(shí)消息和語(yǔ)音會(huì)議等P2P應(yīng)用程序被廣泛的應(yīng)用。對(duì)等NAT不能支持保留終端的定義并且不適用于P2P應(yīng)用程序。不建議使用對(duì)等NAT來(lái)支持P2P應(yīng)用程序。
 一個(gè)P2P-middlebox必須在UDP通訊時(shí)具備Cone NAT的特點(diǎn),允許應(yīng)用程序可以建立使用UDP hole punching技術(shù)建立穩(wěn)定的P2P連接。理論上,一個(gè)P2P-middlebox應(yīng)該也允許應(yīng)用程序既可以經(jīng)過(guò)TCP,也可以通過(guò)UDP建立P2P連接。

 5.2 Add incremental cone-NAT support to symmetric NAT devices (增加遞增的cone-NAT以支持對(duì)等NAT設(shè)備)

 一種可以讓對(duì)等NAT設(shè)備擴(kuò)展支持P2P應(yīng)用程序的是分配它的可轉(zhuǎn)讓的端口空間,為一到一的連接預(yù)訂一個(gè)合適的端口,為一個(gè)一到多的連接預(yù)訂合適的一套不同的端口。
 更進(jìn)一步(未來(lái)?),一個(gè)NAT裝置可以明確的被那些P2P應(yīng)用程序和主機(jī)配置,因此NAT裝置可以自動(dòng)由正確的端口數(shù)據(jù)塊來(lái)分配一個(gè)P2P端口。

 5.3 Maintain consisten port bindings for UDP ports (保持UDP端口的綁定)
 這份資料對(duì)NAT設(shè)計(jì)者最主要和最重要的建議是NAT保持一個(gè)固定的端口,綁定一個(gè)給定的(內(nèi)部IP地址,內(nèi)部UDP端口)和一個(gè)相應(yīng)的(公共IP地址,公共UDP端口)
 只要有任何連接存在并使用這個(gè)端口綁定,這個(gè)端口綁定就要存在。通過(guò)檢查每一個(gè)包的源和目的IP地址和端口號(hào),NAT可能會(huì)過(guò)濾關(guān)于每一個(gè)連接基礎(chǔ)的數(shù)據(jù)包(? 俺8懂)。當(dāng)在一個(gè)私有網(wǎng)絡(luò)上的節(jié)點(diǎn)建立了一個(gè)新的外部連接時(shí),使用了一個(gè)現(xiàn)有的已經(jīng)轉(zhuǎn)換過(guò)的UDP連接會(huì)話的IP地址和UDP端口號(hào),NAT應(yīng)該保證新的UDP連接作為現(xiàn)有連接給定一個(gè)同樣的公共IP地址和UDP端口。

 5.3.1 Preserving port numbers(保持端口號(hào))  (就是客戶端用啥端口,NAT分配啥端口這個(gè)意思吧)
 一些NAT,當(dāng)建立一個(gè)新的UDP連接時(shí),會(huì)嘗試給一個(gè)相應(yīng)的私有端口號(hào)分配一個(gè)同樣的公共端口號(hào),如果這個(gè)端口號(hào)碰巧是可用的。例如,假如地址是10.0.0.1的客戶端A用一個(gè)從端口1234發(fā)送的數(shù)據(jù)包建立一個(gè)外部的UDP連接,NAT的公共端口1234碰巧是可用的,那么NAT會(huì)為連接使用NAT公共IP地址上的端口號(hào)1234作為轉(zhuǎn)換客戶端A的地址。由于如果內(nèi)部網(wǎng)絡(luò)的最多一個(gè)節(jié)點(diǎn)正在使用這個(gè)端口號(hào),它是對(duì)一個(gè)NAT保持端口唯一可行的方法,這種方式可能對(duì)一些希望只用特別的UDP端口號(hào)的過(guò)去的UDP程序有幫助,但不建議應(yīng)用程序依靠這種方式。
 另外, 一個(gè)NAT不應(yīng)該在一個(gè)新連接中保持端口號(hào),如果確實(shí)如此將與保持公共和私有終端地址綁定的目的相抵觸。例如,假定客戶端A在內(nèi)部的1234端口上與外部服務(wù)器S建立了一個(gè)連接,NAT A已經(jīng)為這個(gè)連接分配了公共端口62000,因?yàn)槎丝谔?hào)1234在NAT上此時(shí)是不可用的。現(xiàn)在假想在NAT上的端口號(hào)1234后來(lái)可以使用了,而此時(shí)A和S的連接仍然存在,客戶端A用同樣的內(nèi)部端口1234建立一個(gè)新的連接到外部節(jié)點(diǎn)B上。在這種情況下,因?yàn)槎丝诮壎ㄒ呀?jīng)在客戶端A的端口1234和NAT的公共端口62000上建立,所以這個(gè)綁定應(yīng)該繼續(xù)保持,新連接也應(yīng)該用62000端口作為公共端口,來(lái)對(duì)應(yīng)客戶端A的端口1234。NAT不應(yīng)該僅僅因?yàn)槎丝?234變的可用了就為新的連接分配公共端口1234:這種特點(diǎn)不可能在任何情況下都對(duì)應(yīng)用程序有幫助,由于應(yīng)用程序已經(jīng)對(duì)一個(gè)轉(zhuǎn)換的端口號(hào)進(jìn)行操作,并且它會(huì)中斷應(yīng)用程序用UDP hole punching技術(shù)建立P2P連接的嘗試。

 5.4 Maintaining consistent port bindings for TCP ports (為TCP端口保持端口綁定)
 和UDP地址轉(zhuǎn)換的特點(diǎn)一致,cone NAT也應(yīng)該對(duì)TCP連接保持私有和公共IP地址,TCP端口號(hào)的綁定不變,就如上面的關(guān)于UDP描述的方式一樣。保持TCP終端綁定不變將增加NAT對(duì)P2P TCP應(yīng)用程序在從同樣源端口建立多個(gè)TCP連接時(shí)的兼容性。

 5.5 Large timeout for P2P applications (P2P程序的大超時(shí)?)
 我們推薦middlebox在P2P應(yīng)用時(shí)使用的最小超時(shí)大約5分鐘(300秒),即,在P2P應(yīng)用時(shí)為端口綁定或?yàn)榉峙涠丝跁r(shí),來(lái)給middlebox配置這個(gè)空閑超時(shí)時(shí)間。當(dāng)middlebox慣用目前配置時(shí),就常常嘗試使用更短的時(shí)間。但是更短的超時(shí)時(shí)間是有些問(wèn)題的??紤]一個(gè)有16個(gè)終端節(jié)點(diǎn)的P2P應(yīng)用程序,他們將每10秒發(fā)給網(wǎng)絡(luò)一個(gè)保持活動(dòng)狀態(tài)的數(shù)據(jù)包以避免NAT超時(shí)。這樣做是因?yàn)橐粋€(gè)可能會(huì)以middlebox超時(shí)時(shí)間的5倍發(fā)送保持活動(dòng)的數(shù)據(jù)包,在這種情況下,保持活動(dòng)的包將在網(wǎng)絡(luò)上被丟棄。

 5.6 Support loopback translation(支持自環(huán)轉(zhuǎn)換)
 我們強(qiáng)烈建議middlebox 支持自環(huán)轉(zhuǎn)換,允許在一臺(tái)middlebox后面的主機(jī)可以和其它位于同一middlebox后的主機(jī)通過(guò)它們的可能被轉(zhuǎn)換的公共端點(diǎn)通訊。支持自環(huán)轉(zhuǎn)換是相當(dāng)重要的,特別是在那些大容量多層NAT中,作為第一級(jí)的NAT。如第3.3.3 部分的描述,位于同一臺(tái)一級(jí)NAT下,但是第二級(jí)NAT不同的主機(jī)無(wú)法通過(guò)UDP hole punching彼此通訊,即使全部middlebox保持端點(diǎn)在NAT上的映射不變,除非第一級(jí)NAT支持自環(huán)轉(zhuǎn)換。


 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲国产一区精品一区二区三区色| 精品女同在线一区二区| 久久99亚洲小姐精品综合| 日韩欧美二区中文字幕| 亚洲国产成人爱av在线播放下载| 欧美成人精品一区二区久久| 国产不卡的视频在线观看| 欧美黑人巨大一区二区三区| 精品人妻一区二区三区四区久久| 日韩中文高清在线专区| 亚洲一区精品二人人爽久久| 色一情一乱一区二区三区码| 亚洲精品深夜福利视频| 国产高清三级视频在线观看| 黄色在线免费高清观看| 91香蕉国产观看免费人人| 国产精品超碰在线观看| 欧洲精品一区二区三区四区| 亚洲做性视频在线播放| 欧美一级日韩中文字幕| 亚洲欧美国产中文色妇| 五月综合婷婷在线伊人| 国产中文另类天堂二区| 亚洲男人的天堂久久a| 国产精品丝袜美腿一区二区| 亚洲国产精品无遮挡羞羞| 国产精品亚洲综合色区韩国| 色婷婷国产熟妇人妻露脸| 丝袜人妻夜夜爽一区二区三区| 日本办公室三级在线观看| 亚洲精品国产福利在线| 国产美女精品人人做人人爽| 欧美一区二区三区十区| 日韩精品在线观看一区| 国产精品一区二区三区日韩av| 日韩三极片在线免费播放 | 国产极品粉嫩尤物一区二区| 91人人妻人人爽人人狠狠| 欧美高潮喷吹一区二区| 成人免费观看视频免费| 男人的天堂的视频东京热|