您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第14章-路由器基本功能实现程序-1
计算机硬件基础教学中心Copyright©byNUPTAllrightsreserved.1TechnologyofNetworkProgramming网络编程技术第14章路由器基本功能实现程序网络编程技术2概述路由器是实现IP协议最为关键的设备之一。通过简单路由器程序的设计与实现,掌握路由器基本工作原理,理解路由选择与数据包转发的方法网络编程技术3•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术4编程训练目的•在理解IP协议、ICMP协议与路由选择基本工作原理的基础上,完成路由器基本功能的设计与编程实现•掌握Windwos平台下路由程序测试环境的搭建方法•熟悉Winpcap编程,掌握数据包捕获与发送的方法。熟悉动态路由协议原理以及动态路由表的实现方法网络编程技术5•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术6编程训练要求利用Winpcap编写一个简单的路由处理程序,该路由程序应该至少应该包括以下功能:•静态路由表维护•IP数据包处理•ARP请求与解析•处理IP数据包的TTL值•重新计算IP数据包的头部校验和•生成和处理ICMP报文•记录日志功能网络编程技术7程序运行的参考界面网络编程技术8•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术9路由器结构交换构件路由选择软件路由选择协议路由表分组处理转发表123111222333分组转发路由选择输出端口输出端口输入端口输入端口网络编程技术10路由器基本功能•为经过的IP数据包选择路由•处理IP数据包选项•处理IP数据包TTL值•分片处理•重新计算IP数据包的头部校验和•生成和处理ICMP报文•实现动态路由协议、维护静态路由•实现ARP协议、形成数据帧网络编程技术11路由选择的基本原理•IP互联网采用表驱动的路由选择算法需要路由选择的设备保存一张IP路由表路由表存储有关目的地址及怎样到达目的地的信息通过查询路由表决定把数据报发往何处•IP路由选择利用IP地址隐藏主机信息连接到同一网络的所有主机共享同一网络号网络编程技术12标准的路由选择算法网络编程技术13子网选路网络编程技术14路由表•路由表中的每一条路由表项含有五个属性:目的网络地址、网络掩码、下一跳、接口和跃点数网络编程技术15相关的ICMP差错报文•目的不可达报文当路由器不能为数据包找到路由器或主机交付数据包时,就丢弃该数据包,然后向源主机发出ICMP目的不可达报文•超时报文路由器在转发数据包时,如果生存周期TTL值减1后为0,就丢弃这个数据包。当丢弃这样的数据包时,路由器向源主机发送一个超时报文当计时器的时限到,而目的主机还没有接收到一个数据包的所有分片时,它会将接收的分片丢弃,并向源主机发送超时报文网络编程技术16•编程训练目的•编程训练要求•相关知识介绍•程序设计分析•扩展与提高提纲网络编程技术17测试环境的搭建•测试环境示意图网络编程技术18测试环境的搭建•测试环境示意图计算机A计算机B服务器逻辑结构物理结构计算机A计算机B服务器1U网络编程技术19路由程序的设计•路由器初始化模块初始化模块负责初始化设备,添加与路由器直接相连网络的路由表项,并启动相应的数据包捕获与处理模块•静态路由表维护模块静态路由表维护模块完成路由表的添加、删除以及显示•数据包捕获与处理模块数据包捕获与处理模块用于捕获流经本路由器的数据包并按照路由协议进行处理网络编程技术20定义数据包头数据结构#pragmapack(1)typedefstructFrameHeader_t{//帧首部UCHARDesMAC[6];//目的地址UCHARSrcMAC[6];//源地址USHORTFrameType;//帧类型}FrameHeader_t;typedefstructARPFrame_t{//ARP帧FrameHeader_tFrameHeader;//帧首部WORDHardwareType;//硬件类型WORDProtocolType;//协议类型BYTEHLen;//硬件地址长度BYTEPLen;//协议地址长度WORDOperation;//操作值UCHARSendHa[6];//源MAC地址ULONGSendIP;//源IP地址UCHARRecvHa[6];//目的MAC地址ULONGRecvIP;//目的IP地址}ARPFrame_t;网络编程技术21定义数据包头数据结构typedefstructIPHeader_t{//IP首部BYTEVer_HLen;//版本+头部长度BYTETOS;//服务类型WORDTotalLen;//总长度WORDID;//标识WORDFlag_Segment;//标志+片偏移BYTETTL;//生存时间BYTEProtocol;//协议WORDChecksum;//头部校验和ULONGSrcIP;//源IP地址ULONGDstIP;//目的IP地址}IPHeader_t;typedefstructICMPHeader_t{//ICMP首部BYTEType;//类型BYTECode;//代码WORDChecksum;//校验和WORDId;//标识WORDSequence;//序列号}ICMPHeader_t;网络编程技术22路由程序的设计•路由器初始化模块初始化模块负责初始化设备,添加与路由器直接相连网络的路由表项,并启动相应的数据包捕获与处理模块•静态路由表维护模块静态路由表维护模块完成路由表的添加、删除以及显示•数据包捕获与处理模块数据包捕获与处理模块用于捕获流经本路由器的数据包并按照路由协议进行处理网络编程技术231、定义存储信息接口数据结构typedefstructip_t{//网络地址ULONGIPAddr;//IP地址ULONGIPMask;//子网掩码}ip_t;typedefstructIfInfo_t{//接口信息CStringDeviceName;//设备名CStringDescription;//设备描述UCHARMACAddr[6];//MAC地址CArrayip_t,ip_t&ip;//IP地址列表pcap_t*adhandle;//pcap句柄}IfInfo_t;//打开并由一个线程监听流经该接口的数据报网络编程技术241、定义路由表数据结构typedefstructRouteTable_t{//路由表结构ULONGMask;//子网掩码ULONGDstIP;//目的地址ULONGNextHop;//下一跳步UINTIfNo;//接口序号}RouteTable_t;网络编程技术252、定义全局变量IfInfo_tIfInfo[MAX_IF];//接口信息数组UINT_PTRTimerCount;//定时器个数CListSendPacket_t,SendPacket_t&SP;//发送数据包缓存队列CListIP_MAC_t,IP_MAC_t&IP_MAC;//IP-MAC地址映射列表CListRouteTable_t,RouteTable_t&RouteTable;//路由表网络编程技术26路由器初始化模块获得本机的设备列表根据设备列表获取各接口及各接口的所有IP信息打开每个设备接口获取各接口的MAC地址开始初始化路由表设置过滤规则:仅仅接收ARP响应帧和需要路由的帧释放设备列表初始化结束开启数据包处理线程网络编程技术273、初始化-获得本机的设备列表//获得本机的设备列表if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL/*无需认证*/,&alldevs,errbuf)==-1){//错误,返回错误信息sprintf(strbuf,pcap_findalldevs_ex错误:%s,errbuf);MessageBox(strbuf);PostMessage(WM_QUIT,0,0);}网络编程技术283、初始化-获得接口信息和IP地址信息for(d=alldevs;d!=NULL;d=d-next){if(d-addresses!=NULL)//排除集成modem的影响(没有IP地址){//得到一个有效的接口和其IP地址列表IfInfo[i].DeviceName=d-name;IfInfo[i].Description=d-description;for(a=d-addresses;a;a=a-next){if(a-addr-sa_family==AF_INET){ipaddr.IPAddr=(((structsockaddr_in*)a-addr)-sin_addr.s_addr);ipaddr.IPMask=(((structsockaddr_in*)a-netmask)-sin_addr.s_addr);IfInfo[i].ip.Add(ipaddr);j++;}}if(i==MAX_IF)//最多处理MAX_IF个接口{break;}else{i++;}}网络编程技术293、初始化-打开设备接口//打开接口for(i=0;iIfCount;i++){if((IfInfo[i].adhandle=pcap_open(IfInfo[i].DeviceName,//设备名65536,//最大包长度PCAP_OPENFLAG_PROMISCUOUS,//混杂模式1000,//超时时间NULL,//远程认证errbuf//错误缓存))==NULL){//错误,显示错误信息sprintf(strbuf,接口未能打开。WinPcap不支持%s。,IfInfo[i].DeviceName);MessageBox(strbuf);PostMessage(WM_QUIT,0,0);}网络编程技术303、初始化-获得各接口MAC地址//开启数据包捕获线程,获取本地接口的MAC地址,线程数目为网卡个数CWinThread*pthread;for(i=0;iIfCount;i++){pthread=AfxBeginThread(CaptureLocalARP,&IfInfo[i],THREAD_PRIORITY_NORMAL);if(!pthread){MessageBox(创建数据包捕获线程失败!);PostMessage(WM_QUIT,0,0);}}//为得到真实网卡地址,使用虚假的MAC地址和IP地址向本机发送ARP请求setMAC(srcMAC,66);//设置虚假的MAC地址srcIP=inet_addr(112.112.112.112);//设置虚假的IP地址for(i=0;iIfCount;i++){ARPRequest(IfInfo[i].adhandle,srcMAC,srcIP,IfInfo[i].ip[0].IPAddr);}网络编程技术313、初始化-初始化路由表//初始化路由表并显示RouteTable_trt;for(i=0;iIfCount;i++){for(j=0;jIfInfo[i].ip.GetSize();j++){rt.IfNo=i;rt.DstIP=IfInfo[i].ip[j].IPAddr&IfInfo[i].ip[j].IPMask;rt.Mask=IfInfo[i].ip[j].IPMask;rt.NextHop=0;//直接投递RouteTable.AddTail(rt);m_RouteTable.InsertString(-1,IPntoa(rt.Mask)+--+IPntoa(rt.DstIP)+--+IPntoa(rt.NextHop)+(直接投递));}}网络编程技术323、初始化-设置过滤规则开始捕获//设置过滤规则:仅仅接收arp响应帧和需要路由的帧CStringFilter,Filter0,Filter1;只接收需要转发的IP数据报,共同特点是目的Filter0=“(”;MAC地址指向本机
本文标题:第14章-路由器基本功能实现程序-1
链接地址:https://www.777doc.com/doc-6551225 .html