资源描述
案卷号
日期
2014/7/4
<RIP协议设计>
软件详细设计说明书
作 者:
完成日期: 2014年7月3日
签 收 人:
签收日期:
修改情况记录:
版本号
修改批准人
修改人
安装日期
签收人
目录
1 引言 1
1.1 编写目的 1
1.2 背景 1
1.3 定义 1
1.4 参考资料 1
2 程序系统的结构 1
3 程序1(标识符)设计说明 2
3.1 程序描述 2
3.2 功能 2
3.3 性能 2
3.4 输入项 2
3.5 输出项 2
3.6 算法 3
3.7 流程逻辑 3
3.8 接口 3
3.9 存储分配 3
3.10 注释设计 3
3.11 限制条件 3
3.12 测试计划 3
3.13 尚未解决的问题 4
4 程序2(标识符)设计说明 4
1 引言
1.1 编写目的
了解RIP协议的原理和应用以及其实现机制,通过距离矢量算法来实现最短传输路径的路由选择。通过本次课程设计,可以对路由表的建立和路由信息的更新等有更直观和清晰的认识。适合于熟悉C++语言的人和开发改程序的编程人员和设计人员阅读。
1.2 背景
a. 系统名称:RIP协议设计;
b. 项目提出者:冯健
c. 项目开发者:石东梅
d. 项目使用者:相关用户。
1.3 定义
水平分割(split horizon)
水平分割保证路由器记住每一条路由信息的来源,并且不在收到这条信息的端口上再次发送它。这是保证不产生路由循环的最基本措施。
毒性逆转(poison reverse)
当一条路径信息变为无效之后,路由器并不立即将它从路由表中删除,而是用16,即不可达的度量值将它广播出去。这样虽然增加了路由表的大小,但对消除路由循环很有帮助,它可以立即清除相邻路由器之间的任何环路。
触发更新(trigger update)
当路由表发生变化时,更新报文立即广播给相邻的所有路由器,而不是等待30秒的更新周期。同样,当一个路由器刚启动RIP时,它广播请求报文。收到此广播的相邻路由器立即应答一个更新报文,而不必等到下一个更新周期。这样,网络拓扑的变化会最快地在网络上传播开,减少了路由循环产生的可能性。
抑制计时(hold down timer)
一条路由信息无效之后,一段时间内这条路由都处于抑制状态,即在一定时间内不再接收关于同一目的地址的路由更新。如果,路由器从一个网段上得知一条路径失效,然后,立即在另一个网段上得知这个路由有效。这个有效的信息往往是不正确的,抑制计时避免了这个问题,且当一条链路频繁起停时,抑制计时减少了路由的浮动,增加了网络的稳定性。
D-V算(DISTANCE-VECTOR)
距离矢量(简称D-V)算法,周期性地将路由表信息的拷贝在路由器之间传送。当网络拓扑变化时,也会将更新信息及时传送给路由器。每一个路由器只能接收到网络中相邻路由器的路由表,通过增加一个距离矢量数(例如一个跳数)来增大距离矢量,然后将更新的路由表信息再传送给相邻路由器。这种逐步过程发生在相邻路由器之间。
1.4 参考资料
a.谢希仁,《计算机网络(第五版)》.电子工业出版社,2008
b.闵应骅,计算机网络路由研究综述[J];计算机学报;2003年06期
c.苏湘玉,路由信息协议及重发布技术研究与实现;中国人民解放军国防科学技术大学;2002年
d.RFC1058;RFC1388;RFC2453
2 程序系统的结构
3 程序1(标识符)设计说明
从本章开始,逐个地给出各个层次中的每个程序的设计考虑。以下给出的提纲是针对一般情况的。对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。
3.1 程序描述
a.常驻程序模块
start_rip_daemon():rip的守护程序,调用gen_request_all(),broadcast_rip_packet(), pthread_create(),pthread_join()等函数,完成rip程序的主要功能部分
b.非常驻程序模块
send_rip_packet_to():使用数据报式套接字发送rip包到目的地址。可重入,顺序处理
receive_rip_packet():接收rip包检查RIP包,并判断处理方式。可重入,顺序处理
handle_request():处理一个输入请求。可重入,顺序处理
handle_response():处理响应并更新路由表。可重入,顺序处理
update_routing_table():更新路由表可。重入
timer_routine():rip路由定时器。可重入
init_all():对获得的本地IP、RIP相应包、初始路由表进行初始化,并发处理
3.2 功能
该程序主要有以下功能:
a. 初始化
获得的本地IP、对RIP报文、路由表进行初始化
b.发送报文
将报文从本地序转化为网络序,使用数据报式套接字发送到目的地址
c.接收报文
将报文从网络序转换为本地序,并检查rip包是否有误,无误的话根据命令字节判断接下来要进行请求处理或是响应处理
d.处理一个请求报文
收到rip消息,判断数据字节是否为空,不为空则开始处理。处理分为整张路由表的请求响应,或者部分路由条目的请求处理。完成处理后将报文发出,做出响应
e.处理响应
收到一个响应报文后,进行相应的路由处理。然后重置rip包为响应报文,发出rip包并准备更新路由表
f.更新路由表
对于要删除的表项,若在垃圾删除超时时间内,则将相应条目置为无效,然后进行删除,否则增加删除表项,等待下次删除。如果有新的表项,则插入列表添加路由条目,由此更新路由信息
g.路由定时器
在广播时间间隔内则向相邻路由广播rip报文,并重置rip包为响应报文。
h.广播
利用UDP在特定端口(520)广播路由信息给相邻路由,如果报文发送错误则返回错误信息。
3.3 性能
a.过于简单,以跳数为依据计算度量值,经常得出非最优路由。
b.适用范围:度量值以16为限,适用于较小型网络,诸如校园网。
c.时间特性性:更新计时器30秒,无效计时器180秒和刷新计时器240秒。
d.安全性:接受来自任何设备的路由更新。无密码验证机制,默认接受任何地方任何设备的路由更行。不能防止恶意的rip欺骗。
e.收敛性差,时间经常大于5分钟。
f.消耗带宽很大。完整的复制路由表,把自己的路由表复制给所有邻居,尤其在低速广域网链路上更以显式的全量更新
g.不支持无类ip地址和VLSM<ripv1>。
3.4 输入项
本程序在设计过程中并未用到输入项。
3.5 输出项
a.输出rip消息:输出rip消息的题目及内容
b.输出输出rip包:包含命令类型、版本号、当前路由条目、IP地址以及跳数
c.输出路由表:包含输出当前路由信息,包括目的地址,下一条IP地址以及跳数
3.6 算法
D-V算法
距离矢量(DISTANCE-VECTOR,简称D-V)算法(也称BELLMAN-FORD 算法)周期性地将路由表信息的拷贝在路由器之间传送。当网络拓扑变化时,也会将更新信息及时传送给路由器。每一个路由器只能接收到网络中相邻路由器的路由表,就通过增加一个距离矢量数(例如一个跳数)来增大距离矢量,然后将更新的路由表信息再传送给相邻路由器。这种逐步过程发生在相邻路由器之间。
距离矢量算法的数学算法如下:
我们用D(i,j)来表示从实体i到j的最佳路由的Metric,i、j可以是系统中的任意一对实体,用d(i,j)来表示单个跳数的花费,也就是从i直接到j的花费,如果i与j不是直接相邻的,则d(i,j)为无穷大。这样任意两个实体间的最佳Metric可以表示如下:
D(i,j)=0
对所有的i:
D(i,j)=min [ D(i,j)+d(i,k)] i不等于k时
由于我们把非相邻两实体间的d(i,j)定义为无穷大,当表达式中k不是i的相邻主机或路由器时,D(i,j)永远不可能为最小,故我们也可以把k限定为与i相邻。由此我们可以得出一个基于这个数学模型的计算Metric的简单算法:实体i接收它的邻居们k发送给它的到目标主机j的距离评价,并加上d(i,j),在这里是通过i,k之间网络所需的cost 值,接下来i比较来自所需邻居的信息,并选择其中最小的。可以证明,在拓扑结构不变的情况下该算法在有限时间内收敛于正确的D(i,j)。
距离矢量算法通过上述方法累加网络距离,并维护网络拓扑信息数据库。使用这种算法,路由器并不能知道整个网络的确切拓扑结构。
3.7 流程逻辑
开始
int main()
inti_all()
start_rip_daemon()
gen_request_all()
broadcast_rip_packet()
print_rip_packet()
receive_rip_packet()
current_rip_mand=1
handle_response()
handle_request()
=2
reset_rip_packet()
send_rip_packet_to()
update_routing_table()
send_rip_packet_to()
结束
3.8 接口
int main()
init all()
start_rip_daemon(0)
broadcast_rip_packet()
gen_request_all()
receive_rip_packet()
get_local_ip()
reset_rip_packet()
init_routing_table()
handle_request ()
timer_routine()
print_rip_packet()
handle_response ()
update_routing_table()
3.9 存储分配
a. int型
#define RIP_VERSION 1 rip版本号1字节
#define RIP_REQUEST 1 rip命令类型为request 1字节
#define RIP_RESPONSE 2 rip命令类型为response 1字节
#define RIP_INFINITY 16 最大跳数16
#define RIP_PACKET_HEAD 4 rip包首部占4字节
#define ROUTE_MAX_ENTRY 256 路由最大条目256字节
#define LOCAL_ROUTE_ENTRY 10 本地路由条目10条
#define ROUTE_VALID 1 路由有效则置为1 占一字节
#define ROUTE_UNVALID 0 路由无效则置为0 占一字节
#define RIP_CHECK_OK 1 rip包检查无误
#define RIP_CHECK_FAIL 0 rip包检查有误
#define BROADCAST_INTERVAL 10 广播间隔10s
#define CLOCK_TIMEOUT 15 块超时15s
#define GARBAGE_REMOVE_TIMEOUT 25 垃圾删除超时时间25s
b. struct
struct rip_entry{} rip路由条目(可重复)
struct rip_packet{} rip包格式
struct route_entry{} 路由条目
c. char型
char * local_ip[LOCAL_ROUTE_ENTRY] 字符型数组储存本地路由条目
3.10 注释设计
说明准备在本程序中安排的注释,如:
a. 加在模块首部的注释;
b. 加在各分枝点处的注释;
c. 对各变量的功能、范围、缺省条件等所加的注释;
d. 对使用的逻辑所加的注释等等。
3.11 限制条件
a. 本程序在linux环境下开发,在其他环境下运行可能会产生错误。
b. 本RIP协议最大跳数为15,16就不可达,所以只适用于较小型网络的选路,且内部网关协议
3.12 测试计划
测试的步骤包括模块测试、子系统测试、系统测试、验收测试(用户测试)和平行运行(新老系统一起运行)。
本软件采用单元测试,着重测试点主要包括五个方面:
a.模块接口:参数的数目、次序、属性或单位系统与变元是否一致;是否修改了只作输入用的变元:全局变量的定义和用法在各个模块中是否一致。
b.局部数据结构:仔细设计测试方案,以便发现局部数据说明、初始化、默认值等方面的错误。
c.重要的执行通路:设计测试方案硬盘内过来发现由于错误的计算、不正确的比较或不适当的数据流而造成的错误。
d.出错处理同路:要能遇见出错误的条件,并且设置适当的处理错误的通路。
e.边界条件:软件常常在它的边界上失效,当我们使用刚好小于、刚好等于和刚好大于最大值或最小值的数据结构、控制量和数据值得测试方案。
3.13 尚未解决的问题
a. 只实现了获取本地路由更新路由的功能能,未能实现从网络上获取数据包更新路由的功能。
b.由于是在linux环境下开发,受本身环境的影响,很难联通网络是两台主机互通。
展开阅读全文