内部网关协议RIP笔记

RIP协议是一种分布式的距离向量路由选择协议,每30秒与相邻路由器交换路由信息以更新路由表。其特点是仅相邻路由器交换信息,交换的是完整的路由表,并且具有快速收敛特性。然而,RIP的最大跳数限制为15,限制了网络规模,且可能导致路由环路问题。
摘要由CSDN通过智能技术生成

RIP协议:是内部网关协议IGP中最先得到广泛使用的 协议,中文名称为路由信息协。RIP是一种分布式的机遇距离向量的路由选择协议,是互联网的标准协议,最大优点就是简单

RIP协议要求网络中的每一个路由器都要维护从他自己到其他每一个目的网络的距离记录,其将距离定义如下
从一路由器到直接连接的网络的距离定义为1.从一路由器到非直接连接的网络的距离定义为所经管的路由器数加1,

RIP协议的特点:

1.仅由相邻路由器交换信息:如果两个路由器之间的通信不需要经管另一个路由器,那么这两个路由器就是相邻的。RIP协议规定,不相邻的路由器不交换信息。
2.路由器交换的信息是当前本路由器所指导的全部信息,即自己现在的路由表。也就是说:“我到本自治系统中所有的 网络的(最短距离),以及到每个网络应经管的下一跳路由器
3.按固定的时间间隔交换路由信息,一般为每隔30秒。

路由表的建立

1.路由表在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为1).它的路由表是空的。
2.以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息
3.经过若干次更新后,所有的路由表最终都会指导到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址
4.RIP协议的收敛(convergence)过程较快。”收敛”就是在自治系统中所有的节点都得到正确的路由选择信息的过程
有关因素:路由器性能、链路性能

距离向量算法

用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、付费专栏及课程。

余额充值