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

距离矢量路由协议RIP-1

1.RIP(Routing Information Protocol)

各类参数:

协议优先级 :100

端口 :520

RIP的概述

| - 工作在应用层,需要来自传输层的服务。

| - 根据下层为上层提供服务的原理:解封装到传输层时,发现端口号为520,就将其交给应用层的RIP协议来处理。

| -使用跳数作为度量,而不是使用开销。

| - 特性:配置简单、易于维护、适合小型网络

①距离:知道到达目的地址的距离。

②矢量 : 知道方向,即该往哪里走。

动态路由协议的分类:

1.按更新的时候是否携带掩码:

① 有类路由协议 ---- 不携带掩码  eg: 192.168.1.0 (没有跟掩码,即自动补齐默认掩码。)

② 无类路由协议  ----- 携带掩码 (更新时,会按照给定的掩码更新路由条目)

2.按照更新的是“路由信息”还是 “链路状态信息”

① 距离矢量路由协议 -----  路由信息(直接学习的是路由条目,路由器交换已知的路由条目)

② 链路状态路由协议 ---- 链路状态信息( 更新的是状态信息,对方根据收到的邻居状态,进行汇总计算后,再得出相应条目)

RIP适合小型网络:

| - 收敛速度慢

| - 跳数限制 ---- 16跳网络不可达

| - 不能识别带宽

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

余额充值