标签:linux route 策略路由 policy routing fib
路由,在网络技术中扮演着核心且任务繁重的角色,由于调用频繁,所以它的性能非常重要,再加上它为每一个数据包指明了前进的道路。如同我们写信一样,只要指明了目的地址,那么根据这个信息,邮件就会被尽力送达,数据包也是如果,当我们指定了目的 IP,那么就需要有一种强有力的机制来保证它会被送达,来确保这一目的的机制就是路由。,或者不能够决策而丢弃。
其实上面就提到了路由的几个重要的概念,子网,下一跳的地址,从自己的哪个网卡发包。
而 Linux 在此基础上又进行了进一步的扩展,产生了一种叫做策略路由的机制,即存在多张路由表,具体如何选择这些路由表,是由一些策略决定的。也就是当发一个数据包时,根据该数据包的一些特性,如源地址,目的地址,tos 等信息,去检查是否和制定的一些规则匹配,如果匹配成功,则根据该规则指定的路由表将被使用。下图就是策略路由的框架:
从图中我们可以看出,当进行路由查找时,先去按顺序搜索规则链表,去进行匹配。我们以代码来理解 linux 下的策略路由的实现,笔者的 linux 版本号为 2.6.27.62。
上图是以 IP v4 为例,具体的数据结构图,路由策略都是被以连接到 fib4_rules_ops_template->rules_list 的单链表中。ip v4 的策略是由 fib4_rules_ops_template 来表示的,它指定了策略链表的位置,以及策略的匹配规则,以及,匹配成功后的操作。我们以 udp 的发包为例讲解,上述的结构如何应用到策略路由中。
udp 的发包是在 udp_sendmsg 中完成的,当需要路由时,它会传入 源地址,源端口,目的地址,目的端口,tos 等信息,然后调用,ip_route_output_flow 来查找路由,查找路由过程中为了加快速度,会先查找 cache 中的内容,这里我们略过,直接看查找一个不在 cache 中的路由的过程,这更具有意义一些,它会依次调用 __ip_route_output_key, ip_route_output_slow,从而通过 fib_lookup 来查找路由表,这里是调用 net/ipv4/fib_fules.c
里的 fib_lookup。它会继续调用 fib_rules_lookup 来遍历策略表,即 fib4_rules_ops_template->rules_list。代码如下:
int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl, int flags, struct fib_lookup_arg *arg) { struct fib_rule *rule; int err; rcu_read_lock(); list_for_each_entry_rcu(rule, &ops->rules_list, list) { jumped: if (!fib_rule_match(rule, ops, fl, flags)) continue; if (rule->action == FR_ACT_GOTO) { struct fib_rule *target; target = rcu_dereference(rule->ctarget); if (target == NULL) { continue; } else { rule = target; goto jumped; } } else if (rule->action == FR_ACT_NOP) continue; else err = ops->action(rule, fl, flags, arg); if (err != -EAGAIN) { fib_rule_get(rule); arg->rule = rule; goto out; } } err = -ESRCH; out: rcu_read_unlock(); return err; }
标签:linux route 策略路由 policy routing fib
原文地址:http://blog.csdn.net/henzox/article/details/43565369