今天准备看一看高性能的作业。这一次的作业时关于packet classification的。先解释一下packet classification,在路由器接受到一个包之后,路由器需要根据一些路由策略来决定如何处理这些包,那么在接受到一个包了之后,查看一下这个包到底是通过哪一个规则来处理,这就需要的是packet classification。
packet classification一般有两类方法,一种是基于树的,有点想前面学过的查表算法,就是把规则抽象成一个节点,通过搜索一棵树来匹配规则。
另外一种非常巧妙,就是把一个规则看成一个d维的空间,接收到的包相当于一个点,看看这个点属于哪一个优先级更高的空间。
感觉是基于几何的这种算法更流行一些。我看的这个论文就是属于这种类型的算法。
首先是一堆基本表示方法,
U=[0..2^w-1]表示的是一维的值域,U^d表示的是d维的空间。H是一个规则的集合,h表示一个规则。R(h)表示的是h这个规则代表的一个空间,很明显这个空间是属于U^d的,这个空间的各个维度分别是<R1(h),R2(h),…,Rd(h)>,一个多维空间x被表示为<I1(x),I2(x),…,Id(x)>也是属于U^d的。一个包被表示成一个点<q1,q2,…, qd>也是属于这个空间的。
算法分为两部分,一个是在一个给定空间上面进行数据结构的构建,另外一个是通过这个数据结构来进行packet classification。讲解数据结构的构建:
第一部分是进行对规则的划分,因为这是对于某一个区域x的,可以分为以下几类:
1) 如果规则h与x没有交集,那么直接丢弃规则h。
2) 如果规则h覆盖了整个区域x,那么h成为了cover(x)中的一员,称为覆盖规则。
3) 如果规则h在j轴上面的投影Rj(h)覆盖了区域x在j轴上面的投影,那么h成为FBj(x)中的一员,称为回滚规则。
4) 如果规则h与区域x交叉的话,h属于cross(x)集合,称为交叉规则。
对于覆盖规则cover(x),所有在x中的点都是属于cover(x)集合里面的规则的。g(x)表示的是cover(x)集合里面优先级最高的规则,所以g(x)是一个潜在的正确解。
对于回滚规则,也就是有一个维度可以覆盖的规则,那么,在这个维度上面,这个规则是可以覆盖的,那么要判断一个点是否属于某个规则的时候,就是判断其他维度上面是不是属于,所以。对于FBj(x)里面的规则,就可以把d维空间上面的分类问题变成一个d-1维空间上面的分类问题。
对于交叉规则,则不能提供任何信息,只能再把这个区域分为m个小的区域,然后在使用cross(x)里面的规则去递归地建立数据结构D^d(yi,cross(x))。
然后,需要存储的数据有,1) 对g(x)的一个引用,g(x)表示的是最高优先级的cover(x),2) 有d个引用,分别连接到d个(d-1)维的数据结构D^d(x,FBj(x)),3)m个引用,分别引用到D^d(yi,cross(x))上面。
这个创建过程完的时候这个区域的值为1.
今天先到这里,明天继续。