一种新的高速报文解析结构研究

报文解析结构在解析灵活度和解析速率上面临挑战。该文结合流水线设计和二叉 trie 树查表思想,提出一种应用于路由转发的报文协议解析结构。

PPAF 由转发协议二叉 trie 树(Forwarding Protocol-trie, FP-trie和流水线结构两部分组成,如图 1 所示。转发协议二叉 trie 树将传统报文解析过程抽象成一种二叉 trie 树的查表描述,达到解析的灵活性表示;并采用节点映射算法(Node To Pipeline, NTP)将 FP-trie 树节点映射到流水结构上。

二叉 trie 树是一种用于快速检索的二叉树结构[10], FP-trie 树依据二叉 trie 树的特点,对链路层和网络层协议以网络转发为目的进行解析,将报文头部的相应协议字段转化称为待查找的关键词,结合网络协议的层次结构和协议公开标准,将协议解析过程转换成一个有序的查找序列。在 FP-trie 树结构中每个内部节点都包含一个判定协议的规则方法及两个指针,两个指针分别指向两个子节点,最后一级叶子节点包含与当前解析路径匹配的 解析结果。 在基于 MPLS(MultiProtocol Label Switching)和 IP 协议作为转发关键词的场景下,如图 2 中(a)协议树 1 和(b)协议树 2分别描述了协议树 Ethernet→VLAN→MPLS→IPv4→IPv6 和 802.3 SNAP→IPv4 的 FP-trie 树结构

定义 1 FP-trie 树叶子节点只包含解析结果,其中包含正常解析内容的称实叶子节点,反之包含无法解析的称虚叶子节点。
定义 2 节点深度为该节点到根节点的最大节点数,定义根节点的深度为 1,则其余节点深度为双亲深度的最大值加 1,并定义 FP-trie 树中最大节点深度为 FP-trie 树的深度。
定义 3 若二叉 trie 树满足如下的约束:
约束 1 每个协议的识别判定可能需要多个定位规则,但每个非叶子节点内只存储一个定位规则和两个跳转的指针,其中定位规则包含该协议相关字段的判定取值及判定方法;
约束 2 每个 FP-trie 树有且仅有一个虚叶子节点;
约束 3 任一非叶子节点必须有两个不同为实叶子节点的子节点;
则称该二叉 trie 树称为 FP-trie 树。

如图3所示,硬件流水线结构主要由节点的存储空间双通道RAM、比较器和移位器3个部分组成。其中,双通道的RAM可以在同一时刻并发访问两个地址,因而每一级流水线上任意时刻可以支持两个查表操作, 使得报文解析算法提高了一倍的吞吐率。
在每一阶段的流水处理中,首先要判断输入的流水线级内容和本级流水线 ID 是否匹配, 如匹配命中则进行下一步操作,否则跳过本级流水线;其次若匹配,则根据输入节点地址在双通道 RAM 中读取出对应的节点内容,按照图 4 描述的数据格式判定该节点是内部结点还是叶子节点,如果是叶子节点则输出解析结果,并且不再进行查找;如果是内部节点则与输入的协议类型在比较器中进行判别比较,选择匹配节点的左或是右子节点作为输出,并根据数据偏移量使用移位器在数据包存储中提取新的数据,最后将节点地址、流水线级和协议类型作为输入,在下一时刻送入后一级流水线阶段。

双通道 RAM 中存储经过映射转换后 FP-trie树的节点,每个节点的具体字段如图 4 所示:操作类型(2 bit),用于标识参与比较的协议类型字段与预定值的判定关系,同时也指示节点的类型。

当操作类型为“00”的时候,代表该节点是一个实叶子节点,后续内容为提取信息的长度,如图4 (a)所示;当操作类型为“11”的时候,如图 4 (b)所示,该节点代表一个虚叶子节点。当操作类型为“01”或是“10” 的时候,代表该节点是一个内部节点,“01”对应着比较类型为大于,“10”对应着比较类型为等于,如图 4(c)所示的内部节点格式中的判定字段(16 bit),为报文协议头部中的相关的协议字段的判定值,比特掩码(4 bit)用于指示判定字段的无效长度(0-15 bit);左/右子节点相距层数用于指示 FP-trie 树左/右子节点所在流水线级与其父节点所在流水线级之间的相对距离, 左/右子节点地址用于指示 FP-trie 树左/右子节点在流水线上的地址; 左/右子节点数据偏移用于指示提取下一个字段需要偏移的比特位个数。

PPAF 结构中比较器用于流水查找时选择匹配的子树,为协议解析判断选择出正确的路径。将报文头部中提取出的 16 bit 协议字段与 RAM 中存储的协议字段预定值进行比较,比较的位宽由比特掩码决定,最长为 16 bit 比较、最短为 1 bit 比较;比较的关系根据操作类型来决定,分为大于、等于两种关系。

比较操作的结果若是为真,则选择左子节点对应的存储信息,
并输出下一次待解析节点相距本级流水线的距离,下一个解析节点所在流水级上的地址以及下一次从数据包存储中提取相关字段的相对偏移比特位;
比较结果若为假,则选择右子节点进行相应操作。

PPAF 流水查表示意图

原文地址:https://www.cnblogs.com/maskerk/p/7898784.html