网友通过本文主要向大家介绍了aodv路由协议实现,spin路由协议怎样实现,ospf路由协议的实现,路由协议,动态路由协议等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
tingkman-tcp-ip协议分析和实现5-路由的添加、查找、选择
本文的部分内容可能来源于网络,该内容归原作者所有,如果侵犯到您的权益,请及时通知我,我将立即删除,原创内容copyleft归tingkman@163.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。欢迎加入嵌入式交流群:3462094最新动态请关注新浪微博tingkman
在tcp ip协议分析和实现4-arp缓存表的实现一节,我们介绍了arp缓存表作用流程,在这一节里我们提到了arp缓存表的添加,与此相对应的还有路由的东西,同时,还有个路由表的添加。前面打过比方,路由表决定报文从那个网卡出去简单网络协议栈一般实现3种路由表就可以了,一个是主机地址,一个是子网地址,一个是默认路由查询路由表一般按照这个顺序查找就可以了,先在主机地址路由表里查,没有的话在子网地址里查,子网地址里面在没有,就查找默认路由,如果在执行完所有的表查询后,还没有找到匹配的条目,则丢弃packet,并回送一个(DestinnationUnreachable)ICMP不可达的报文给发送方

有些协议栈可能实现更为简单些,直接查找所有网络设备比方说eth0,eth1,eth2,eth3,直接不做路由表了将报文的目的地址和网络设备的ip地址和子网掩码进行比较,决定走那个网络设备出去,下面我们看个网络协议的代码fnet_netif_t*fnet_ip_route(fnet_ip4_addr_tdest_ip){fnet_netif_t*netif;fnet_netif_t*res_netif=fnet_netif_get_default();//先确认一个默认的网络设备比方eth1
for(netif=fnet_netif_list;netif!=0;netif=netif->next){if((dest_ip&netif->ip4_addr.subnetmask)==(netif->ip4_addr.address&netif->ip4_addr.subnetmask)){res_netif=netif;break;}}
#ifFNET_CFG_LOOPBACK/*Anythingsenttooneofthehost'sownIPaddressissenttotheloopbackinterface.*/if(dest_ip==res_netif->ip4_addr.address) //如果是发给自己的报文,直接指向环回网络设备{res_netif=FNET_LOOP_IF;}#endif/*FNET_CFG_LOOPBACK*/returnres_netif;}这里打个比方eth0、1、2、3的ip和子网掩码如下:netif ip4_addr subnetmasketh0: 192.168.0.21 255.255.255.0eth1: 192.168.1.21 255.255.255.0eth2: 192.168.2.21 255.255.255.0
eth3: 192.168.3.21 255.255.255.0
1,假如你的报文目的地址(dest_ip)是192.168.1.90 ,如果if((dest_ip&netif->ip4_addr.subnetmask)==(netif->ip4_addr.address&netif->ip4_addr.subnetmask))这个条件成立,那么报文就通过这个网络设备发出去,通过计算应该就是eth2,,2假如你的报文目的地址(dest_ip)是192.168.0.21 也即是目的是自己,那么通过2,假如你的报文目的地址(dest_ip)是192.168.0.21,通过if((dest_ip&netif->ip4_addr.subnetmask)==(netif->ip4_addr.address&netif->ip4_addr.subnetmask))这个计算
会发现先找到eth0这个设备,这里还做了个判断,如果定义了回环设备,就是一个虚拟的网络设备,就是自己#ifFNET_CFG_LOOPBACK/*Anythingsenttooneofthehost'sownIPaddressissenttotheloopbackinterface.*/if(dest_ip==res_netif->ip4_addr.address) //如果是发给自己的报文,直接指向环回网络设备{res_netif=FNET_LOOP_IF;}#endif/*FNET_CFG_LOOPBACK*/它这个网络设备就指向自己了res_netif=FNET_LOOP_IF;,3、还有一种情况假如你的报文目的地址(dest_ip)是10.10.2.90,通过程序可以看出确定的网络设备就是默认的网络设备,也即是默认网关res_netif=fnet_netif_get_default();也即是eth1我们上网都知道,我们访问网站目的ip都是千奇百怪,所以这些都发给默认的网络设备了,也即是我们电脑的网络接口假如一个电脑有n个网络接口,也只能发给你默认的那个

本章标题写成路由的添加、查找、选择,其实内容主要介绍路由的选择,核心就是选择,方法就是ip地址、子网掩码和目的地址进行比较获得。当然这相对来说比较简单,实际上复杂的网络协议还包括动态路由,我们今天讲的都是静态的,原理大概就是这样,具体实现,这里就不详细讲了。