IP之routing(一)

4.2 Data-plane protocol for IPv4

4.2.1 Routing table

查找routing table 是用一个叫做longest prefix matching的原则来实现的,举例说明,有AB两个公司,A拥有从194.24.0.0 到 194.24.6.255的IP,所以在routing table中与A对应的routing entry应该是192.24.0.0/21B拥有从194.24.7.0 到 194.24.7.255的IP,所以在routing table中与B对应的routing entry应该是192.24.7.0/24。假设我们以目的地址为192.24.7.10来查询routing table,则以上两个entry都符合,但拥有较长network addressentry会被命中,也就是B公司的entry会被命中。

Linux中,routing table放在一个two-level hashing的数据结构中,而BSD中,使用trie tree,又叫prefix tree,的数据结构存放routing table的,对BSD感兴趣的读者可以查询BSD的相关资料,这里重点讲解Linuxrouting table的实现。

Linux中,引入了routing cache的机制,只有当cache miss了,才会对routing table执行full search

数据包来自TCP layer的路由过程

对于来自TCP layer的数据包,_ip_route_output_key() (in src/net/ipv4/route.c )会被调用,它试着查询routing cache(routng cache是一个hash table,所以需调用rt_hash()来查询,而rt_hash()最终会调用Bob Jenkins’s hash function jhash() 在include/linux/jhash.h),如果routing cache miss,则ip_route_output_slow()被调用来查询routing tablefib_lookup()routing table的查询函数)。

数据包来自网卡的路由过程

当一个来自网卡的数据包被放到sk_buff后,ip_rcv_finish()会调用ip_route_input()来查询routing cache,当cache miss后,会调用ip_route_input_slow(),然后它调用fib_lookup()来查询routing table

(待续)


 [此为原创,转载请标明出处,谢谢!]

你可能感兴趣的:(Linux)