rip距离矢量路由选择协议的c语言实现,(三)距离矢量路由协议-RIP

1,RIP是一种比较简单的内部网关协议(距离矢量的贝尔曼-福特算法)

(1)配置简单

(2)易于维护

(3)适合小型网络

2,运行RIP之后,路由器会发送Request报文,运行RIP的邻居路由器收到该Request报文后,会根据自己的路由表,生成Response报文进行回复。RIP网络稳定以后,每个路由器会周期性地向邻居路由器通告自己的整张路由表中的路由信息,默认周期为30秒。

3,rip-度量

RIP使用跳数作为度量值来衡量到达目的网络的距离。

缺省情况下,直连网络的路由跳数为0。当路由器发送路由更新时,会把度量值加1。RIP规定超过15跳为网络不可达。

4,ripv1和ripv2的区别

ripv1:

RIPv1是有类别路由协议,不支持VLSM和CIDR。

以广播的形式发送报文。

不支持认证。

ripv2:

RIPv2为无类别路由协议,支持VLSM,支持路由聚合与CIDR。

支持以广播或者组播(224.0.0.9)方式发送报文。

支持明文认证和 MD5 密文认证

5,rip报文格式

ripv1

RIP协议通过UDP交换路由信息,端口号为520。RIPv1以广播形式发送路由信息,目的IP地址为广播地址255.255.255.255。

包括在字段有:Command,Version,Address Family

Identifier(AFI):表示地址标识信息,对于IP协议,其值为2。

IP address,Metric

ripv2

AFI:地址族标识除了表示支持的协议类型外,还可以用来描述认证信息。

Route tag:用于标记外部路由。

Subnet Mask:指定IP地址的子网掩码,定义IP地址的网络或子网部分。

Next Hop:指定通往目的地址的下一跳IP地址。

6,rip环路

当网络发生故障时,RIP网络有可能产生路由环路。

解决方法:

(1)水平分割机制:水平分割的原理是,路由器从某个接口学习到的路由,不会再从该接口发出去。

(2)毒性反转机制:RIP从某个接口学习到路由之后,发回给邻居路由器时会将该路由的跳数设置为16。

(3)触发更新机制:是指当路由信息发生变化时,立即向邻居设备发送触发更新报文。而不需要等待更新定时器超时,从而加速了网络收敛。

7,RIP基本配置

(1)

[RTA]rip

[RTA-rip-1]version 2

[RTA-rip-1]network 10.0.0.0

(2)度量(metric)

命令rip metricin 用于修改接口上应用的度量值(注意:该命令所指定的度量值会与当前路由的度量值相加)

命令rip metricout用于路由器在通告RIP路由时修改路由的度量值。

8,水平分割&毒性反转

[RTC]interface GigabitEthernet 0/0/0

[RTC-GigabitEthernet0/0/0]rip split-horizon

[RTC-GigabitEthernet0/0/0]rip poison-reverse

水平分割和毒性反转都是基于每个接口来配置的。缺省情况下,每个接口都启用了rip

split-horizon命令(NBMA网络除外)以防止路由环路。华为ARG3系列路由器不支持同时配置水平分割和毒性反转,因此当一个接口上同时配置了水平分割和毒性反转时,只有毒性反转生效。

9,display rip 1 interface GigabitEthernet0/0/0 verbose

用来确认路由器接口的RIP配置

10,

(1)output

命令rip

output用于配置允许一个接口发送RIP更新消息。如果想要禁止指定接口发送RIP更新消息,可以在接口上运行命令undo rip

output。

(2)input

rip input命令用来配置允许指定接口接收RIP报文。

undo rip input命令用来禁止指定接口接收RIP报文。运行命令undo rip

input之后,该接口所收到的RIP报文会被立即丢弃。

缺省情况下,接口可以接收RIP报文。

11,抑制接口(静默接口)

silent-interface命令用来抑制接口,使其只接收RIP报文,更新自己的路由表,但不发送RIP报文。

命令silent-interface比命令rip input和rip

output的优先级更高。命令silent-interface

all表示抑制所有接口,此命令优先级最高,在配置该命令之后,所有接口都被抑制。命令silent-interface通常会配置在NBMA网络上。在NBMA网络上,一些路由器需要接收RIP更新消息但是不需要广播或者组播路由器自身的路由更新,而是通过命令peer

与对端路由器建立关系。

12**IP的路由跳数是在路由器发出路由通告之前增加的。**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用C写的rip协议 这是其中的广播request程序片段: void RouteInit() { int i,optval=0,length,error; routeNum = 0; // init local socket address and ip address GetLocalIP(); // init route table items for(i = 0; i < MAX_NUM; i++) { SetRouteEntry(&routeTable[i].routeInfo,"0.0.0.0",0,0); routeTable[i].isvalid = 0; routeTable[i].timer = 0; routeTable[i].statue = 0; inet_aton("0,0,0,0",&routeTable[i].sourceIPAddr); } // init request packet SetRoutePacket(&reqPacket,REQUEST); SetRouteEntry(&reqPacket.routeEntry[0],"0.0.0.0",0,16); // init response packet SetRoutePacket(&resPacket,RESPONSE); recvSockAddr.sin_family = AF_INET; recvSockAddr.sin_port = htons(PORT); recvSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); sendSockAddr.sin_family = AF_INET; sendSockAddr.sin_port = htons(PORT); // inet_aton("240.255.255.255",&sendSockAddr.sin_addr); sendSockAddr.sin_addr.s_addr = htonl(INADDR_ANY); EntryInit(); sock = socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { printf("cannot create a socket!\n"); exit(1); } if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&optval,sizeof(int)) != 0) { printf("cannot broadcast!\n"); close(sock); exit(1); } if(bind(sock,(struct sockaddr*)&recvSockAddr,sizeof(recvSockAddr))<0) { printf("cannot bind to port\n"); close(sock); exit(1); } length=sizeof recvSockAddr; getsockname(sock,(struct sockaddr*)&recvSockAddr,&length); printf("Port %d is opened. Listen for packet...\n",ntohs(recvSockAddr.sin_port)); FD_ZERO(&fdSet); FD_SET(sock,&fdSet); error = sendto(sock,&reqPacket,4+sizeof(struct ROUTE_ENTRY),0,(struct sockaddr*)(&sendSockAddr),sizeof(struct sockaddr)); if(error<0) { PrintEntry(&reqPacket.routeEntry[0]); printf("broadcast request packet failed! %d,%d,%d\n",error,sock,fdSet); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值