本文的部分内容可能来源于网络,该内容归原作者所有,如果侵犯到您的权益,请及时通知我,我将立即删除,原创内容copyleft归tingkman@163.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。欢迎加入嵌入式交流群:3462094 最新动态请关注新浪微博tingkman
在tcp ip协议分析和实现4-
arp缓存表的实现一节,我们介绍了arp缓存表作用流程,在这一节里我们提到了arp缓存表的添加,与此相对应的还有路由的东西,同时,还有个路由表的添加。前面打过比方,路由表决定报文从那个网卡出去
简单网络协议栈一般实现3种路由表就可以了,一个是主机地址,一个是子网地址,一个是默认路由
查询路由表一般按照这个顺序查找就可以了,先在主机地址路由表里查,没有的话在子网地址里查,子网地址里面在没有,就查找默认路由,如果在执行完所有的表查询后,还没有找到匹配的条目,则丢弃packet,并回送一个(Destinnation Unreachable)ICMP不可达的报文给发送方
有些协议栈可能实现更为简单些,直接查找所有网络设备比方说eth0,eth1,eth2,eth3,直接不做路由表了
将报文的目的地址和网络设备的ip地址和子网掩码进行比较,决定走那个网络设备出去,下面我们看个网络协议的代码
fnet_netif_t *fnet_ip_route( fnet_ip4_addr_t dest_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;
}
}
#if FNET_CFG_LOOPBACK
/* Anything sent to one of the host's own IP address is sent to the loopback interface.*/
if(dest_ip == res_netif->ip4_addr.address) //如果是发给自己的报文,直接指向环回网络设备
{
res_netif = FNET_LOOP_IF;
}
#endif /* FNET_CFG_LOOPBACK */
return res_netif;
}
这里打个比方eth0、1、2、3的ip和子网掩码如下:
netif ip4_addr subnetmask
eth0: 192.168.0.21 255.255.255.0
eth1: 192.168.1.21 255.255.255.0
eth2: 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这个设备,这里还做了个判断,如果定义了回环设备,就是一个虚拟的网络设备,就是自己
#if FNET_CFG_LOOPBACK
/* Anything sent to one of the host's own IP address is sent to the loopback interface.*/
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地址、子网掩码和目的地址进行比较获得。当然这相对来说比较简单,实际上复杂的网络协议还包括动态路由
,我们今天讲的都是静态的,原理大概就是这样,具体实现,这里就不详细讲了。
阅读(1185) | 评论(0) | 转发(0) |