0x01 缘由
最近,在学习路由相关协议,前期接触dpdk,我想在大数据中心的环境、虚拟化技术等场景下,数据转发服务,如何找到目标,这个技术必定为用到路由技术。
0x02 介绍
最长前缀匹配(LPM)算法是指在IP协议中被路由器用于在路由表中进行选择的一个算法。
因为路由表中的每个表项都指定了一个网络,所以一个目的地址可能与多个表项匹配。最明确的一个表项--即子网掩码最长的一个----就叫做最长前缀匹配。之所以这样称呼它,是因为这个表项也是路由表中与目的地址的最高位匹配得最多的表项。
例如:考虑下面这个IPv4的路由表(这里用CIDR来表示):
192.168.20.16/28
192.168.0.0/16
DPDK中LPM的具体实现综合考虑了空间和时间,见图:
前缀的24位共有2^24条条目,每条对应的每个24位前缀,每个条目关联到最后的8位后缀上,最后的256个条目可以按需进行分配,所以说空间和时间上来都可以兼顾。
当前DPDK使用的LPM算法就利用内存的消耗来换取LPM查找的性能提升。当查找表条目的前缀长度小于24位时,只需要一次访存就能找到下一跳,根据概率统计,这是占较大概率的,当前缀大于24位时,则需要两次访存,但是这种情况是小概率事件。
LPM主要结构体为:一张有2^24条目的表,多个有2^8条目的表。第一级表叫做tbl24,第二级表叫做tbl8。
tbl24中条目的字段有:
/** @internal Tbl24 entry structure. */
struct rte_lpm_tbl24_entry {
/* Stores Next hop or group index (i.e. gindex)into tbl8. */
union {
uint8_t next_hop; //下一跳
uint8_t tbl8_gindex; //下一个tbl8表
};
/* Using single uint8_t to store 3 values. */
uint8_t valid :1; /**< Validation flag. */
uint8_t ext_entry :1; /**< External entry. */
uint8_t depth :6; /**< Rule depth. */
};
tbl8中每条entry的字段有:
/** @internal Tbl8 entry structure. */
struct rte_lpm_tbl8_entry {
uint8_t next_hop; /**< next hop. */
/* Using single uint8_t to store 3 values. */
uint8_t valid :1; /**< Validation flag. */
uint8_t valid_group :1; /**< Group validation flag. */
uint8_t depth :6; /**< Rule depth. */
};
用IP地址的前24位进行查找是,先看tbl24中的entry,当valid字段有效而ext_entry为0时,直接命中,查看next_hop知道吓一跳。当vaild为1而ext_entry为1事,查看next_hop知道tbl8的index,此时根据ip中的后8位确定tbl8中蓄积的entry的下表,然后根据rte_lpm_tbl8_entry中的next_hop找吓一跳地址。
0x03 总结
学习。。。。