通過(guò)middlebox實(shí)施P2P通訊[文章信息] epan提示:下面有些圖看不清楚的可以copy到記事本看,記事本不要自動(dòng)換行. 當(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ǔ) 防火墻 NAT通常有2種主要類型: Network Address/Port Translator (NAPT) 關(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 Server S1 Server S2 Symmetric NAT Server S1 Server S2 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 Restricted Cone NAT Port-Restricted Cone NAT 最后,在這篇文檔中我們定義一些新的術(shù)語(yǔ)來(lái)給middleboxes中有關(guān)P2P的行為進(jìn)行分類: P2P-Application P2P-Middlebox P2P-firewall P2P-NAT 3. 用middleboxes進(jìn)行P2P通訊的技術(shù) 3.1 Relaying(傳輸) 不能直接連接,兩個(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)方法。 Server S 客戶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 我們將會(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) Server S 現(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) Server S 假想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) Server S 假設(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(保持端口綁定)
有關(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連接。 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
實(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)) 如果一個(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一起工作) 4.2 Peers behind the same NAT(主機(jī)在同一個(gè)NAT后面) 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è)的呼叫包。 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)好象不起作用,但可以 4.5 Use of midcom protocol() 如果應(yīng)用程序知道它們需要穿越的middlebox并且這些middlebox實(shí)現(xiàn)midcom 協(xié)議,應(yīng)用程序能使用midcom協(xié)議更容易的穿越middlebox。 5. NAT Design Guidelines (NAT設(shè)計(jì)指導(dǎo)) 5.1 Deprecat the use of symmetric NATs (不贊成使用對(duì)等NAT) 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ù)訂合適的一套不同的端口。 5.3 Maintain consisten port bindings for UDP ports (保持UDP端口的綁定) 5.3.1 Preserving port numbers(保持端口號(hào)) (就是客戶端用啥端口,NAT分配啥端口這個(gè)意思吧) 5.4 Maintaining consistent port bindings for TCP ports (為TCP端口保持端口綁定) 5.5 Large timeout for P2P applications (P2P程序的大超時(shí)?) 5.6 Support loopback translation(支持自環(huán)轉(zhuǎn)換)
分類: 轉(zhuǎn)載文章
0
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
|
|
來(lái)自: 筱肆 > 《網(wǎng)文收藏》