毕业设计(论文)基于PPPoE的NAT设计与实现_第1页
毕业设计(论文)基于PPPoE的NAT设计与实现_第2页
毕业设计(论文)基于PPPoE的NAT设计与实现_第3页
毕业设计(论文)基于PPPoE的NAT设计与实现_第4页
毕业设计(论文)基于PPPoE的NAT设计与实现_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、毕 业 论 文(设计)论文(设计)题目:基于pppoe的nat设计与实现系 别: 专 业: 学 号: 姓 名: 指导教师: 时 间: 毕 业 论 文(设 计) 开 题 报 告系别:计算机与信息科学系 专业:网络工程学 号姓 名论文(设计)题目基于pppoe的nat设计与实现命题来源教师命题 学生自主命题 教师课题选题意义(不少于300字):本选题的目的是开发汇集多个帐号带宽的nat网关。随着计算机网络的普及化,越来越多的人接入因特网,通过因特网来获取信息及通信,造成了ipv4的地址出现了严重不足的情况。此时,nat技术应运而生,此技术能让多台计算机共享一个或多个公网ip地址,从而暂时解决了ip

2、地址紧缺的困境,不仅如此,nat技术也能隐藏内部的网络结构使得内网更安全。其次,以太网是当今使用最广泛的局域网技术,基于以太网的internet接入也有很多,最常见的方式就是采用pppoe协议,通过帐号登陆来连接isp,然后isp分配一个公网地址给客户,接着客户就能使用此公网ip与因特网的计算通信了。所以,基于pppoe的nat代理服务器能使多台以太网上的计算机共享一个帐号,以充分利用网络的带宽,在设计成支持多帐号登陆的模式下,便能汇集多个帐号的宽带,更好地使用网络资源。研究综述(前人的研究现状及进展情况,不少于600字):nat(network address translation)技术是

3、一种将私有地址转化为合法ip地址的转换技术,它被广泛应用于各种类型internet接入方式和各种类型的网络中。internet地址分配委员会(iana) 规定了3个保留用的私有地址:-55、-55、-55,这些地址不会在因特网上被分配,只能在局域网中使用。这不仅完美地解决了ip地址不足的问题,还能够有效地避免来自于网络外部的攻击,隐藏和保护网络内部的计算机。从功能上看,nat技术分为四大类:1、传统nat,此方式的nat只允许内部网络的主机主动申请建立连接,会话只

4、能是由内向外,传统的nat又包含有两种类型:基本nat、napt,基本nat拥有多个公开的ip,当内部网络的主机向外部发起会话请求时,基本nat把内部网络中外出ip数据的源ip转换成外部的ip地址,而napt不仅会翻译ip地址,也会对传输层的端口号进行转换,它允许多台内部主机共享一个公网ip,napt是市场上使用最多的。2、双向nat,此种方式的nat既能从内部网络向外部网络发起会话,又能从外部网络向内部网络发起会话请求。当在外出或进入任何一个方向上建立连接时,把内部网络地址静态或动态绑定到全局唯一的址上。3、两次nat,这是nat的一个变种,它同时修改源和目的地址,在内部编址域和外部编址域存

5、在冲突时非常有用。4、多宿主nat,为了让一个内部网络能够在某个nat链路发生故障的情况下,也能够保持与外部网络的连通性,通常希望内部网络到相同或不同的isp具有多条连接(多宿主的),希望经过相同或不同的nat设备。现在使用最多的仍然是传统nat设备,尤其是napt设备,传统nat的映射方式为(内部地址,端口)与(外部地址,端口),有两种类型:1、对称型,把所有来自相同内部ip和端口号,到特定目的ip和端口号的请求映射到相同的外部ip地址和端口号,它不保证所有会话中的(私有地址,私有端口)有(公网ip,公网端口)之间绑定的一致性,而是为每个新的会话分配一个新的端口号。2、克隆型,又再细分为三大

6、类:full cone、restricted cone、port restricted cone。full cone会把所有来自相同内部ip和端口的请求都映射到相同的外部ip的端口,restricted cone只有当内部主机以前曾经给ip地址为x的外部主机发送过数据包时,外部主机x才能够把数据包发送给此内部主机,port restricted cone与restricted cone类似,只是多了端口的限制。在以太网环境下,windows操作系统本身针就对家庭网络或小型的interanet网络提供了一种internet连接共享服务:ics,从广义上讲,ics也是使用了nat技术,相当于nat

7、的简化版,用ics无需理解ip地址和路由方面的一些知识,但它不允许局域网和internet主机之间所有的ip通信,并且只能使用单一的公网ip地址,如果能在windows上实现一个基于pppoe拨号的nat,使之支持共享多个公网ip地址,也就能同时登陆多个帐号,并它们的带宽汇集起来。研究的目标和主要内容(不少于400字)本选题对pppoe协议和nat技术进行研究及分析,在windows平台上实现了一个pppoe的nat服务器,允许同时登陆多个帐号,能汇集所有帐号的流量。本选题研究内容如下:(1) 对整个nat代理的结构及模块进行分析设计,虽然核心内容是nat代理,但是由于pppoe位于链路层之上

8、,而nat占居网络层、传输层,故整个代理程序要分为几个模块,在pppoe登陆获取公网ip地址之后,才进入nat代理状态。(2) 根据分模块的设计思想,主要的模块有如下几个:1、以太帧收发模块:原始以太帧的收发一般都是通过驱动来完成的,windows平台下的网络构架遵循ndis规范,这里用的是位于ndis协议层的winpcap,winpcap能截获所有流经网卡的数据包,它封装了以太帧收发的函数,屏蔽了系统底层对网络的操作,对于研究、实现底层协议十分有用。2、网卡模拟模块:模拟出多个网卡,每个网卡只能接入mac地址为广播地址及本网卡地址的以太帧,对收到的以太帧缓存在起来再进行处理。3、pppoe模

9、块:由于是基于pppoe的nat代理设计,故须实现pppoe的核心部分:pppoe的用户登陆、pppoe的协议流程、pppoe帧的数据结构。每个虚拟出来的网卡都包含有一个pppoe的结构体,其中主要保存着pppoe的session id、isp分配的公网ip。4、nat模块:采用full cone型的napt,把所有来自相同内部ip和端口的请求都映射到相同的外部ip的端口,以更易于兼用其它的p2p下载软件。nat模块还包含有tcp/ip的部分内容,实现了ip层中对ip的分片及重组、对icmp数据报文的处理等。5、内存管理模块:如果每次接收或发送以太帧的时候都使用系统的内存操作函数分配内存的话,

10、会造成内存碎片,也会导致整个nat性能上的下降。这里设计了两个内存池,一个用于对以太帧的收发,而另一个则用于对ip分片及其它数据结构的保存。拟采用的研究方法a)查找并阅读相关资料,了解基本的内容,利用需求分析文档,对整个系统有个初步的架构。b)搜寻实验用的文件文档集和研究过程中用到的各种工具软件。c)根据已有的资料并利用模块化的思想对整个nat代理程序进行建模及分块设计d)采用vc+6.0开发工具完成整个程序的编写并在windows上进行测试。研究工作的进度安排2010年11月29号12月15号 与指导老师沟通交流,完成毕业论文选题。2010年12月16号12月30号 搜集资料,查阅文献,完成

11、开题报告。l2011年01月01号01月08日 完成文献综述l2011年01月09号02月25号 定出办公自动化系统的需求分析文档l2011年02月26号04月25号 整理相关资料并完成概要和详细设计l2011年04月26号05月01号 进行编码工作及过程中的必要性测试l2011年05月02号05月16号 后期的联机调试和测试l2011年05月17号05月31号 总结毕业设计的整个过程,完成毕业设计论文。参考文献目录(作者、书名或论文题目、出版社或刊号、出版年月日或出版期号)1 王艳平.windows 网络与通信程序设计(第2版)m.北京:人民邮电出版社,2009:12.2 赵雪峰.基于ppp

12、oe/ppp协议的带宽接入客户端拨号软件的实现d.中国地质大学.2005:22-26.3 rfc2516, a method for transmitting ppp over ethernet (pppoe)s. network working group.1999.24 邹航,杨元晔,苟光磊.nat网络地址转换技术分析j.重庆工学院学报.2007.21(7):89-91.5肖辽亮.nat-pt簇负载平衡的设计与实现j.计算机技术与发展.2006.16(3):80-82.6王南,孙保锁,王月平.p2psip系统中nat穿越方案的研究与设计j.计算机技术与发展.2009.19(10):66-6

13、9.7 rfc3022, traditional ip network address translators,jasmine networks,2001.8 郭士秋, ip协议体系m.北京:电子工业出版社,2002:71-76.9 w. richard stevens美.范建华,张涛等译.tcp/ip详解 卷1:协议m.北京:机械工业出版社.2007:33-34.10 politecnico di torino. winpcap documentationa, 2002.11 罗军舟,黎波涛,杨明,吴俊等,tcp/ip协议及网络编程技术m.北京:清华大学出版社,2004:22-26.12 d

14、ouglas e.comer美.林瑶,蒋慧,杜蔚轩等译.用tcp/ip进行网际互联(第一卷:原理、协议与结构)(第四版)m.北京:电子工业出版社, 2001:219-221.指导教师意见同意开题 签名: 年 月 日教研室主任意见同意开题 签名: 年 月 日目录摘要1关键词1引言11 底层实现11.1 nat总构架11.2 windows网络驱动41.3 网络i/o41.4 内存管理62 tcp/ip协议栈72.1 arp协议72.2 nat对传输层的影响92.3 ip分片及重组92.4 网络字节顺序113 pppoe协议123.1 pppoe发现阶段123.2 pppoe会话阶段124 流量汇

15、聚实现154.1 关于流量的汇聚154.2 实现方案154.3 转换超时175 测试176 小结17参考文献18abstract19keywords19致谢20附录21基于pppoe的nat设计与实现计算机与信息科学 网络工程专业 指导教师 摘要pppoe技术使得已有的以太网能方便地实现宽带接入和计费功能,但windows操作系统内置的pppoe及isp模块只支持用户单帐号登录,用户即使登录多个宽带帐号,再开启系统的宽带共享功能,也只能共享一个帐号的带宽。为解决这一问题,使用户能够在多帐号的状态下实现高速数据传输,本文在pppoe的基础上,设计并实现了一个可以汇聚多个帐号带宽的nat系统。实验

16、结果表明,运行该系统时,用户登录帐号越多,链路带宽越大,实现了汇聚多帐号带宽的功能,为用户和isp实现高速接入提供了另外一种途径。关键词pppoe;nat;windows ndis;winpcap;tcp/ip;带宽汇聚引言无论是pppoe(ppp over ethernet,基于以太网的ppp)还是nat(network address translation,网络地址转换)技术,都是当今使用最广泛的局域网宽带接入技术,在windows操作系统中,这两种技术都已内置,但缺点就是不能同时登陆多个宽带帐号来汇聚网络带宽,这在需要一些高速下载或上传而又没有能力升级现有带宽的网络系统中是满足不了用户

17、需求的。因此,我们设计并且实现了一种能汇集多个帐号带宽的nat系统,从而使用户既可以达到高速下载或上传的目的,又不用浪费更多的时间和精力去升级现有网络硬件系统以达到扩大网络带宽的目的,同时也为isp(网络服务提供商)在为用户提供网络服务时开辟了一个新的思路。1 底层实现1.1 nat总构架总框架图如下所示,在整个程序框架在,设计了两种称为“虚拟网卡”的结构体: pc 1 pc 2 pc 3 pc 4onic inic 内网网关 vnic_proc()pppoe服务器图1 nat总体框架第一种为onic(外网网卡),每个帐号都需要一个onic,一旦登录成功后,onic就相当于与ac有了虚拟的连接

18、,onic里面包含了同ac进行会话时所必需的参数,以及为了便于nat转换而设计的另外变量,流向onic的ip数据包有可能被转发至内网。/* 用户名/密码的最大长度 */#define ac_pap_login_max_len32/* ac信息的最大长度如:ac名等 */#define ac_info_max_len1024typedef struct _onicstruct _onic*pnext;/* 用户名及密码 */charuserac_pap_login_max_len;charpasswordac_pap_login_max_len;/* 用户登录后,ac分配的网络配置信息 */un

19、signed intodns_primary;/ 主dns服务器unsigned intodns_second;/ 备用dns服务器unsigned intoip;/ 公网ipunsigned charomac6;/ onic的macunsigned shortomtu;/ onic的mtuunsigned shortomss;/ onic的mssunsigned shortooffset;/ 为了便于对ip层以上的数据进行分片而设/ 作偏移用,ooffset = (omss/8)/* ac的主要信息 */unsigned intac_ip;/ ac的ipunsigned charac_mac

20、6;/ ac的macunsigned shortac_sessionid;/ ac与onic的pppoe会话idchar*ac_name;/ ac的名字char*ac_cookie;unsigned shortac_cookie_len;unsigned shortac_authproto;/ 认证协议(只支持pap)unsigned charac_ppp_id;/*/unsigned shortstatu;/ pppoe的状态标记unsigned shorttimeout;/ pppoe的超时计数器/*/memblknatmem;/ 内存池,为nat转换表分配内存/*/tcptuple*pt

21、cptuple;/ tcp转换链表unsigned intitcptuple;/ tcp转换表项的个数udptuple*pudptuple;/ udp转换链表unsigned intiudptuple;/ udp转换表项的个数icmptuple*picmptuple;unsigned intiicmptuple;unsigned shortitcpport;/ tcp端口转换序号unsigned shortiudpport;/ udp端口转换序号onic; 第二种为inic(内网网卡),inic实质上就是内网的网关,它为内网的pc提供nat转换,将流向外网的udp/tcp数据包进行端口及ip转

22、换、转发。typedef struct _inicunsigned intiip;/ inic的ipunsigned charimac6;/ inic的mtuunsigned shortimtu;unsigned shortimss;unsigned shortioffset;inic; 正如图1所示,vnic_proc()过程处理所有接收到的以太帧,它会根据帧的目的地址、帧的类型来调用其他的子模块进行处理,使得inic向内网表现出网关特性,onic表现出pppoe连接特性。可以说,vnic_proc()驱动着整个pppoe及nat,所有的网络i/o都在这里进行。1.2 windows网络驱动

23、ndis协议驱动ndis中间层驱动ndis微端口驱动图2 ndis框架结构在windows平台下,要实现原始以太帧的收发就必须在驱动层实现,因为在用户层没有相关的api。windows的网络驱动遵循ndis标准,整个ndis框架如下图所示:ndis驱动程序总共为三个层次:协议驱动、中间层驱动、微端口驱动。协议驱动位于ndis体系的最高层,经常用作实现协议栈(如tcp/ip或ipx/spx堆栈);中间层驱动位于微端口驱动和传输协议驱动之间,是基于链路层和网络层之间的驱动;微端口驱动就是网卡驱动,它负责管理网卡,包括通过网卡发送和接收数据,它也为上层驱动提供接口。在这三个层次上,都可以接收并发送以

24、太帧。本文使用winpcap来收发原始以太帧,这是一个功能强大的网络抓包驱动,在windows平台也具有发包功能,winpcap属于ndis的协议层,独立于系统的协议栈。windows的ddk开发包中也有相关的驱动程序设计方法,但使用winpcap可以避免设计内核驱动时需要考虑的诸多问题,从而把精力用在pppoe及nat的设计之上。1.3 网络i/o“网络i/o”模块提供了原始以太帧的收发接口,vnic_proc()通过接收接口来获取所有的帧,其它的子模块则使用发送接口将帧传送到网络上去。此模块中定义了两个结构体:/ 允许协议层驱动绑定的最大接口数#define max_interface 3

25、2/ intfinfo用于保存下winpcap绑定的下层网卡的信息typedef struct _intfinfointnumber;/ 可用接口的数量char*intfnamemax_interface;/ 各接口的名字char*intfdescmax_interface;/ 各接口的描述信息intfinfo;/ intf在初始化网络i/o时使用typedef struct _intfintindex;/ winpcap绑定的下层网卡序号intrecvbuflen;/ 接收缓存区长度 bintsendbuflen;/ 发送缓存区长度 bintrecvtimeout;/ 接收超时 msintr

26、ecvpktlen;/ 接收数据包的最大长度 bintf;若要使用网络i/o模块的输入输出功能,就必须指定一个winpcap已绑定的本地接口,并通过intf结构体来配置此接口的相关参数,获取网卡的绑定信息可以使用如下函数:int intfinfo_init(intfinfo* pintfinfo);在调用intfinfo_init()后,如果返值为1则所有的网卡信息都保存在pintfinto所指向的内存里。接着分配并填充一个intf结构体,其中,index域指明了所选择的接口序号,其范围为0, intfinfo. number -1,recvbuflen域指明了接收缓存区的长度,当有帧到达网卡

27、接口时会先把它保存起来,这样可以有效地减缓由于流量过大而导致帧的丢失,recvtimeout域指明了接收帧的间隔,选择1ms,recvpktlen域指明要接收数据包的最大长度,在以太网下mtu一般都为1500b,再加上以太帧首部14b,故设置为1514。最后,调用接口初始化函数,表示选择接口index:int intf_init(intfinfo* pintfinfo,intf* pintf);如果返值为1,就表明网络i/o初始化成功,然后,就能通过以下两个i/o函数收发以太帧了:int intf_recvpkt(char* recvbuf);int intf_sendpkt(char* se

28、ndbuf,int sendlen);当不再需要使用网络i/o模块的输入输出时,通过调用intf_free()来释放掉模块所占用的资源。上述功能本质上都封装了winpcap的相关函数,在编译时还需要加入以下头文件及编译选项:#include #include #include #pragma comment(lib,wpcap)1.4 内存管理进行nat转换及ip分片重组时,都会需要用内存来记录下相关的数据,频繁地分配及释放内存不仅会影响程序的运行效率还会使系统产生过多的内存碎片。可以预先分配一块大的内存,再对内存细分成小块的固定内存,需要内存的时候就提供已有的内存块,然后对内存块进行回收。“

29、内存管理”模块实现以上功能,此模块中的memblk结构体表示预先分配的大块内存,mem结构体表示从memblk中获取的小块固定内存,它们的定义如下:typedef struct _memstruct _mem*pnext;/ 下一个内存块charbuf0;/ 数据区mem;typedef struct _memblkstruct _memblk*pnext;char*pbase;/ 大内存块的起始地址mem*pfree;/ 可用的固定小内存块intiblklen;/ 小内存块的长度intiblknum;/ 小内存块的数量critical_section lcok;/ 同步对小内存块链表pfre

30、e 的操作memblk;内存管理的操作函数有:/ 初始化一个内存块链表int memblk_init(memblk*);/ 释放一个内存块链表void memblk_free(memblk*);/ 从内存块链表中获取一块可用内存void* memblk_getmem(memblk*);/ 将一块可用内存回收给链表中void memblk_freemem(memblk*,void*);2 tcp/ip协议栈整个框架是独立于系统协议栈的,所以在实现nat的同时,还必须要实现tcp/ip协议栈的某些功能。2.1 arp协议arp协议可以将ip地址映射成mac地址,内网网关inic应该具备arp协议,

31、这样可以方便其它pc的配置(配置成静态地址表稍微复杂),整个arp模块实现了对arp请求的应答,并保存下相应的arp映射关系。模块定义的宏与结构体如下:/ 硬件地址类型 以太网#define arp_addrt_eth0x0001/ 协议地址类型 - ip#define arp_addrt_ip0x0800/ 硬件地址长度#define arp_addrl_eth0x06/ 协议地址长度#define arp_addrl_ip0x04/ arp请求#define arp_opt_req0x0001/ arp应答#define arp_opt_ack0x0002/*32位windows操作系统的

32、内存对齐在默认情况下以4字节为单位这里设置内存对齐的编译选项,将内存对齐的单位改成1字节*/#pragma pack(push)#pragma pack(1)/ arp首部typedef struct _arphdrunsigned shorthardaddrtype;unsigned shortprotaddrtype;unsigned charhardaddrlen;unsigned charprotaddrlen;unsigned shortopt;/unsigned charhardaddrsrc6;unsigned intprotaddrsrc;unsigned charhardad

33、drdst6;unsigned intprotaddrdst;arphdr;#pragma pack(pop)/ ip-mac的映射关系typedef struct _arpcacheunsigned intip;unsigned charmac6;arpcache;模块向外导出了两个实现arp操作的接口,一个用于arp的应答,一个用于查询arp缓存表:void arp_reply(inic* pinic,char* pbuf, int ilen);unsigned char* arp_find(unsigned int arp_ip);arp模块不需要进行初始化,它只是实现arp的应答请求,

34、以确保内网的pc能够获取网关的mac,并向nat模块提供ip到mac映射的查询功能。2.2 nat对传输层的影响传输层的tcp及udp协议为了防止数据被篡改,从而在计算较验和时加上网络层的ip地址信息,这样的话,在对tcp及udp数据包进行转换时,还必须得重新计算它们首部的较验和。/ tcp及udp的伪首部typedef struct _psdhdrunsigned intsrcip;/ 源ipunsigned intdstip;/ 目的ipunsigned charzero;/ 保留,设置为0unsigned charproto;/ 协议号,与ip首部的相同unsigned shortlen

35、;/ tcp/udp的总长度,首部长度+数据长度psdhdr;用于计算tcp及udp较验和的函数:unsigned short tcp_udp_checksum(unsigned short* ppsdhdr,unsigned short *ptcp_udp_data,int itcp_udp_data);在传入的参数中,ppsdhdr为已填充好的伪首部,ptcp_udp_data为指向数据的内存指针(包括首部),itcp_udp_data为数据的总长度(包括首部)。2.3 ip分片及重组ip数据包在网络传输的过程中,如果链路层的mtu小于ip包的大小,则此数据包就会被分成小于或等于mtu的若

36、干个小数据包再进行传送,将ip进行分片的功能在nat模块中集成,如果需要分片的话,数据包就会被分成ooffset或ioffset的大小再进行传送。若onic接收到被分片的ip包,则就须重组,因为不重组的话,就无法再重新计算tcp或udp的较验和,ip重组模块可以实现重组功能,此模块定义了几个结构体,其中有两个最为重要:/ 保存ip分片的缓存区长度/*每个ip分片表项的长度为256 b减去结构体的其他成员域(共 12 b)后,便是数据区的长度*/#define ipfrgpktlen 244/ ip分片表项typedef struct _ipfrgpktstruct _ipfrgpkt*pnex

37、tpkt;/ 下一个ip分片包struct _ipfrgpkt*pnext;/ 当前ip分片包的下一个内存块intilen;/ 当前内存块存放的数据长度chardataipfrgpktlen;ipfrgpkt,*pipfrgpkt;/ 重组ip分片的时钟间隔#define ipfrgmodle_timer 3000/ ip分片的生命周期#define ipfrgmodle_frg_ttl 10/ 实质为ipfrgpkt的结构体长度#define ipfrgmodle_mem_len 256/ ip分片重组管理模块标识typedef struct _ipfrgmodlehandlehtimer;

38、/ 时钟线程的句柄intbstatu;/ ip分片重组模块的状态ipfrg*pipfrglist;/ ip分片链表memblkmemlist;/ 内存链表critical_section lock;/ 同步对ip分片链表的操作ipfrgmodle;几个向外导出的主要接口:/ char*转化为ipfrgpkt*ipfrgpkt* pchartopipfrgpkt(memblk*,char*,int);/ 将一个ip分片链表(包含ip头)转化为char*(要保证缓存区足够大)void ipfrgpktstoippkt(ipfrgpkt*,char*);/ 释放一个ip分片链表pnext及pnext

39、pkt所指向的内存块void freeipfrgpkts(memblk*,ipfrgpkt*);/ 对分片进行重组,返值非null重组完成ipfrgpkt* ipfrg_recombinated(ipfrgmodle*,char*,int);2.4 网络字节顺序字节顺序是长度跨越多个字节的数据被存储的顺序,intel x86机器使用小尾顺序,网络使用大尾顺序,为了提升程序的可移植性,在传送网络数据包时,应先判断本机的字节顺序,如果为小尾顺序就转化为大尾顺序再进行传送,相反,接收到网络数据包后,也应进行相应的判断,如果需要的话再转化字节顺序。大尾字节顺序的判断函数声明为:inline bool

40、isbigendian();此外,还定义了四个宏,用于实现网络字节顺序与本机字节顺序的互换:#define hton16(us) (isbigendian() ? (us) : blswap16(us)#define ntoh16(us) hton16(us)#define hton32(ul) (isbigendian() ? (ul) : blswap32(ul)#define ntoh32(ul) hton32(ul)blswap16与blswap32也是两个宏,用于实现16位与32位整形变量的字节顺序转换,宏的定义如下:#define blswap16(us)(unsigned sho

41、rt)(us) & 0xff00) 8 | (unsigned short)(us) & 0x00ff) 24 | (unsigned int)(ul) & 0x00ff0000) 8 | (unsigned int)(ul) & 0x0000ff00) 8 | (unsigned int)(ul) & 0x000000ff) 24)3 pppoe协议pppoe全称ppp over ethernet,是在以太网上传播ppp帧的技术,总共包括两大阶段:pppoe发现阶段、pppoe会话阶段。3.1 pppoe发现阶段在发现阶段期间,主机在以太网中寻找并选择一个访问集中器(access conce

42、ntrator,简称ac),一旦找到,就确定了ac的物理地址、会话id。图3 pppoe封包格式版本 类型 代码 会话id长度 数据无论是在发现阶段还是会话阶段,数据始终都是以pppoe头进行封装:版本:占4位,始终填充0x01;类型:占4位,始终填充0x01;代码:占1字节,在pppoe的不同阶段填充不同的内容,共有五个值,分别是padi、pado、padr、pads、padt;会话id:占2字节,在pads消息中由ac分配而来;长度:占2字节,数据的长度,不包括以太头和pppoe头本身;图4 pppoe发现阶段交互过程pads 进入会话padr 请求服务pado 响应pcpcacpadi

43、寻找ac发现阶段的数据交互流程为:3.2 pppoe会话阶段图5 ppp在协商阶段的封包格式 协议类型 代码 标识 长度 数据发现阶段过后,主机便确定了提供接入服务的ac,并且获取了ac的mac及与ac进行会话的id,接着就进入会话阶段,在此阶段期间,主机将与ac进行ppp协商及验证,协商包括两个部分的内容:lcp、ncp,至于验证,本文采用的是非常流行的pap认证协议。会话阶段的所有数据都封装在如下结构体中:协议类型:占2个字节,表示ppp所承载的协议,lcp为0xc021、ncp为0x8021、pap为0xc023;代码:占一个字节,表示lcp包的种类,主要包括:configure-req

44、uest、configure-ack、configure-nak、configure-reject、protocol-reject、echo-request、echo-reply、terminate-request、terminate-ack;标识:占一个字节,用来匹配请求和应答包;长度:占两个字节,其值表示“代码域+标识域+长度域+数据域”的总大小,但不能超过mru;数据:在lcp、ncp协商阶段,选项的格式为“选项类型+整个选项的长度+选项值”,在验证阶段,格式为“帐号长度+帐号内容+密码长度+密码内容”;图6 本文的ppp协商过程失败失败失败成功成功成功lcp协商ncp协商nat转换断开

45、连接pap验证整个协商/验证的流程为:如果要协商某个选项就发送configure-request报文,对方则根据自己的配置情况来进行应答:如果对收到的每个选项及全部值都接受就返回configure-ack;如果每个收到的选项都是可认知的,但某些值不可接受,就返回configure-nak,并在返回的报文中将值改为自己能接受的;如果选项中存在不可辨认的或不可协商的,就返回configure-reject;如果收到带有未知代码的lcp包时,就返回protocol-reject;echo-request与echo-reply一般情况下用来测试链路的对端是否仍然存在,收到echo-request后得以

46、echo-reply进行应答;terminate-request用于关闭一个连接,收到后必返回terminate-ack,并释放ppp连接占用的资源。lcp主要协商三个选项:最大接受单元、认证协议、魔术字,魔术字仅是用来检测链路是否存在环路,最大接受单元(简称mru)最重要,它规定了ppp所能承载的最大数据长度,一般为1492字节。对于因特网接入,ncp实质就是从ac处获取公网ip及dns服务器的ip。在验证阶段,主机发送用户名及密码给ac,ac进行核对后判断用户是否可以接入因特网。pppoe协议的连接、维护功能都在pppoe模块中实现,它向外导出了几个函数接口:/ 在使用pppoe模块的其他

47、函数前,必须先调用pppoe_init()来初始化int pppoe_init();/ 不需要使用此模块后,再释放其资源void pppoe_free();/ 使用onic来进行连接int pppoe_conn(onic* ponic,char* ppbuf);/ 断开onic与ac的连接int pppoe_disconn(onic* ponic);/ 向pppoe模块增加一个已断开的onicvoid pppoe_adddisconnected(onic* ponic);/ 获取已断开连接的所有oniconic* pppoe_getdisconnected();/ 获取公网ip的处理过程oni

48、c* pppoe_getpublicip_proc(char* pbuf,int ilen);/ 发关一个ppp_terminate ack帧int pppoe_ppp_terminate_ack_send(char* pbuf,int ilen);/ 发送一个padt帧int pppoe_padt_send(onic* ponic);/ 进行echo应答int pppoe_ppp_ses_echo_proc(char* pbuf,int ilen);pppoe_conn()实现用户登陆的功能,调用pppoe_conn()时,就不能再在其他地方调用它,因为pppoe模块只允许一个帐号登陆结束后

49、再登陆另一个帐号,返值为pppoe_success则表示登陆成功。pppoe_getdisconnected()用于获取已断开连接的onic,登陆失败或者一个ppp连接被断开,那么对应的onic就会被插入pppoe模块中,直到调用此函数才被移除。4 流量汇聚实现4.1 关于流量的汇聚natonic_1onic_2 inic onic_nacpcsip_2ip_nip_1图7 多帐号流量汇聚举例假设有如下逻辑拓扑图,n个onic登陆成功(则有n条到ac的链路,公网ip分别为ip_1、ip_2、ip_n),每条链路都具有x mb/s的带宽,主机pc将inic作为网关,并且pc与外网的计算机s通信,

50、s的带宽足够多。如果要汇聚流量,pc与s的通信就须满足一些要求:pc的应用层程序应该向s发起m个连接,nat将这m个连接分配到n条链路上去,转换成ip_1、ip_2、 、ip_m与s的连接,而且s还不能查觉。像在一些文件传输服务上,这是可行的。比如,下载文件时,pc可以启动m个连接,分别请求下载s上某文件的m个数据块,这m个请求是相互独立的,nat将每个连接分配各个链路上。在s看来,请求的主机就像是ip_1、ip_2、ip_m,于是s就分别将数据块传送ip_1、ip_2、ip_m。但在pc看来,通信的目的地只有一个,与s的每个连接都具有x mb/s传输的速度,故文件传送的总带宽为 m * x

51、mb/s。 当然,前面只是举了个能汇聚多帐号流量的例子,某些p2p程序也能达到类似的效果,它们服务相同、请求独立,只要实行多连接,就能汇聚多个链路的带宽。4.2 实现方案根据前面的分析,本文的nat实现方法如下:一、当需要生成nat表项时,根据协议类型,选择一个最少转换项的onic二、选择onic中没有被转换的端口作为pc的外网的端口三、生成转换表项,转发数据包四、对于udp,如果查找所有的转换链表时,找到对应的内网(ip,port),就直接转换并发送定义如下的结构体作为nat转换的元组:/ tcptypedef struct _tcptuplestruct _tcptuple*pnext;/

52、 下一个tcptuple结构体指针unsigned intiip;/ 内网ipunsigned intxip;/ 与外网主机通信的ipunsigned intoip;/ 转换为外网的ipunsigned shortiport;/ 内网端口unsigned shortxport;/ 与外网主机通信的端口unsigned shortoport;/ 转换为外网的端口unsigned shortalive;/ 转换超时,为0时将被移除转换链表tcptuple;/ udptypedef struct _udptuplestruct _udptuple*pnext;unsigned intiip;unsigned intxip;unsigned intoip;unsigned shortiport;unsigned shortxport;unsigned shortop

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论