基于PPPoE的NAT设计与实现.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于PPPoE的NAT设计与实现 一、概述 本NAT基于PPPoE,支持多帐号登陆,能汇聚多帐号的带宽,由于在设计上采用了WinPcap作为网络I/O,并且独立于系统的协议栈,因而可移植性很强。 NAT设计构思图: ONIC 连接PPPoE服务器的外网网卡 INIC 作为内网网关的网卡 typedef struct _ONIC { unsigned char OMAC[6]; // 外网网卡MAC unsigned short OMTU; // 网卡与AC之间的MTU unsigned int OIP; // 外网的IP … … }INIC; typedef struct _INIC { unsigned char IMAC[6]; unsigned short IMTU; unsinged int IIP; // 内网接口的IP … … }INIC; ONIC、INIC都是虚拟出来的网卡接口,主要包含了MAC与MTU,VNIC_Proc() 是虚拟网卡处理帧过程,所有接收到的以太帧都在此函数中进行处理。 二、模块 宏观上,ONIC模拟了多个网卡(多用户),能登陆、获取公网IP,INIC则作为内网的网关接口;细节上,NAT的具体实现由几大模块组成,本文采用VC 6.0来开发,各模块的简介如下: 1、网络I/O 使用WinPcap驱动实现网络I/O接口,此模块向外导出以太帧的收发函数: int Intf_RecvPkt(char* RecvBuf); int Intf_SendPkt(char* SendBuf,int SendLen); 2、虚拟接口 (1) INIC、ONIC结构体分别定义在inic.h与onic.h里; (2)vnic.*包含着虚拟网卡对帧的处理过程, VNIC_Proc() 定义于vnic.cpp中,直接调用其它模块的接口,实现了PPPoE登陆、注销、NAT转换的功能。 3、PPPoE模块 在此模块中,实现了帐号登陆、注销、处理登陆、响应Echo帧等主要功能。 // 进行PPPoE登陆,登陆必需的信息保存在ONIC中 // 登陆成功后,将得到公网IP及DNS,以进行NAT int PPPoE_Conn(ONIC* pONIC,char** pPBuf); // 断开一个帐号的连接 int PPPoE_DisConn(ONIC* pONIC); // 对ONIC登陆过程中的帧进行处理,若登陆成功,则返回的ONIC指针非空 ONIC* PPPoE_GetPublicIP_Proc(char* pBuf,int iLen); // 处理PPPoE的Echo帧,及时响应服务器的心跳报文 int PPPoE_PPP_SES_Echo_Proc(char* pBuf,int iLen); 4、TCP/IP模块 本文的TCP/IP协议栈十分精简,主要进行ARP映射、IP分片重组、字节顺序转换、较验和计算。 // 在ARP缓存表中查找IP对应的MAC unsigned char* ARP_Find(unsigned int ARP_IP); // 对IP分片进行重组,如果返值非空,则重组完成 IPFrgPkt* IPFrg_Recombinated(IPFrgModle*,char*,int); // 计算较验和 unsigned short CheckSum(unsigned short *buffer,int size); /* 字节顺序的转换: 将小端字节顺序转换成网络字节顺序 */ BLSwap16(US) BLSwap32(UL) 5、NAT模块 此模块实现了NAT的转换细节,本文的NAT类型为混合类型,将“动态转换”与“NAPT”相结合,将TCP连接、UDP通信平分到各个ONIC之上,对于某些应用,达到了流量汇聚的效果。 向外导出的两个接口: // 将内网的IP数据包转发至外网 void NAT_ItoO(char* pDstMAC,char* pBuf,int iLen); // 将外网的IP数据包转发至内网 void NAT_OtoI(char* pDstMAC,char* pBuf,int iLen); 6、内存管理 在“保存TCP、UDP的转换表项”、“重组IP数据包分片”时,需要大量的内存,如果等到每次需要内存时再分配内存,不需要时就释放,会造成效率下降、内存碎片过多的问题;所以,本文使用内存块来管理、优化内存的使用:先分配一块大的内存,再将它分成固定的小内存块,然后,对内存分配与释放的问题就化归为对小块内存的操作。 // 初始

文档评论(0)

ranfand + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档