最长指的是匹配位数
最长前缀匹配是一种 IP 路由查找规则。路由器先确定哪些已安装的前缀包含数据包的目的地址,再选择前缀长度最大的一项。以 IPv4 为例,地址共有 32 位,CIDR 记法中的 /24 表示前 24 位固定,剩下 8 位属于该地址块内部的变化部分。
匹配须从地址最高位开始连续比较。它不是比较点分十进制字符串有多长,也不是挑数值最大的网络地址。一个 /25 前缀若不包含目的地址,即使比 /24 更长也不能参与此次选择;只有已经匹配的候选项,才比较谁更具体。
参考:[1]
默认路由、子网与主机路由
设目的地址为 192.0.2.130,转发表同时有四条记录:0.0.0.0/0 指向出口 A,192.0.2.0/24 指向 B,192.0.2.128/25 指向 C,192.0.2.130/32 指向 D。四个前缀都包含这个地址,最终选中 /32 的 D,因为全部 32 位都被限定。
若移除 /32 记录,/25 成为最长匹配,转向 C;再移除 /25,才轮到 /24 的 B。/25 在这里覆盖末字节从 128 到 255 的地址,而 /24 覆盖从 0 到 255 的地址。由此也能看出,前缀越长,覆盖的地址块越小。
/32 是 IPv4 主机路由,限定单个地址;/0 没有固定的地址位,可匹配任何 IPv4 目的地址,因此常作为默认路由。默认路由并不是必然存在。没有任何匹配项时,不能仅凭这条规则凭空决定一个出口。以上出口和表项是说明选择顺序的假设配置,并非实际网络测量。
参考:[1]
不要与管理距离和度量混用
最长匹配回答的是:这些不同长度的前缀中,哪一个最贴合当前目的地址。管理距离和路由协议度量则处理另一类选择。在 Cisco 所描述的路由信息库流程中,各协议先依据自身规则形成候选路线;若多个来源提供相同前缀及前缀长度,路由信息库再用管理距离等规则选取可安装的路线。转发表随后用于目的地址查找。
因此,不能因为一条 /24 路由的管理距离更低,就让它压过已经安装且匹配的 /25 路由。也不能把不同协议的度量值当作同一个标尺,直接放进最长前缀匹配的比较。先形成可用路由,再查找最具体的匹配,是理解这些机制分工的关键。具体系统还可能有策略路由等额外条件,不能将目的地址查找规则当作全部转发政策。
参考:[2]
聚合与快速查找
这种规则允许较宽的聚合前缀提供一般方向,同时由较长前缀表达例外。RFC 4632 讨论的地址聚合由此不必为每个目的地址都单独保存一条记录;需要特殊处理的较小地址块仍可发布更具体的路由。
规则本身并不强制某一种数据结构。Linux 文档介绍的 LC-trie 方案按地址位段向下查找,并通过路径压缩和层级压缩减少树结构开销;找不到合适叶节点匹配时,可以回退寻找较短前缀。实现的目标是高效得到最长匹配结果,而不是简单按网络地址数值排序后取最后一条。压缩树是实现思路之一,不是最长前缀匹配的定义。