ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:21.98KB ,
资源ID:3739865      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3739865.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(RIP协议设计 毕业课程设计报告包含源代码.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

RIP协议设计 毕业课程设计报告包含源代码.docx

1、RIP协议设计 毕业课程设计报告包含源代码(此文档为word格式,下载后您可任意编辑修改!)网络程序设计课程设计报告题 目 RIP协议设计 专业及班级 网络工程1101班 学 号 姓 名 日 期 2012年7月3日 一、 课程设计目的了解RIP协议的原理和应用等相关知识,通过距离矢量算法来实现最短传输路径的路由选择。通过本次课程设计,可以对RIP协议的工作原理和实现机制,路由表的建立和路由信息的更新等有更直观和清晰的认识。程序运行后能与路由器的RIP协议程序正确通信。查阅相关RFC。提供配置命令,程序运行后能动态设置协议参数。 收到的数据先放入循环队列,再从队列中取出依次处理。使用定时器处理超

2、时事件。二、 设计与实现2.1 RIP协议的报文格式分析对于RIP报文有两种版本的格式,Version 1和Version 2。两种报文稍有不同,如所示分别为RIPv1和RIPV2:命令版本全零地址族全零 IP地址 全零 全零 度量值 前20个字节的重复命令版本路由选择 地址族路径标签 IP地址 子网掩码 下一个站点的IP地址 度量值 前20个字节的重复RIP报文中至多可以出现25个AFI、互联网络地址和度量域。这样允许使用一个RIP报文来更新一个路由器中的多个路由表项。包含多个路由表项的RIP报文只是简单地重复从AFI到度量域的结构,其中包括所有的零域。图表 2显示了路由信息域中只带一个目的

3、地的RIP报文。1字节命令1字节版本2字节0域2字节AFI2字节0域4字节网络地址4字节0域4字节0域4字节度量图表 2图表 3具有两个表项的RIP报文1字节命令1字节 版本2字节 0域两字节AFI2字节0域4字节网络地址4字节0域4字节0域4字节度量4字节网络地址4字节0域4字节0域4字节度量图表 3地址域可以既包括发送者的地址也包括发送者路由表中的一系列IP地址。请求报文含有一个表项并包括请求者的地址。应答报文可以包括至多2 5个RIP路由表项。 2.2 RIP的工作原理RIP协议是矢量距离算法在局域网上的直接实现,RIP将协议的参加者分为主动机和被动机两种。主动机主动地向外广播路径刷新报

4、文,被动机被动地接受路径刷新报文。一般情况下,网关作主动机,主机作被动机。RIP规定,网关每30秒向外广播一个报文,报文信息来自本地路由表。RIP的度量是基于跳数()水平分割保证路由器记住每一条路由信息的来源,并且不在收到这条信息的端口上再次发送它。这是保证不产生路由循环的最基本措施。毒性逆转(poisonreverse)当一条路径信息变为无效之后,路由器并不立即将它从路由表中删除,而是用16,即不可达的度量值将它广播出去。这样虽然增加了路由表的大小,但对消除路由循环很有帮助,它可以立即清除相邻路由器之间的任何环路。触发更新(triggerupdate)当路由表发生变化时,更新报文立即广播给相

5、邻的所有路由器,而不是等待30秒的更新周期。同样,当一个路由器刚启动RIP时,它广播请求报文。收到此广播的相邻路由器立即应答一个更新报文,而不必等到下一个更新周期。这样,网络拓扑的变化会最快地在网络上传播开,减少了路由循环产生的可能性。抑制计时(timer)一条路由信息无效之后,一段时间内这条路由都处于抑制状态,即在一定时间内不再接收关于同一目的地址的路由更新。如果,路由器从一个网段上得知一条路径失效,然后,立即在另一个网段上得知这个路由有效。这个有效的信息往往是不正确的,抑制计时避免了这个问题,而且,当一条链路频繁起停时,抑制计时减少了路由的浮动,增加了网络的稳定性。即便采用了上面的4种方法

6、,路由循环的问题也不能完全解决,只是得到了最大程度的减少。一旦路由循环真的出现,路由项的度量值就会出现计数到无穷大(Count to Infinity)的情况。这是因为路由信息被循环传递,每传过一个路由器,度量值就加1,一直加到16,路径就成为不可达的了。RIP选择16作为不可达的度量值是很巧妙的,它既足够的大,保证了多数网络能够正常运行,又足够小,使得计数到无穷大所花费的时间最短。有些网络是NBMA(Non-Broadcast Multi Access,非广播多路访问)的,即网络上不允许广播传送数据。对于这种网络,RIP就不能依赖广播传递路由表了。解决方法有很多,最简单的是指定邻居(neig

7、hbor),即指定将路由表发送给某一台特定的路由器。2.3 主要函数模块说明2.3.1 get_local_ip()该函数主要是通过gethostname()函数获取本地ip,并将其赋值给local_addr;2.3.2 broadcast_rip_packet()首先将包转换成网络读取数据的顺序,然后将要广播的ip和协议封装在一个结构体中,从定义的RIP端口520广播出去。print_rip_packet()-rp_inverse_()-socket()-sendto()-close()2.3.3 timer_routine()使用线程的pthread_mutex_lock()和pthrea

8、d_mutex_unlock()对路由表更新模块进行保护,以防资源被更改。2.3.4 receive_rip_packet()从网络上接受包,并解析结构体过去包的ip,通过520端口获得包,并检查包的格式,然后分析包的命令是请求还是相应给于相应的处理。socket()-bind()-recvfrom()-rp_inverse_ntoh()-print_rip_packet()-check_rip_packet()2.3.5 ._addr ip; unsigned int zero2; unsigned int zero3; unsigned int metric;struct rip_pack

9、et unsigned char command; unsigned char version; unsigned short zero; struct rip_entry rip_entriesRIP_MAX_ENTRY;struct route_entry struct in_addr dest; struct in_addr next; unsigned int metric; time_t timer; int valid; int flag;struct rip_packet current_rip_packet;struct rip_packet current_rip_packe

10、t_r;int current_rip_count;struct route_entry routing_tableROUTE_MAX_ENTRY;int current_route_count;int sockfd;pthread_mutex_t rt_mutex;pthread_mutex_t crp_mutex;struct in_addr local_addr;void print_routing_table();void print_message();void print_rip_packet();int check_rip_packet();int calculate_rip_m

11、etric(int rip_entry_number);void reset_rip_packet(int command);void init_routing_table();void init_all();void gen_request_all();void send_rip_packet_to(struct in_addr dest_ip);void broadcast_rip_packet();void receive_rip_packet();void _addr source_ip);void _addr source_ip);void start_rip_daemon();vo

12、id update_routing_table();void * timer_routine();char * local_ipLOCAL_ROUTE_ENTRY= 195.51.0.0, 195.51.0.1, 195.51.0.2, 195.51.0.3, 195.51.0.4, 195.51.0.5, 195.51.0.6, 195.51.0.7, 195.51.0.8, 195.51.0.9;#endifRIP.c#include myrip.() void * tempptr = & current_rip_packetmand; unsigned short * temp = (u

13、nsigned short *)( tempptr ); unsigned short * temp = (unsigned short *)( & current_rip_packet); *temp = = ); for(int i=0; i current_rip_count; i+) current_rip_packet.rip_entriesi.metric = = sizeof(buf); const char* buf_ptr; printf(current routing table-n); for (int i = 0; i current_route_count; i+)

14、printf(%dth re:n, i); buf_ptr = inet_ntop(AF_INET, &routing_tablei.dest, buf, buf_len); printf(destination: %s , buf); buf_ptr = inet_ntop(AF_INET, &routing_tablei.dest, buf, buf_len); printf(next: %s , buf); printf(metric: %dnn, routing_tablei.metric); printf(n);void print_message(const char* title

15、, const char* content) printf(n %s -n, title); printf(- %s -n, content); printf(end of message n);void print_rip_packet() printf(rip packet contains %d entries: -n, current_rip_count); printf(command: %s ,(current_rip_packetmand = RIP_RESPONSE)?RESPONSE:REQUEST); printf(version: %dn,current_rip_pack

16、et.version); for(int i = 0; i current_rip_count; i+) printf(entry %d: ,i); printf(ip: %s ,inet_ntoa(current_rip_packet.rip_entriesi.ip); printf(metric: %dn,current_rip_packet.rip_entriesi.metric); printf(n);int check_rip_packet() if (current_rip_packet.version = 2) return RIP_CHECK_OK; if (current_r

17、ip_packet.version = 0) return RIP_CHECK_FAIL; check mbz if (current_rip_packet.zero) return RIP_CHECK_FAIL; for (int i = 0; i RIP_INFINITY) return RIP_INFINITY; return current_rip_packet.rip_entriesrip_entry_number.metric + 1;void reset_rip_packet(int command) current_rip_count = 0; current_rip_pack

18、etmand = command; current_rip_packet.version = 1; current_rip_packet.zero = 0; for (int i = 0; i RIP_MAX_ENTRY; i+) current_rip_packet.rip_entries0.family = 2; current_rip_packet.rip_entries0.zero1 = 0; current_rip_packet.rip_entries0.ip.s_addr = 0; current_rip_packet.rip_entries0.zero2 = 0; current

19、_rip_packet.rip_entries0.zero3 = 0; current_rip_packet.rip_entries0.metric = 0; void reset_routing_table() current_route_count = 0; for (int i = 0; i ROUTE_MAX_ENTRY; i+) routing_tablei.dest.s_addr = 0; routing_tablei.next.s_addr = 0; routing_tablei.metric = 0; routing_tablei.valid = 1; routing_tabl

20、ei.timer = 0; routing_tablei.flag = 0; void init_routing_table() reset_routing_table(); for (int i = 0; i LOCAL_ROUTE_ENTRY; i+) if (inet_pton(AF_INET, local_ipi, &(routing_tablei.dest) = 0) printf(inet_pton errorn); if (inet_pton(AF_INET, local_ipi, &(routing_tablei.next) = 0) printf(inet_pton erro

21、rn); routing_tablei.metric = 1; routing_tablei.timer = time(NULL); routing_tablei.valid = ROUTE_VALID; routing_tablei.flag = 0; current_route_count = LOCAL_ROUTE_ENTRY;void get_local_ip() char ac80; if (gethostname(ac, sizeof(ac) = -1) cerr Error WSAGetLastError() _addr); printf(Address %d: %s n=n,i

22、, inet_ntoa(local_addr); void init_all() get_local_ip(); reset_rip_packet(RIP_RESPONSE); init_routing_table();void gen_request_all() current_rip_count = 1; current_rip_packetmand = RIP_REQUEST; current_rip_packet.version = 1; current_rip_packet.zero = 0; current_rip_packet.rip_entries0.family = 0; c

23、urrent_rip_packet.rip_entries0.zero1 = 0; current_rip_packet.rip_entries0.ip.s_addr = 0; current_rip_packet.rip_entries0.zero2 = 0; current_rip_packet.rip_entries0.zero3 = 0; current_rip_packet.rip_entries0.metric = RIP_INFINITY;void send_rip_packet_to(struct in_addr dest_ip) printf(begin sending ri

24、p packet:n); print_rip_packet(); rp_inverse_(); struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); bzero(&addr, addr_len); addr.sin_family = AF_INET; addr.sin_addr.s_addr = _port = _port = ) 0) printf(sent green in send_rip_packet_ton); close(sockfd); return;void broadcast_rip_packe

25、t() printf(begin broadcasting rip packet:n); print_rip_packet(); rp_inverse_(); struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); bzero(&addr, addr_len); addr.sin_family = AF_INET; inet_aton(59.66.132.170, &addr.sin_addr); addr.sin_addr.s_addr = _addr.s_addr=_addr.s_addr); addr.sin

26、_port = ); int sockfd = socket(AF_INET, SOCK_DGRAM, 0); int val = 1; bind(sockfd, (struct sockaddr*)&addr, sizeof(addr); setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val); if (sendto(sockfd, ¤t_rip_packet, RIP_PACKET_HEAD+current_rip_count*sizeof(struct rip_entry), sizeof(current_

27、rip_packet), 0, (struct sockaddr*)&addr, addr_len) 0) printf(broadcast error in broadcast_rip_packetn); close(sockfd); return;void receive_rip_packet() struct sockaddr_in addr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd 0) printf(open socket error in start_rip_daemonn); exit(-1); bzero(&addr, sizeof(struct sockaddr_in); addr.sin_family = AF_INET; addr.sin_addr.s_addr = _port = ) 0) printf(bind error in start_ripn); exit(-1); * struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); int packet_len = 0; packet_len = recvfrom(sockfd,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1