网络[四补]:路由表补充

内核版本:2.6.34
      前篇路由表说明了路由表的结构及路由表的创建。下面是一些路由表的使用的细枝末节,作补充说明。
      路由可以分为两部分:路由缓存(rt_hash_table)和路由表()
      路由缓存顾名思义就是加速路由查找的,路由缓存的插入是由内核控制的,而非人为的插入,与之相对比的是路由表是人为插入的,而非内核插入的。在内核中,路由缓存组织成rt_hash_table的结构。

      下面是一段IP层协议的代码段[net/ipv4/route.c],传入IP层的协议在查找路由时先在路由缓存中查找,如果已存在,则skb_dst_set(skb, &rth->u.dst)并返回;否则在路由表中查询。

hash = rt_hash(daddr, saddr, iif, rt_genid(net));      rcu_read_lock();   for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;        rth = rcu_dereference(rth->u.dst.rt_next)) {       if (((rth->fl.fl4_dst ^ daddr) |            (rth->fl.fl4_src ^ saddr) |            (rth->fl.iif ^ iif) |            rth->fl.oif |            (rth->fl.fl4_tos ^ tos)) == 0 &&           rth->fl.mark == skb->mark &&           net_eq(dev_net(rth->u.dst.dev), net) &&           !rt_is_expired(rth)) {           dst_use(&rth->u.dst, jiffies);           RT_CACHE_STAT_INC(in_hit);           rcu_read_unlock();           skb_dst_set(skb, &rth->u.dst);           return 0;       }       RT_CACHE_STAT_INC(in_hlist_search);   }   rcu_read_unlock();  

    在ip_route_input()中查询完陆由缓存后会处理组播地址,如果是组播地址,则下面判断会成功:ipv4_is_multicast(daddr)。
然后执行ip_route_input_mc(),它的主要作用就是生成路由缓存项rth,并插入缓存。rth的生成与初始化只给出了input函数的,其它略去了,可以看出组播报文会通过ip_local_deliver()继续向上传递。

 

rth->u.dst.input= ip_local_deliver;   hash = rt_hash(daddr, saddr, dev->ifindex, rt_genid(dev_net(dev)));   return rt_intern_hash(hash, rth, NULL, skb, dev->ifindex);  

      路由表又可以分为两个:RT_TABLE_LOCAL和RT_TABLE_MAIN
        RT_TABLE_LOCAL存储目的地址是本机的路由表项,这些目的地址就是为各个网卡配置的IP地址;
        RT_TABLE_MAIN存储到其它主机的路由表项;
      显然,RT_TABLE_MAIN路由表只有当主机作为路由器时才有作用,一般主机该表是空的,因为主机不具有转发数据包的功能。RT_TABLE_LOCAL对主机就足够了,为各个网卡配置的IP地址都会加入RT_TABLE_LOCAL中,如为eth1配置了1.2.3.4的地址,则RT_TABLE_LOCAL中会存在1.2.3.4的路由项。只有本地的网卡地址会被加入,比如lo、eth1。IP模块在初始化时ip_init() -> ip_rt_init() - > ip_fib_init()会注册notifier机制,当为网卡地址配置时会执行fib_netdev_notifier和fib_inetaddr_notifier,使更改反映到RT_TABLE_LOCAL中。

 

register_netdevice_notifier(&fib_netdev_notifier);   register_inetaddr_notifier(&fib_inetaddr_notifier);  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wypjjf.html