实验7.路由器基本功能实现程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七路由器基本功能的设计和实现

序号:14姓名:邓博文学号:20131120014成绩指导教师:序号:11姓名:叶爽学号:20131120005成绩指导教师:序号:13姓名:徐润浩学号:20131120013成绩指导教师:序号:53姓名:王伟雄学号:20131170029成绩指导教师:

一、实验目的:

(1) 实现静态路由表维护

(2) 实现IP数据包处理、处理IP数据包的TTL值、ARP请求与解析、重新计算IP数据包的头部校验值

(3) 熟悉生成和处理ICMP报文的方法

(4) 要求有良好的编程规范与注释信息,要求有详细的说明文档,包括程序的设计思想、活动图、关键问题以及解决方法。

二、实验环境:

(1)VC6.0

(2)局域网能连接Internet。

三、程序设计的关键问题以及解决方法有哪些?

1、由于winpcap不提供获得本机MAC地址的方法,导致我们不知道怎样获得本机MAC地址。

解决方法:本程序采用发送ARP包的方式获得本机MAC,即首先发送目的IP 为本机的ARP请求包,再捕获ARP应答包即可获得本机的MAC地址。由函数unsigned char*GetSelfMac()实现,本函数负责获得本机的MAC地址,实现方法是给本机发送ARP请求数据帧,并解析本机的ARP应答数据帧,原理和获取其它主机MAC地址类似,唯一的区别是发送和接受在同一个线程中实现。2、如何更快高速的完成路由器的路由转发功能?

解决方法:建立两个全局的链表,即数据包的缓存列表SP和IP地址、MAC地址映射的缓存列表IP-MAC。数据包缓存列表SP用于存储需要转发但暂时没有下一跳MAC地址的IP数据包;缓存列表IP-MAC用于存储IP地址与MAC地址的映射关系。路由器得到需要转发的数据包后,可以首先在IP-MAC缓存列表查找下一跳的MAC地址,如果找到则转发该数据包,否则把数据包存入缓存队列SP中并向下一跳的MAC地址后再转发该数据包。

四、描述程序设计过程,并画出程序活动图。

按照简单路由程序的实现要求,本程序可以分为路由器初始化、静态路由表维护以及数据包捕获与处理三大模块。

1、路由器初始化模块

初始化模块负责初始化设备,添加与路由器直接相连网络的路由表项,并启动相应的数据包捕获与处理模块。

定义相关数据结构

路由器初始化模块需要初始化各个接口信息以及路由表,因此首先定义存储接口信息的数据结构IfInfo-t以及路由表结构RouteTabe-t。

定义全局变量

可以定义数组IfInfo来存储路由器各接口的信息,定义Clist链表RouteTable 来存储路由表信息,定义int型变量IfCount记录接口的数量。

图4.1初始化流程

2、静态路由表维护模块

静态路由表维护模块完成路由表的添加、删除以及显示。

在程序初始化模块已经建立了一个全局的初始路由表RouteTable,并向路由表中添加了可以到达与路由器直连子网的路由。

3、数据包捕获与处理模块

数据包捕获与处理模块用于捕获流经本路由器的数据包并按照路由协议进行处理。

建立两个全局的链表,即数据包的缓存列表SP和IP地址、MAC地址映射的缓存列表IP-MAC。数据包缓存列表SP用于存储需要转发但暂时没有下一跳MAC 地址的IP数据包;缓存列表IP-MAC用于存储IP地址与MAC地址的映射关系。路由器得到需要转发的数据包后,可以首先在IP-MAC缓存列表查找下一跳的MAC地址,如果找到则转发该数据包,否则把数据包存入缓存队列SP中并向下一跳的MAC地址后再转发该数据包。

捕获到IP数据包后就需要路由器来转发它,下图就比较直接地表示了路由器对已捕获数据包的处理流程。

图4.2 IP数据包的处理流程

为了得到下一跳的MAC地址,路由程序需要向下一跳的目的地址发送ARP 请求,因此路由程序还要处理捕获的ARP应答包。

图4.3ARP数据包的处理流程

五、总结

通过本次实验,加深了对路由器基本程序的了解,掌握了winpcap编程基本技巧,编程能力得到了提高,对路由器的结构有了更深入的了解,对路由器关于IP数据包处理、IP数据包的TTL值的处理、ARP请求与解析、重新计算IP数据包的头部校验等有了进一步的认识,熟悉生成和处理ICMP报文的方法。小组成员学习了一个项目开发的完整流程,在开发的过程中,意识到了合作的重要性。本项目带给团队最大的教训便是,在编写代码之前,一定要做好详细的设计,这

个软件拥有什么功能,可以分为几大模块,模块之间的关系是什么。

相关文档
最新文档