【正文】
oE_GetDisConnected()用于獲取已斷開連接的ONIC,登陸失敗或者一個(gè)PPP連接被斷開,那么對應(yīng)的ONIC就會(huì)被插入PPPoE模塊中,直到調(diào)用此函數(shù)才被移除。4 流量匯聚實(shí)現(xiàn) 關(guān)于流量的匯聚NATONIC_1ONIC_2 INIC… …ONIC_nACPCSIP_2IP_nIP_1圖7 多帳號流量匯聚舉例假設(shè)有如下邏輯拓?fù)鋱D,n個(gè)ONIC登陸成功(則有n條到AC的鏈路,公網(wǎng)IP分別為IP_IP_……、IP_n),每條鏈路都具有x Mb/s的帶寬,主機(jī)PC將INIC作為網(wǎng)關(guān),并且PC與外網(wǎng)的計(jì)算機(jī)S通信,S的帶寬足夠多。如果要匯聚流量,PC與S的通信就須滿足一些要求:PC的應(yīng)用層程序應(yīng)該向S發(fā)起m個(gè)連接,NAT將這m個(gè)連接分配到n條鏈路上去,轉(zhuǎn)換成IP_IP_… …、IP_m與S的連接,而且S還不能查覺。像在一些文件傳輸服務(wù)上,這是可行的。比如,下載文件時(shí),PC可以啟動(dòng)m個(gè)連接,分別請求下載S上某文件的m個(gè)數(shù)據(jù)塊,這m個(gè)請求是相互獨(dú)立的,NAT將每個(gè)連接分配各個(gè)鏈路上。在S看來,請求的主機(jī)就像是IP_IP_……、IP_m,于是S就分別將數(shù)據(jù)塊傳送IP_IP_……、IP_m。但在PC看來,通信的目的地只有一個(gè),與S的每個(gè)連接都具有x Mb/s傳輸?shù)乃俣?,故文件傳送的總帶寬?m * x Mb/s。 當(dāng)然,前面只是舉了個(gè)能匯聚多帳號流量的例子,某些P2P程序也能達(dá)到類似的效果,它們服務(wù)相同、請求獨(dú)立,只要實(shí)行多連接,就能匯聚多個(gè)鏈路的帶寬。 實(shí)現(xiàn)方案根據(jù)前面的分析,本文的NAT實(shí)現(xiàn)方法如下:一、當(dāng)需要生成NAT表項(xiàng)時(shí),根據(jù)協(xié)議類型,選擇一個(gè)最少轉(zhuǎn)換項(xiàng)的ONIC二、選擇ONIC中沒有被轉(zhuǎn)換的端口作為PC的外網(wǎng)的端口三、生成轉(zhuǎn)換表項(xiàng),轉(zhuǎn)發(fā)數(shù)據(jù)包四、對于UDP,如果查找所有的轉(zhuǎn)換鏈表時(shí),找到對應(yīng)的內(nèi)網(wǎng)(IP,Port),就直接轉(zhuǎn)換并發(fā)送定義如下的結(jié)構(gòu)體作為NAT轉(zhuǎn)換的元組:// TCPtypedef struct _TCPTuple{ struct _TCPTuple* pNext。 // 下一個(gè)TCPTuple結(jié)構(gòu)體指針 unsigned int IIP。 // 內(nèi)網(wǎng)IP unsigned int XIP。 // 與外網(wǎng)主機(jī)通信的IP unsigned int OIP。 // 轉(zhuǎn)換為外網(wǎng)的IP unsigned short IPort。 // 內(nèi)網(wǎng)端口 unsigned short XPort。 // 與外網(wǎng)主機(jī)通信的端口 unsigned short OPort。 // 轉(zhuǎn)換為外網(wǎng)的端口 unsigned short Alive。 // 轉(zhuǎn)換超時(shí),為0時(shí)將被移除轉(zhuǎn)換鏈表}TCPTuple。// UDPtypedef struct _UDPTuple{ struct _UDPTuple* pNext。 unsigned int IIP。 unsigned int XIP。 unsigned int OIP。 unsigned short IPort。 unsigned short XPort。 unsigned short OPort。 unsigned short Alive。}UDPTuple。NAT模塊導(dǎo)出了兩個(gè)接口,為VNIC_Proc()過程提供NAT轉(zhuǎn)換服務(wù):// 將內(nèi)網(wǎng)數(shù)據(jù)包轉(zhuǎn)發(fā)到外網(wǎng)void NAT_ItoO(char* pDstMAC,char* pBuf,int iLen)。// 將外網(wǎng)數(shù)據(jù)包轉(zhuǎn)發(fā)到內(nèi)網(wǎng)void NAT_OtoI(char* pDstMAC,char* pBuf,int iLen)。整個(gè)轉(zhuǎn)換過程可以看作是“動(dòng)態(tài)NAT”與“Restricted Cone型NAPT”的結(jié)合。 轉(zhuǎn)換超時(shí)TCPTuple和UDPTuple中都設(shè)置一個(gè)Alive域,作為轉(zhuǎn)換超時(shí)的計(jì)數(shù)器,當(dāng)Alive的值為0時(shí),就說明在限定的時(shí)間內(nèi),內(nèi)外網(wǎng)兩端的主機(jī)都沒有通信,出現(xiàn)此情況的原因有很多,最有可能的就是兩端的“連接”都斷開了或兩臺(tái)主機(jī)都掉線了,這時(shí),應(yīng)該刪除對應(yīng)的NAT映射關(guān)系。NAT模塊的轉(zhuǎn)換超時(shí)時(shí)鐘每隔一個(gè)周期就檢查各個(gè)ONIC的轉(zhuǎn)換鏈表,一旦發(fā)現(xiàn)有Alive為0的Tuple就將其移除。此外,對于TCP協(xié)議,當(dāng)收到含有FIN標(biāo)記的報(bào)文時(shí),本文的做法是將對應(yīng)轉(zhuǎn)換表的Alive設(shè)置為NAT_TCP_CLOSEWAIT,過一段時(shí)間后再由超時(shí)線程移除。因?yàn)門CP在斷開連接時(shí),其所發(fā)送的FIN報(bào)文段(RST報(bào)文段也一樣)有可能丟失,而且根據(jù)它的狀態(tài)變遷,TCP還有一個(gè)TIMEWAIT狀態(tài),所以立即移除的話可能會(huì)影響到內(nèi)外網(wǎng)主機(jī)的正常關(guān)閉。5 測試本文實(shí)驗(yàn)使用了虛擬機(jī)VM 。采用ROS PPPoE服務(wù)器;將PPPoE服務(wù)器的上下行流量限制為1 Mbps/s,然后啟動(dòng)NAT進(jìn)行登陸,運(yùn)行虛擬機(jī)的Windows2003,將網(wǎng)關(guān)的地址設(shè)計(jì)為INIC的IP,并開啟迅雷下載。測試結(jié)果如表1所示:表1 不同帳號下的下載速率從測試結(jié)果來看,在帳號帶寬同為1Mbps的情況下,下載速率隨帳號個(gè)數(shù)的增加而呈線性增長,達(dá)到了系統(tǒng)設(shè)計(jì)的目的,實(shí)現(xiàn)了多帳號帶寬匯聚的功能。6 小結(jié)本文在PPPoE連接獲取公網(wǎng)IP后,設(shè)計(jì)并實(shí)現(xiàn)了一種可以匯聚多帳號帶寬的NAT,并最終測試成功。由于時(shí)間、水平的限制,還有些需要改善的地方,整個(gè)設(shè)計(jì)可以NDIS內(nèi)核驅(qū)動(dòng)中實(shí)現(xiàn),而本文是使用WinPcap在應(yīng)用層上實(shí)現(xiàn)的,所以效率不及前者,此外,由于一般情況下IP頭選項(xiàng)幾乎沒用,ICMP協(xié)議太都對網(wǎng)絡(luò)進(jìn)行差錯(cuò)報(bào)告,所以暫時(shí)不支持這兩樣功能。雖然程序仍有所不足,但本文的目的并非單一地實(shí)現(xiàn)一個(gè)NAT程序,而是為了探究“能否實(shí)現(xiàn)匯聚多個(gè)PPPoE帳號的流量”這個(gè)課題,并將所學(xué)知識(shí)運(yùn)行到程序?qū)崿F(xiàn)中去,以加深對計(jì)算機(jī)、網(wǎng)絡(luò)、程序設(shè)計(jì)的理解,提高分析問題、解決問題的能力。參考文獻(xiàn):[1] 網(wǎng)絡(luò)與通信程序設(shè)計(jì)(第2版)[M].北京:人民郵電出版社,2009:12.[2] [D].:2226.[3] RFC2516, A Method for Transmitting PPP Over Ethernet (PPPoE)[S]. Network Working [4] 鄒航,楊元曄,[J].(7):8991.[5][J].(3):8082.[6]王南,孫保鎖,[J].(10):6669.[7] RFC3022, Traditional IP Network Address Translator[S],Jasmine Networks,2001.[8] 郭士秋, IP協(xié)議體系[M].北京:電子工業(yè)出版社,2002:7176.[9] W. Richard Stevens[美].范建華,:協(xié)議[M].北京::3334.[10] Politeico di Torino. WinPcap Documentation[A], 2002.[11] 羅軍舟,黎波濤,楊明,吳俊等,TCP/IP協(xié)議及網(wǎng)絡(luò)編程技術(shù)[M].北京:清華大學(xué)出版社,2004:2226.[12] Douglas [美].林瑤,蔣慧,(第一卷:原理、協(xié)議與結(jié)構(gòu))(第四版)[M].北京:電子工業(yè)出版社, 2001:219221.The Design and implemention of NAT system based on PPPoEMajor:LiQiRun Supervisor: TangPengJie[Abstract] The existing PPPoE technology supports that the users access to an Ethernet and billing easily. But the Windows builtin PPPoE protocol only supports single account, ISP also support only one on this basis account login. Although the consumer logs on multiple broadband accounts, and opens the system for broadband sharing, he shares only one account’s bandwidth. On the basis of PPPoE, the author designed and implemented a NAT system that can be brought bandwidth of multiple accounts together. Experiment results show that the system can achieve the intended target.[Keywords] PPPoE。 NAT。 Windws NDIS。 WinPcap。 TCP/IP。 Bandwidth aggregation致謝在湯鵬杰老師的的耐心指導(dǎo)和無私的幫助之下,本文順利完成,湯老師的指導(dǎo)與幫助使我掌握了如何研究NAT的方法,并由此而培養(yǎng)了我對工作認(rèn)真、嚴(yán)謹(jǐn)?shù)膽B(tài)度,在此向指導(dǎo)我的湯老師表示深深的