信安学习-day18

动态路由协议-RIP

一、动态路由

1.动态路由概述

  • 动态路由

    • 基于某种路由协议实现

  • 动态路由特点

    • 减少了管理任务

    • 占用了网络带宽

2.动态路由协议

  • 动态路由协议概述

    • 路由器之间用来交换信息的语言

  • 度量值

    • 跳数、带宽、负载、时延、可靠性、成本

  • 收敛

    • 使所有路由表都达到一致状态的过程

  • 静态路由与动态路由的比较

    • 网络中静态路由和动态路由互相补充

3.动态路由协议分类

  • 按照路由执行的算法分类

    • 距离矢量路由协议

      • 依据从源网络到目标网络所经过的路由器的个数选择路由

      • RIP、IGRP

    • 链路状态路由协议

      • 综合考虑从源网络到目标网络的各条路径的情况选择路由

      • OSPF、IS-IS

  • 矢量路由与链路状态路由的区别

    • 矢量路由只是单纯的公告自己的路由表,而不关心路由表中路由记录状态是否良好,而且距离也有限制最大;跳数只有15,收敛很慢,而链路状态路由协议是指需要关心网络设备接口状态的一种路由协议

二、RIP路由协议工作原理

1.RIP路由协议工作原理

  • RIP是距离-矢量路由选择协议

  • RIP的基本概念

    • 定期更新

    • 邻居

    • 广播更新

    • 全路由表更新

    • 30s更新

2.路由表的形成

  • 路由器学习到直连路由

  • 更新周期30s到时,路由器会向邻居发送路由表

  • 再过30s,第二个更新周期到了再次发送路由表

3.RIP的度量值与更新时间

  • RIP度量值为跳数

    • 最大跳数为15跳,16跳为不可达

  • RIP更新时间

    • 每隔30s发送路由更新消息,UDP520端口

  • RIP路由更新消息

    • 发送整个路由表信息

4.水平分割

  • 执行水平分割可以阻止路由环路的发生

    • 从一个接口学习到路由信息,不再从这个接口发送出去

    • 同时也能减少路由更新信息占用的链路带宽资源

    • 水平分割、触发更新、最大跳数、毒性逆转

    • 无法从根本上防止路由环路,工作原理、算法机制导致

  • 路由条目老化计时器:aging

  • 垃圾回收计时器:garbage

5.RIP路由协议v1与v2

①RIP v1和RIP v2的区别

  • RIP v1

    • 有类路由协议

    • 宣告路由信息时不携带掩码

    • 广播更新(255.255.255.255)

    • 不支持VLSM

    • 自由路由汇总,不可关闭

    • 不支持不连续子网

  • RIP

    • 无类路由协议

    • 宣告路由信息时携带掩码

    • 组播更新(244.0.0.9)

    • 支持VLSM

    • 自动汇总可关闭,可手工汇总

    • 支持不连续子网

  • RIP v1和RIP v2的更新

    • RIPv1更新时,不携带掩码

    • RIPv2路由表,携带掩码

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

余额充值