内部网关协议 RIP

紫色代表一级目录
粉红代表二级目录
蓝色代表三级目录
红色代表关键字
橙色代表说明

内部网关协议 RIP
  工作原理
    路由信息协议 RIP (Routing Information Protocol) 是内部网关协议 IGP 中最先得到广泛使用的协议。
    RIP 是一种分布式的基于距离向量的路由选择协议。
    RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。
  “距离”的定义
    从一个路由器到直接连接的网络的距离定义为 1。
    从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。
    RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。
    这里的“距离”实际上指的是“最短距离”
    RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”
    RIP 允许一条路径最多只能包含 15 个路由器。
    “距离”的最大值为 16 时即相当于不可达。可见 RIP 只适用于小型互联网。
    RIP 不能在两个网络之间同时使用多条路由。
    RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。 (选择最短路由
  RIP 协议的三个特点
    仅和相邻路由器交换信息。
    交换的信息是当前本路由器所知道的全部信息,即自己的路由表。
    按固定的时间间隔交换路由信息,例如,每隔 30 秒。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。
  路由表的建立
    路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为 1)。它的路由表是空的
    以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。
    经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
    RIP 协议的收敛 (convergence) 过程较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程。
  距离向量算法
    在这里插入图片描述
    距离向量算法的基础就是 Bellman-Ford 算法(或 Ford-Fulkerson 算法)。
    这种算法的要点是这样的:
      设X是结点 A 到 B 的最短路径上的一个结点。
若把路径 A→B 拆成两段路径 A→X 和 X→B,则每一段路径 A→X 和 X→B 也都分别是结点 A 到 X 和结点 X 到 B 的最短路径。
  路由器之间交换信息与路由表更新
    RIP 协议让互联网中的所有路由器都和自己的相邻路由器不断交换路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。
    虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的。
    
  RIP2 协议的报文格式
    在这里插入图片描述
    RIP2 报文
      RIP2 报文由首部路由部分组成。
      RIP2 报文中的路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节。地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。
      路由标记填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息。
      再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。
      一个 RIP 报文最多可包括 25 个路由,因而 RIP 报文的最大长度是 4 + 20 * 25 = 504 字节。若超过,必须再用一个 RIP 报文来传送。
      RIP2 具有简单的鉴别功能。
        若使用鉴别功能,则将原来写入第一个路由信息(20 个字节)的位置用作鉴别。
        在鉴别数据之后才写入路由信息,但这时最多只能再放入 24 个路由信息。
      若使用鉴别功能,原先能传输25个路由,现在只能传输24个路由,原因是第一个路由用作鉴别
  好消息传播得快,坏消息传播得慢
    RIP 协议特点:好消息传播得快,坏消息传播得慢。
    RIP 存在的一个问题:当网络出现故障时,要经过比较长的时间 (例如数分钟) 才能将此信息传送到所有的路由器。
  RIP 协议的优缺点
    优点:
      实现简单,开销较小。
    缺点:
      RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
      路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。
      “坏消息传播得慢”,使更新过程的收敛时间过长。

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

余额充值