路由表实现的一些想法

Trie树路由表其实不是很复杂,没有必要看懂linux代码,理解思想就可以了,如果想要简单一点的,就找找最新BSD的实现,就是去掉了 linux-trie树的动态维护,对于ipv4就是将地址分为按照8位分为四个段,然后按照每个段查找,如果你的机器有多个处理器或者处理器内核,这样可以充分利用多处理器的优势,如果你理解MMU的“页目录->页中间目录->页表”方式,我想这个对每个人理解不是很难,MMU不就是将32位的虚拟地址分解为“高10位,中10位,低12位”,然后按照三部分查表的吗?效率没得说吧,如果你把ip地址也按照一些规则分成不同的部分,用类似于MMU的方式不就可以了吗?另外MMU中还有倒排表,cache查询等等都可以借鉴啊。如果ip地址数量很大,这样的话用hash就会带来很多的碰撞,一般的大型路由器都是用上述的trie树实现的,只不过它们trie树的实现都不同,在硬件中就是固定的分段(类比MMU硬件的地址转化时的查表),软件中可以采用动态方式,比如linux的trie的方式。另外,即使用位图实现精确查找,在机器不支持向量指令的情况下,比较也还是一位一位进行的,充其量可以利用缓存,大型向量机的处理方式就是分段然后多处理实现的,只不过那是硬件。对于trie树实现的路由表,可以降低树高,不必非要8位一层,另外可以用多处理器,比如8位一层,系统有6个cpu,对于处理ipv6地址每个cpu算8位,最后它们简单的一组合就成了,再者说不用这么多层,不是还有hash么,trie的作用仅仅是使数据分布更均匀;另外就是不能绝对的兼顾时间复杂性和空间复杂性,有时候必须有所取舍,总之可以让hash和trie合二为一,trie树实现ip地址的均匀分布,避免由于分布不均造成hash碰撞,然后在各个trie节点下面用hash实现精确匹配,其实这就是hash-tree。

你可能感兴趣的:(linux,cache,路由器,网络技术)