Chinaunix首页 | 论坛 | 博客
  • 博客访问: 827768
  • 博文数量: 290
  • 博客积分: 511
  • 博客等级: 下士
  • 技术积分: 1590
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-29 13:14
文章分类

全部博文(290)

文章存档

2018年(28)

2017年(19)

2016年(8)

2015年(1)

2014年(14)

2013年(12)

2012年(22)

2011年(186)

分类: LINUX

2017-04-23 13:57:06

本文的部分内容可能来源于网络,该内容归原作者所有,如果侵犯到您的权益,请及时通知我,我将立即删除,原创内容copylefttingkman@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地址、子网掩码和目的地址进行比较获得。当然这相对来说比较简单,实际上复杂的网络协议还包括动态路由
,我们今天讲的都是静态的,原理大概就是这样,具体实现,这里就不详细讲了。









阅读(1129) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~