数据包分类的简单解决方案与二维方案解析
1. 解复用算法
在数据包分类中,有人会想能否直接复用现有的解复用算法,如Pathfinder、伯克利数据包过滤器和动态路径查找器等。虽然这些问题有相似之处,但实则存在细微差别。
Pathfinder是首个避免对规则集进行线性搜索的数据包分类方案。不过,它只允许通配符出现在规则末尾,例如允许(D, S, ∗, ∗, ∗),但不允许(D, ∗, Prot, ∗, SourcePort)。在这种限制下,所有规则可合并成一个广义的前缀树(trie),用哈希表替代数组节点,规则查找时间与数据包字段数量成正比。DPF借鉴了Pathfinder将规则合并到前缀树的思路,还加入了动态代码生成以提升性能。然而,这些方案难以处理混合通配符和指定字段的情况,如(D, ∗, Prot, ∗, SourcePort)。
由于数据包分类规则更为通用,Pathfinder使用前缀树的方法效果不佳。虽存在简单的前缀树方案(集剪枝前缀树)能在O(M)时间内完成查找(M为数据包字段数量),但该方案需要Ω(NK)的存储空间(K为数据包字段数量,N为规则数量),因此不适用于大型数据库。相比之下,部分方案仅需O(NM)的存储空间。
2. 传递标签
传递标签是一种巧妙的查找方法,即从上一跳路由器向下一跳路由器传递标签,多协议标签交换(MPLS)就是典型例子。尽管IP查找能跟上线路速度,但数据包分类的算法难题为MPLS创造了重要应用场景。
如今,MPLS主要用于流量工程。例如,若要让A、B两站点间的Web流量沿特定路径传输,可在两站点间建立标签交换路径。流量离开A站点前,路由器进行数据包分类,将Web流量映射到MPLS报