一种报文匹配方法、装置、网络设备及介质与流程

文档序号:27328087发布日期:2021-11-10 01:27阅读:189来源:国知局
一种报文匹配方法、装置、网络设备及介质与流程

1.本技术涉及通信技术领域,特别是涉及一种报文匹配方法、装置、网络设备及介质。


背景技术:

2.目前,网络交换机或路由器等网络设备使用转发信息库(forwarding information base,fib)指导网际互连协议(internet protocol,ip)报文或命名数据网络(named data networking,ndn)报文的转发。在报文转发过程中,利用最长匹配原则,从fib中获取用于转发报文的出接口。该出接口所在的fib表项为fib中与目的地址匹配的前缀长度最长的表项。
3.fib表项以key

value的形式存放到hash表中,其中,前缀/前缀长度的哈希值作为key,前缀/前缀长度对应的出接口作为value。为了加快报文匹配的速度,引入动态决策树。决策树中的每个节点表示一个可能的前缀长度,决策树的根节点为在报文匹配过程中命中率最高的前缀长度,其他可能的前缀长度按照匹配命中率以从高到低的顺序依次分布于该决策树的子节点上。
4.当接收到待转发报文时,通过查找决策树的方式,对待转发报文的目的地址进行匹配,得到待转发报文对应的出接口。即计算目的地址与决策树的节点对应前缀长度的哈希值,进而从内存的哈希表中查找是否存在该哈希值对应的出接口。网络设备的cpu需要多次访问内存才能完成对一个待转发报文的匹配,在接收到的待转发报文较多的情况下,会导致对待转发报文的匹配速度较慢,不能及时转发待转发报文。


技术实现要素:

5.本技术实施例的目的在于提供一种报文匹配方法、装置、网络设备及介质,以加快对报文匹配的速度,及时转发报文。具体技术方案如下:
6.第一方面,本技术提供一种报文匹配方法,包括:
7.将n个第一数据报文加入n条流水线中,将每条流水线的级stage均设置为决策树的根节点,所述决策树中的每个节点代表一种前缀长度且每个节点代表的前缀长度不同;
8.计算所述n条流水线中第一条流水线的第一哈希值,并异步从内存中预取所述第一哈希值对应的第一出接口数据,并将所述第一出接口数据存储在缓存中,在从内存中预取所述第一出接口数据的同时计算所述n条流水线中第二条流水线的第二哈希值,重复执行异步从内存中预取哈希值对应的出接口数据,并将出接口数据存储在缓存中,在从内存中预取出接口数据的同时计算流水线的哈希值的过程,直至所述n条流水线中每条流水线的哈希值均已计算完成时停止;其中,流水线的哈希值为流水线中的数据报文的目的地址与stage代表的前缀长度的哈希值;
9.当所述n条流水线中每条流水线的哈希值均已计算完成,从所述缓存中获取所述第一出接口数据;
10.当所述第一出接口数据表征为用于转发所述第一条流水线中的第一数据报文时,将所述第一条流水线中的第一数据报文从所述第一条流水线中删除,并当接收到第二数据报文时,将所述第二数据报文加入所述第一条流水线。
11.在一种可能的实现方式中,在从所述缓存中获取所述第一出接口数据之后,所述方法还包括:
12.当所述第一出接口数据不表征为用于转发所述第一条流水线中的第一数据报文时,将所述第一条流水线的stage更新为所述根节点的右子节点,将所述第一条流水线中的出接口信息更新为所述第一出接口数据。
13.在一种可能的实现方式中,在从所述缓存中获取所述第一出接口数据之后,所述方法还包括:
14.判断所述决策树中,所述根节点的右子节点是否为空;
15.若是,则确定所述第一出接口数据表征为用于转发所述第一条流水线中的第一数据报文;
16.若否,则确定所述第一出接口数据不表征为用于转发所述第一条流水线中的第一数据报文。
17.在一种可能的实现方式中,所述方法还包括:
18.如果从所述缓存中获取不到所述第一哈希值对应的第一出接口数据,则将所述第一条流水线的stage更新为所述根节点的左子节点。
19.在一种可能的实现方式中,所述方法还包括:
20.当所述第一出接口数据表征为用于转发所述第一条流水线中的第一数据报文时,将所述第一条流水线的stage更新为完成匹配;
21.所述将所述第一条流水线中的第一数据报文删除,包括:
22.当所述n条流水线的stage均完成一次更新后,将stage为完成匹配的流水线中的第一数据报文从流水线中删除。
23.第二方面,本技术提供一种报文匹配装置,包括:
24.设置模块,用于将n个第一数据报文加入n条流水线中,将每条流水线的级stage均设置为决策树的根节点,所述决策树中的每个节点代表一种前缀长度且每个节点代表的前缀长度不同;
25.预取模块,用于计算所述n条流水线中第一条流水线的第一哈希值,并异步从内存中预取所述第一哈希值对应的第一出接口数据,并将所述第一出接口数据存储在缓存中,在从内存中预取所述第一出接口数据的同时计算所述n条流水线中第二条流水线的第二哈希值,重复执行异步从内存中预取哈希值对应的出接口数据,并将出接口数据存储在缓存中,在从内存中预取出接口数据的同时计算流水线的哈希值的过程,直至所述n条流水线中每条流水线的哈希值均已计算完成时停止;其中,流水线的哈希值为流水线中的数据报文的目的地址与stage代表的前缀长度的哈希值;
26.获取模块,用于当所述n条流水线中每条流水线的哈希值均已计算完成,从所述缓存中获取所述第一出接口数据;
27.所述设置模块,还用于当所述第一出接口数据表征为用于转发所述第一条流水线中的第一数据报文时,将所述第一条流水线中的第一数据报文从所述第一条流水线中删
除,并当接收到第二数据报文时,将所述第二数据报文加入所述第一条流水线。
28.在一种可能的实现方式中,所述装置还包括:
29.更新模块,用于当所述第一出接口数据不表征为用于转发所述第一条流水线中的第一数据报文时,将所述第一条流水线的stage更新为所述根节点的右子节点,将所述第一条流水线中的出接口信息更新为所述第一出接口数据。
30.在一种可能的实现方式中,所述装置还包括:判断模块,用于:
31.判断所述决策树中,所述根节点的右子节点是否为空;
32.若是,则确定所述第一出接口数据表征为用于转发所述第一条流水线中的第一数据报文;
33.若否,则确定所述第一出接口数据不表征为用于转发所述第一条流水线中的第一数据报文。
34.在一种可能的实现方式中,所述装置还包括:
35.更新模块,用于如果从所述缓存中获取不到所述第一哈希值对应的第一出接口数据,则将所述第一条流水线的stage更新为所述根节点的左子节点。
36.在一种可能的实现方式中,所述装置还包括:
37.更新模块,用于当所述第一出接口数据表征为用于转发所述第一条流水线中的第一数据报文时,将所述第一条流水线的stage更新为完成匹配;
38.所述设置模块,具体用于当所述n条流水线的stage均完成一次更新后,将stage为完成匹配的流水线中的第一数据报文从流水线中删除。
39.第三方面,本技术实施例提供一种网络设备,包括处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
40.存储器,用于存放计算机程序;
41.处理器,用于执行存储器上所存放的程序时,实现上述第一方面所述的方法步骤。
42.第四方面,本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现第一方面中所述的方法。
43.第五方面,本技术实施例还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面中所述的数据处方法。
44.本技术实施例提供的报文匹配方法、装置、网络设备及介质,可以通过n条流水线对n个第一数据报文进行匹配,在将n个第一数据报文加入n个流水线中之后,可以计算n条流水线中第一流水线的第一哈希值,并异步从内存中预取第一哈希值对应的第一出接口数据,并将第一出接口数据存储在缓存中,在从内存中预取第一出接口数据的同时计算n条流水线中第二条流水线的第二哈希值。如此,相当于每计算出n条流水线中的一条流水线的哈希值,则异步从内存中预取该哈希值对应的出接口数据,如此,在需要获取第一哈希值对应的第一出接口数据时,无需访问内存,可直接从缓存中获取第一出接口数据,减少了报文匹配所需的时间。且如果第一出接口数据表征为用于转发第一条流水线中的第一数据报文时,则将该第一条流水线中的第一数据报文从第一条流水线中删除,从而将第二数据报文加入第一条流水线中进行处理。相比于现有技术中将n条流水线中的第一数据报文均完成转发后才能对接收到的第二数据报文进行处理,本技术实施例中,只要有数据报文被从流水线中删除,就可以将第二数据报文加入到该流水线中并开始处理,可以加快对接收到的
数据报文的匹配与转发速度。
45.当然,实施本技术的任一产品或方法并不一定需要同时达到以上所述的所有优点。
附图说明
46.为了更清楚地说明本技术实施例和现有技术的技术方案,下面对实施例和现有技术中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
47.图1为本技术实施例提供的一种决策树的示例性示意图;
48.图2为本技术实施例提供的另一种决策树的示例性示意图;
49.图3为本技术实施例提供的一种用于生成决策树的矩阵的示例性示意图;
50.图4a和图4b为本技术实施例提供的一种生成决策树的过程的示例性示意图;
51.图5a、图5b和图5c为本技术实施例提供的另一种生成决策树的过程的示例性示意图;
52.图6为本技术实施例提供的一种报文匹配方法的流程图;
53.图7为本技术实施例提供的一种报文匹配装置的结构示意图;
54.图8为本技术实施例提供的一种网络设备的结构示意图。
具体实施方式
55.为使本技术的目的、技术方案、及优点更加清楚明白,以下参照附图并举实施例,对本技术进一步详细说明。显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
56.为方便理解,首先对本技术实施例涉及的相关概念进行介绍。
57.一、fib表项。
58.fib表项用于指导ipv4/ipv6/ndn报文的转发。fib表项的核心结构为:前缀/前缀长度+出接口。其中,前缀长度用于表示前缀的哪一部分是有效匹配部分。
59.1.以ipv4的fib为例,fib包括的两条表项如下:
60.entry1:ip前缀:10.0.0.0/8出接口:接口2。
61.entry2:ip前缀:10.20.0.0/16出接口:接口3。
62.其中,“10.0.0.0/8”中的“10.0.0.0”为前缀,“8”为前缀长度,代表着如果接收到的报文的目的地址与前缀中的“10.”匹配,则通过接口2转发报文。
[0063]“10.20.0.0/16”中的“10.20.0.0”为前缀,“16”为前缀长度,代表着如果接收到的报文的目的地址与前缀中的“10.20.”匹配,则通过接口3转发报文。
[0064]
另外,基于fib表项进行报文匹配时遵循最长匹配原则,即若报文的目的地址与多条表项匹配,则选择所匹配的表项中前缀长度最长的表项中的出接口。
[0065]
例如,假设接收到的报文的目的ip地址为10.0.0.1,该目的ip地址只能匹配上述entry1,所以网络设备将选择entry1中的出接口2作为该报文的转发接口。
[0066]
再例如,假设接收到的报文的目的ip地址为10.20.0.1,该目的ip地址同时匹配上述entry1和entry2,但是entry2的前缀长度16比entry1的前缀长度8更长,所以网络设备会选择entry2中的出接口3作为该报文的转发接口。
[0067]
2.再以ndn网络的fib为例,ndn网络与ip网络类似,将ip地址变成了目录形式,为支持文本字符的目录。
[0068]
例如,fib包括的三条表项如下:
[0069]
entry1:ndn前缀:/book/fiction/science出接口:接口1
[0070]
entry2:ndn前缀:/book出接口:接口2
[0071]
entry3:ndn前缀:/shoe出接口:接口3
[0072]
其中,“/”用于对前缀进行分层,ndn的fib同样遵循最长前缀匹配原则。
[0073]
例如,如果接收到的报文的目的地址是:/book/fiction/science/bladerunner,该目的地址与entry1和entry2均匹配,但是entry1的前缀长度为3,entry2的前缀长度为1,所以网络设备将entry1包括的出接口1作为作为该报文的转发接口。
[0074]
再例如,如果接收到的报文的目的地址是:/book/fiction/ancient,则可确定该目的地址与entry2匹配,所以网络设备将entry2包括的出接口2作为该报文的转发接口。
[0075]
ip网络可以被看作是特殊的ndn网络:ndn支持任意字符,任意长度的前缀分割,ip网络支持0/1两种bit的分割,而且ip报文有固定的最大前缀长度。其中,ipv6的最大前缀长度为128bit,ipv4的最大前缀长度为32bit。
[0076]
二、hashfib
[0077]
fib的表项中包括的前缀信息和出接口信息以key

value的形式保存在内存的哈希表中,假设fib中包括以下表项:
[0078][0079]
在接收到报文后,需要将报文的目的地址分别与每条表项中的前缀匹配,将匹配到的最长的前缀对应的接口作为该报文的转发接口。但是每匹配一个表项都要访问一次内存,会导致报文匹配所需的时间较长。
[0080]
为了加快对报文的匹配速度,可以采用二分法查找与报文的目的地址匹配的表项。对于目的地址为/a/b/c/d/f的报文,如果采用二分法查找,则首先尝试匹配前缀/a/b/c,可以看出fib的表项中不存在前缀/a/b/c。此时若网络设备错误的认为不能匹配到比/a/b/c更长的前缀,则网络设备将在fib中寻找更短的前缀,比如前缀/a,并通过entry2中的出接口2转发该报文。但是实际上该目的地址匹配的最长前缀应该是entry3中的前缀/a/b/c/d,导致报文被错误转发。
[0081]
为了解决无法通过二分法正确查找hashfib的问题,可以在hashfib中增加虚拟表项(virtualentry)。
[0082]
仍以上述hashfib为例,entry1路径上的虚拟表项包括的前缀有:/a,/a/b,/a/b/
c,/a/b/c/d,其中,/a和/a/b/c/d已经存在,因此不用增加。需要为entry1补充前缀为/a/b和/a/b/c的两个虚拟entry。
[0083]
entry2的前缀长度为1,所以无需补充虚拟entry。
[0084]
entry3路径上的虚拟表项包括的前缀有:/a,/a/b,/a/b/c,其中/a已经存在,所以可以补充前缀为/a/b/c和/a/b的虚拟entry。
[0085]
entry4路径上的虚拟表项包括的前缀有:/f,可以补充前缀为/f的虚拟entry。
[0086]
在补充上述虚拟entry之后,得到的hash fib包括:
[0087][0088]
在补充虚拟entry后,即可实现采用二分法的方式查找表项。例如,若接收到的报文的目的地址为/a/b/w/x/y/z。通过查找hash fib确定/a/b/w不存在,所以可确定针对/a/b/w/x/y/z必定不存在比/a/b/w更优的前缀匹配,因此可以直接从/a/b/w中递归进行二分查找,大大加快了hash fib的查找速度。搜索的次数可以由n次提升为log2(n)次,n为最大前缀长度,比如对于ipv6网络,n的最大值为128。
[0089]
三、最优决策树
[0090]
为了进一步提高报文匹配速度,在本技术实施例中,可以将所有可能的前缀长度生成决策树。其中,生成决策树的原则为匹配命中率越高的前缀长度越靠近决策树的根节点,每个节点的左子节点代表的前缀长度比右子节点的前缀长度短。
[0091]
例如,若网络设备接收到的大多数报文都命中长度为128的前缀(下文中简称为prefix 128),则生成的决策树如图1所示。其中,prefix 128作为根节点,其他前缀长度均为根节点的左分支,因ipv6报文的最大前缀长度为128bit,不存在比128更长的前缀,所以根节点的右子节点为空。
[0092]
在接收到prefix 128的报文后,只需匹配一次决策树的根节点即可确定出接口。
[0093]
再例如,若网络设备接收到的大多数报文都命中长度为127的前缀(即prefix 127),则生成的决策树如图2所示。其中,prefix 127作为根节点,prefix 128作为根节点的右子节点,其他前缀长度均为根节点的左分支。
[0094]
在接收到prefix 127的报文后,先匹配决策树的根节点prefix 127,此时匹配成功,基于匹配最长前缀的原则,还需再与根节点的右子节点prefix 128进行匹配,此时匹配失败,且右子节点prefix 128没有左右分支,所以最终确定prefix 127的报文与根节点匹配。通过两次匹配决策树的过程即可确定出接口。
[0095]
上述决策树可以根据转发报文命中各前缀长度的概率生成,为方便描述,在本技术实施例中,所涉及到的符号含义如下:
[0096]
p
x
表示报文命中prefix x的概率;
[0097]
cost(m,n)表示查找从prefix m到prefix n的最优的决策树,所需消耗的步骤的期望。
[0098]
以ipv6为例,构建最优决策树的目标为求解cost(1,128),即查找从prefix 1到prefix 128的最优决策树,所需消耗的步骤的期望。
[0099]
对于cost(1,128),假设选择50作为根节点,那么报文有p1+p2+

+p
49
的概率进入50的左分支。有p
50
+p
51
+

+p
128
的概率进入50的右分支。
[0100]
此时选择50作为根节点的期望消耗步骤是:1+(p1+p2+

+p
49
)*cost(1,49)+(p
50
+p
51
+

+p
128
)*cost(51,128)。
[0101]
上述公式中,1为匹配决策树的根节点消耗的步骤。cost(1,49)是匹配决策树的左分支消耗的步骤。cost(51,128)是匹配决策树的右分支消耗的步骤。
[0102]
在选择根节点时,以cost(1,128)最小为目标,即匹配决策树消耗的步骤越少,则报文整体匹配速度越快。
[0103]
所以,cost(1,128)=min(1+(p1+p2+

+p
j
‑1)*cost(1,j

1)+(p
j
+p
j+1
+

+p
128
)*cost(j+1,128)),其中1<=j<=128,且规定当j+1>128时,cost(j+1,128)=0。
[0104]
而对于cost(1,1),cost(2,2),

,cost(n,n),取值固定为1。
[0105]
那么,对于cost(m,n),其公式为:
[0106]
cost(m,n)=min(1+(p
m
‑1+p
m
+

p
j
‑1)/(p
m
‑1+p
m
+

p
n
)*cost(m,j

1)+(p
j
+

p
n
)/(p
m
‑1+p
m
+

p
n
)*cost(j+1,n))。
[0107]
其中m<=j<=n,且规定当j+1>n时,cost(j+1,n)=0。如果m

1为0,那么p
m
‑1按0计算。
[0108]
对报文进行从prefix m到prefix n的匹配有两种情况:一种是报文此时匹配的最长前缀是m

1,进入cost(m,n)是为了确认是否没有比前缀m

1更优的匹配。另一种情况是报文匹配的最长前缀比m

1长,所以需要在prefix m到prefix n中寻找更优的匹配。
[0109]
针对第一种情况,如果报文命中m

1的概率很高,但命中m的很低,假设在计算cost(m,n)时,不考虑报文命中m

1的概率,那么在cost(m,n)这颗子决策树中前缀m对应的节点可能离cost(m,n)的根节点很远,导致对于m

1来说,确定其最长匹配时反而消耗了更多的步骤。所以,本技术实施例中,在计算cost(m,n)时还要考虑报文命中m

1的概率,从而加快报文匹配速度。
[0110]
结合cost(m,n)的定义,可以通过矩阵动态生成最优决策树。
[0111]
对于ipv6网络,前缀的最大长度为128bit,所以可以定义一个128x 128的矩阵,矩阵的每个点包含两个信息:代表该节点的cost和为计算该cost时选取的分裂点。
[0112]
例如点(2,5)记录着cost(2,5)以及计算cost(2,5)时选择的分裂点。
[0113]
在通过矩阵计算最优决策树时,可以生成一个矩阵,首先对矩阵的对角线上的点计算cost(m,n)和分裂点(split),然后将对角线整体右移一格,计算右移后得到的斜线上各个点的cost(m,n)和分裂点(split),然后继续右移,直至矩阵的对角线右侧的点被全部计算完成。
[0114]
以5x5的矩阵为例,计算顺序如图3所示。
[0115]
第一轮自左上往右下开始计算左斜线阴影处的点对应的cost及分裂点。
[0116]
第二轮自左上往右下开始计算横线阴影处的点对应的cost及分裂点。
[0117]
第三轮自左上往右下开始计算竖线阴影处的点对应的cost及分裂点。
[0118]
第四轮自左上往右下开始计算右斜线阴影处的点对应的cost及分裂点。
[0119]
第五轮计算网格阴影处的点对应的cost及分裂点。
[0120]
然后从矩阵的(1,5)开始进行遍历即可获取最终的决策树。
[0121]
假设节点(1,5)的split为2,那么得到的决策树形状如图4a所示,根节点为prefix2,左子节点对应于矩阵中的(1,1),右子节点对应于矩阵中的(3,5)。假设(3,5)对应的split为4,那么构建得到的最优决策树形状如图4b所示。
[0122]
以下结合具体实例对构建最优决策树的方法进行说明,以最长的前缀为5为例,则构建一个5x 5的矩阵。
[0123]
网络设备可以周期性计算接收到的报文命中各个前缀长度的概率,并基于该概率生成最优决策树,使得命中率越高的前缀长度越靠近根节点。
[0124]
假设:命中prefix 1的概率为20%。
[0125]
命中prefix2的概率为5%。
[0126]
命中prefix3的概率为10%。
[0127]
命中prefix4的概率为10%。
[0128]
命中prefix5的概率为55%。
[0129]
首先,计算矩阵中对角线上各个点的cost和分裂点,cost(1,1),cost(2,2),

,cost(5,5),取值固定为1,且均不存在分裂点,所以计算的结果如表1所示。
[0130]
表1
[0131][0132]
然后计算cost(1,2),cost(2,3),cost(3,4),cost(4,5)
[0133]
在计算cost(1,2)时,可以选择1或者2为分裂点,
[0134]
选择1作为分裂点时cost(1,2)为:1+(20%+5%)/(20%+5%)*cost(2,2)=2;
[0135]
选择2作为分裂点时cost(1,2)为:1+20%/(20%+5%)*cost(1,1)=1.8
[0136]
故cost(1,2)的分裂点应该为2,且其cost(1,2)=1.8。
[0137]
在计算cost(2,3)时,可以选择2或者3作为分裂点,
[0138]
选择2作为分裂点时cost(2,3)=1+(5%+10%)/(20%+5%+10%)*cost(3,3)=
1.42;
[0139]
在选择3作为分裂点时,cost(2,3)=1+(20%+5%)/(20%+5%+10%)*cost(2,2)=1.71;
[0140]
故cost(2,3)的分裂点应该为2,且cost(2,3)=1.42。
[0141]
在计算cost(3,4)时,可以选择3或者4作为分裂点,
[0142]
选择3作为分裂点时,cost(3,4)=1+(10%+10%)/(5%+10%+10%)*cost(4,4)=1.8;
[0143]
在选择4作为分裂点时,cost(3,4)=1+(5%+10%)/(5%+10%+10%)*cost(3,3)=1.6;
[0144]
故cost(3,4)的分裂点应该为4,且cost(3,4)=1.6。
[0145]
在计算cost(4,5)时,可以选择4或者5作为分裂点
[0146]
选择4作为分裂点时,cost(4,5)=1+(10%+55%)/(10%+10%+55%)*cost(4,4)=1.86;
[0147]
选择5作为分裂点时,其cost(4,5)=1+(10%+10%)/(10%+10%+55%)*cost(5,5)=1.26
[0148]
故cost(4,5)的分裂点应为5,且cost(4,5)=1.26。
[0149]
此时表1的矩阵被更新为如下表2。
[0150]
表2
[0151][0152]
接下来计算cost(1,3),cost(2,4),cost(3,5)
[0153]
对于cost(1,3),可以选择1,2或3作为分裂点:
[0154]
选择1作为分裂点时,cost(1,3)=1+(20%+5%+10%)/(20%+5%+10%)*cost(2,3)=2.42;
[0155]
选择2作为分裂点时,cost(1,3)=1+20%/(20%+5%+10%)*cost(1,1)+(5%+10%)/(20%+5%+10%)*cost(3,3)=2;
[0156]
选择3作为分裂点时,cost(1,3)=1+(20%+5%)/(20%+5%+10%)*cost(1,2)=2.28;
[0157]
故cost(1,3)的分裂点应为2,且cost(1,3)=2。
[0158]
对于cost(2,4),可以选择2,3或4作为分裂点:
[0159]
选择2作为分裂点时,cost(2,4)=1+(5%+10%+10%)/(20%+5%+10%+10%)*
cost(3,4)=2.15;
[0160]
选择3作为分裂点时,cost(2,4)=1+(20%+5%)/(20%+5%+10%+10%)*cost(2,2)+(10%+10%)/(20%+5%+10%+10%)*cost4,4)=2;
[0161]
选择4作为分裂点时,cost(2,4)=1+(20%+5%+10%)/(20%+5%+10%+10%)*cost(2,3)=2.10;
[0162]
故cost(2,4)的分裂点应该为3,且cost(2,4)=2。
[0163]
对于cost(3,5),可以选择3,4或5作为分裂点:
[0164]
选择3作为分裂点时,cost(3,5)=1+(10%+10%+55%)/(5%+10%+10%+55%)*cost(4,5)=2.18;
[0165]
选择4作为分裂点时,cost(3,5)=1+(5%+10%)/(5%+10%+10%+55%)*cost(3,3)+(10%+55%)/(5%+10%+10%+55%)*cost(5,5)=2
[0166]
选择5作为分裂点时,cost(3,5)=1+(5%+10%+10%)/(5%+10%+10%+55%)*cost(3,4)=1.5;
[0167]
故cost(3,5)的分裂点应该为5,cost(3,5)=1.5。
[0168]
此时表2所示的矩阵更新为如下表3:
[0169]
表3
[0170][0171]
然后计算cost(1,4)和cost(2,5)。
[0172]
对于cost(1,4),可以选择的分裂点有1,2,3或4。
[0173]
选择1作为分裂点时,cost(1,4)=1+(20%+5%+10%+10%)/(20%+5%+10%+10%)*cost(2,4)=3;
[0174]
选择2作为分裂点时,cost(1,4)=1+(20%)/(20%+5%+10%+10%)*cost(1,1)+(5%+10%+10%)/(20%+5%+10%+10%)*cost(3,4)=2.33;
[0175]
选择3作为分裂点时,cost(1,4)=1+(20%+5%)/(20%+5%+10%+10%)*cost(1,2)+(10%+10%)/(20%+5%+10%+10%)*cost(4,4)=2.44;
[0176]
选择4作为分裂点时,cost(1,4)=1+(20%+5%+10%)/(20%+5%+10%+10%)*cost(1,3)=2.55;
[0177]
所以cost(1,4)的分裂点应该为2,且cost(1,4)=2.33。
[0178]
对于cost(2,5),可选择的分裂点有2,3,4或5。
[0179]
选择2作为分裂点时,cost(2,5)=1+(5%+10%+10%+55%)/100%*cost(3,5)=
2.20;
[0180]
选择3作为分裂点时,cost(2,5)=1+(20%+5%)/100%*cost(2,2)+(10%+10%+55%)/100%*cost(4,5)=2.195;
[0181]
选择4作为分裂点时,cost(2,5)=1+(20%+5%+10%)/100%*cost(2,3)+(10%+55%)/100%*cost(5,5)=2.147;
[0182]
选择5作为分裂点时,cost(2,5)=1+(20%+5%+10%+10%)/100%*cost(2,4)=1.9
[0183]
故cost(2,5)的分裂点应该为5,且cost(2,5)=1.9。
[0184]
此时表3所示的矩阵更新为如下表4:
[0185]
表4
[0186][0187][0188]
最后,计算cost(1,5),其可选的split点有1,2,3,4或5。
[0189]
选择1作为分裂点时,cost(1,5)=1+(20%+5%+10%+10%+55%)/100%*cost(2,4)=3;
[0190]
选择2作为分裂点时,cost(1,5)=1+20%/100%*cost(1,1)+80%/100%*cost(3,5)=2.4;
[0191]
选择3作为分裂点时,cost(1,5)=1+25%/100%*cost(1,2)+75%/100%*cost(4,5)=2.395;
[0192]
选择4作为分裂点时,cost(1,5)=1+35%/100%*cost(1,3)+65%/100%*cost(5,5)=2.35;
[0193]
选择5作为分裂点时,cost(1,5)=1+45%/100%*cost(1,4)=2.04
[0194]
故cost(1,5)的分裂点应该为5,且cost(1,5)=2.04。
[0195]
此时表4所示的矩阵更新为如下表5:
[0196]
表5
[0197][0198]
然后从矩阵的(1,5)开始,逐层遍历分裂点以生成决策树。
[0199]
首先,(1,5)的分裂点为5,此时树的形状如图5a所示,前缀5作为根节点,根节点的左侧分支为前缀1到前缀4,右侧分支为空。
[0200]
然后从矩阵中可知,(1,4)的分裂点为2,则决策树的形状如图5b所示,分裂点2的左侧分支为1,右侧分支为前缀3到前缀4。
[0201]
(3,4)的分裂点为4,所以决策树的形状如图5c所示,分裂点4的左侧分支为3,无右侧分支,图5c即为生成的最优决策树。
[0202]
在本技术实施例中,上述最优决策树以数组结构的形式缓存于cpu的缓存中,而相应的fib以key

value的形式存储于内存中,在报文匹配过程中,需频繁地访问内存以获取报文匹配的前缀长度对应的出接口,使得报文匹配速度较慢。
[0203]
为了加快匹配速度,可通过数据预取指令(prefetch)提示cpu某些内存中的数据即将被访问,使得cpu的内存管理模块异步从内存中获取即将被访问的数据。
[0204]
但是因最优决策树的左右两个分支不平衡,对每个待转发报文的查找路径长度也不一致,比如若同时对报文1和报文2进行匹配,若对报文1经过一次决策树匹配即可确定出接口,而对报文2要经过5次决策树匹配才可以确定出接口。那么在对报文1匹配一次后,即可完成对报文1的转发。后续实际上是在为报文2这一个报文进行匹配,那么预取操作也就没有意义,依然存在报文匹配速度慢的问题。
[0205]
为了解决上述问题,本技术实施例提供一种报文匹配方法,如图6所示,该方法包括:
[0206]
s601、将n个第一数据报文加入n条流水线中,将每条流水线的级(stage)均设置为决策树的根节点。
[0207]
其中,下文中所描述的决策树均为最优决策树。决策树中的每个节点代表一种前缀长度。n可基于cpu的处理能力预先设置,作为示例,n可以为2。
[0208]
假设当前网络设备接收到两个数据报文,分别为报文1和报文2,报文1和报文2的目的地址分别为ipv6addr1和ipv6addr2。可将报文1加入流水线1,将报文2加入流水线2,流水线1和流水线2的stage均为决策的树的根节点。因决策树的根节点为被匹配到的概率最大的前缀长度,所以本技术实施例中,每个待转发报文都从决策树的根节点开始匹配,可以提高报文匹配速度。
[0209]
s602、计算n条流水线中第一条流水线的第一哈希值,并异步从内存中预取第一哈
希值对应的第一出接口数据,并将第一出接口数据存储在缓存中,在从内存中预取第一出接口数据的同时计算n条流水线中第二条流水线的第二哈希值,重复执行异步从内存中预取哈希值对应的出接口数据,并将出接口数据存储在缓存中,在从内存中预取出接口数据的同时计算流水线的哈希值的过程,直至n条流水线中每条流水线的哈希值均已计算完成时停止。
[0210]
其中,每个流水线的哈希值为该流水线包括的数据报文的目的地址与stage对应的前缀长度的哈希值。
[0211]
上述从内存中预取第一出接口数据的过程为异步操作,从内存中预取第一出接口数据的同时计算n条流水线中第二条流水线的第二哈希值是指:在计算第条一流水线的第一哈希值后,cpu的线程继续计算第二条流水线的哈希值,与此同时,cpu的内存管理模块开始异步从内存中预取第一出接口数据。
[0212]
同理,cpu的线程计算第二条流水线的哈希值后,无论cpu的内存管理模块是否已预取到第一出接口数据,cpu的线程均会继续计算第三流水线的哈希值。
[0213]
延续上一步骤中的举例,假设根节点的前缀长度为prefixlen1,则网络设备可以计算ipv6addr1与prefixlen1的哈希值,得到hashvalue1。并异步执行网络设备的cpu的预取指令,使得cpu的内存管理模块异步从内存中获取hashvalue1对应的出接口数据,并缓存于cpu的缓存中。
[0214]
其中,执行上述预取指令的操作为异步操作,即cpu的线程在计算得到hashvalue1之后,继续计算ipv6addr2与prefixlen1的哈希值得到hashvalue2,执行cpu的预取指令的操作,不会影响cpu的线程依次为n条流水线中的每条流水线计算哈希值的过程。
[0215]
s603、当n条流水线中每条流水线的哈希值均已计算完成,从缓存中获取第一出接口数据。
[0216]
因cpu已提前从内存中获取hashvalue1对应的出接口数据,并缓存于cpu的缓存中,所以在网络设备计算完成上述n条流水线的哈希值后,需要获取hashvalue1对应的出接口数据时,hashvalue1对应的出接口数据已缓存在cpu的缓存中,所以网络设备可从缓存中获取hashvalue1对应的出接口数据。
[0217]
同理,网络设备在计算得到hashvalue2后,也会异步预取hashvalue2对应的出接口数据,并缓存于cpu的缓存中。进而,在网络设备需要获取hashvalue2对应的出接口数据时,无需访问内存,而是可以直接从缓存中获取hashvalue2对应的出接口数据。
[0218]
相应地,网络设备可以依次从缓存中获取每条流水线的哈希对应的出接口数据。
[0219]
s604、当第一出接口数据表征为用于转发第一条流水线中的第一数据报文时,将第一条流水线中的第一数据报文从第一流水线中删除,并当接收到第二数据报文时,将第二数据报文加入第一条流水线。
[0220]
对于每条流水线,如果该流水线的哈希值对应的出接口数据表征为用于转发该流水线中的数据报文,则通过该流水线的哈希值对应的出接口转发该流水线中的数据报文,并将该流水线中的数据报文从该流水线中删除。
[0221]
在本技术实施例中,在将第一条流水线中的第一数据报文从第一流水线中删除后,第一流水线则变为空闲状态,若网络设备接收到第二数据报文,或者网络设备中有未匹配出接口的第二数据报文,则将第二数据报文加入第一流水线中,并将第一流水线的stage
设置为决策树的根节点。
[0222]
采用本技术实施例,可以通过n条流水线对n个第一数据报文进行匹配,在将n个第一数据报文加入n个流水线中之后,可以计算n条流水线中第一流水线的第一哈希值,并异步从内存中预取第一哈希值对应的第一出接口数据,并将第一出接口数据存储在缓存中,在从内存中预取第一出接口数据的同时计算n条流水线中第二条流水线的第二哈希值。如此,相当于每计算出n条流水线中的一条流水线的哈希值,则异步从内存中预取该哈希值对应的出接口数据,如此,在需要获取第一哈希值对应的第一出接口数据时,无需访问内存,可直接从缓存中获取第一出接口数据,减少了报文匹配所需的时间。且如果第一出接口数据表征为用于转发第一条流水线中的第一数据报文时,则将该第一条流水线中的第一数据报文从第一条流水线中删除,从而将第二数据报文加入第一条流水线中进行处理。相比于现有技术中将n条流水线中的第一数据报文均完成转发后才能对接收到的第二数据报文进行处理,本技术实施例中,只要有数据报文被从流水线中删除,就可以将第二数据报文加入到该流水线中并开始处理,可以加快对接收到的数据报文的匹配与转发速度。
[0223]
其中,本技术实施例不限制hash fib在内存中的存储结构。作为示例,在本技术的一个实施例中,fib的摘要存储于哈希表的哈希桶(bucket)中,每个bucket为64bytes的存储空间,可以存储8个fib摘要,每个fib摘要包括标签(tag)和数据指针(datapointer),tag为根据ipv6addr和prefixlen计算出hash值,数据指针用于指示实际fib entry的存储位置。
[0224]
基于上述存储结构,以当前网络设备接收到两个第一数据报文,且网络设备的cpu中有两条流水线为例,假设接收到报文1和报文2,报文1和报文2的目的地址分别为ipv6addr1和ipv6addr2,将报文1加入流水线1,将报文2加入流水线2。决策树的根节点为prefixlen1。则上述过程可以表示为:
[0225]
hashvalue1=hash(ipv6addr1,prefixlen1);//计算ipv6addr1与prefixlen1的哈希值,得到hashvalue1;
[0226]
prefetch(&bucket[hashvalue1]);//提示cpu即将访问包括hashvalue1的bucket,以使得cpu预取bucket[hashvalue1]中的fib摘要;
[0227]
hashvalue2=hash(ipv6addr2,prefixlen1););//计算ipv6addr2与prefixlen1的哈希值,得到hashvalue2;
[0228]
prefetch(&bucket[hashvalue2])//提示cpu即将访问包括hashvalue2的bucket,以使得cpu预取bucket[hashvalue2]中的fib摘要;
[0229]
datapointer1=bucket[hashvalue1];//网络设备获取bucket[hashvalue1]中的数据,此时因bucket[hashvalue1]中的数据已在缓存中,所以无需访问内存,此时不会造成cpu等数据的现象。网络设备在获取到bucket[hashvalue1]中的fib摘要后,可判断该fib摘要中是否存在hashvalue1对应的datapointer1,如果存在,则后续将会获取datapointer1对应的出接口数据。
[0230]
prefetch(datapointer1);//提示cpu即将访问datapointer1,以使得cpu从内存中预取并缓存datapointer1对应的出接口数据。
[0231]
datapointer2=bucket[hashvalue2];//网络设备获取bucket[hashvalue2]中的数据,此时因bucket[hashvalue2]中的fib摘要已在缓存中,所以无需访问内存,此时不会
造成cpu等数据的现象。网络设备在获取到bucket[hashvalue2]中的fib摘要后,可判断该bucket中是否存在hashvalue1对应的datapointer2,如果存在,则后续将会获取datapointer2对应的出接口数据。
[0232]
prefetch(datapointer2);//提示cpu即将访问datapointer2,以使得cpu从内存中预取并缓存datapointer2对应的出接口数据。
[0233]
access datapointer1;//获取datapointer1对应的出接口数据,因datapointer1对应的出接口数据已存在于缓存中,所以此时无需访问内存,不会造成cpu等待。
[0234]
access datapointer2;//获取datapointer2对应的出接口数据,因datapointer2对应的出接口数据已存在于缓存中,所以此时无需访问内存,不会造成cpu等待。
[0235]
update ipv6addr1 stage&output interface;//更新ipv6addr1的报文所属流水线的stage和出接口;
[0236]
update ipv6addr2 stage&output interface//更新ipv6addr2的报文所属流水线的stage和出接口。
[0237]
可见,网络设备在每次需要获取内存中的数据时,所需访问的数据已经被预先获取并缓存,如此可以节省网络设备在需获取数据时再访问内存所消耗的时间,可以加快报文匹配速度。
[0238]
在本技术另一实施例中,在上述s603从缓存中获取第一出接口数据之后,该方法还包括:
[0239]
判断决策树中,根节点的右子节点是否为空;若是,则确定所述第一出接口数据表征为用于转发第一条流水线中的第一数据报文;若否,则确定第一出接口数据不表征为用于转发第一条流水线中的第一数据报文。
[0240]
对于决策树中的每个节点,该节点的左子节点的前缀长度均小于右子节点的前缀长度。若已经获取到第一出接口数据,且根节点的右子节点为空,说明决策树中不存在更优的匹配,所以可以确定第一出接口数据表征为用于转发第一条流水线中的第一数据报文,则完成对该待转发报文的匹配,通过第一出接口数据转发第一条流水线中的第一数据报文。
[0241]
如果根节点的右子节点为空,说明hash fib中还存在比根节点对应的前缀长度更长的前缀长度。根据最长匹配原则,还需进一步判断第一流水线中的第一数据报文是否能够命中更长的前缀长度,所以此时第一数据接口数据可能不是最优匹配,即第一出接口数据不表征为用于转发第一条流水线中的第一数据报文。
[0242]
在本技术实施例中,当第一出接口数据不表征为用于转发第一条流水线中的第一数据报文时,将第一条流水线的stage更新为根节点的右子节点,将第一条流水线中的出接口信息更新为第一出接口数据。从而在下一轮匹配过程中,将第一条流水线中的第一数据报文与更新后的stage代表的前缀长度进行匹配。
[0243]
其中,在下一轮匹配过程中,将计算第一条流水线中的第一数据报文与更新后的stage代表的前缀长度的哈希值,并异步获取该哈希值对应的出接口数据。如果未获取到该哈希值对应的出接口数据,则说明上述第一出接口数据表征为用于转发第一条流水线中的第一数据报文。如果获取到该哈希值对应的出接口数据,则将第一条流水线中的出接口信息更新为此次获取到的出接口数据。
[0244]
在本技术另一实施例中,如果从缓存中获取不到第一哈希值对应的第一出接口数据,则将第一条流水线的stage更新为根节点的左子节点。
[0245]
其中,如果从缓存中获取不到第一哈希值对应的第一出接口数据,说明未从内存中预取到第一哈希值对应的第一出接口数据,也就是说第一流水线中的第一数据报文与决策树的根节点代表的前缀长度不匹配,应该在下一轮匹配过程中与更短的前缀长度进行匹配,所以可以将第一条流水线的stage更新为根节点的左子节点。
[0246]
可以理解的是,在本技术实施例中,对每条流水线中的第一数据报文进行一次匹配后,需对该流水线中的stage进行一次更新,以第一条流水线为例,具体分为以下情况:
[0247]
情况一、从缓存中获取到第一流水线的第一哈希值对应的第一出接口数据,且第一出接口数据表征为用于转发第一条流水线中的第一数据报文,则将第一条流水线的stage更新为完成匹配。
[0248]
情况二、从缓存中获取到第一流水线的第一哈希值对应的第一出接口数据,且第一出接口数据不表征为用于转发第一条流水线中的第一数据报文,则将第一条流水线的stage更新为当前stage的右子节点。
[0249]
例如,如果第一条流水线的当前stage为根节点,则将第一条流水线的stage更新为根节点的右子节点。
[0250]
情况三、未从缓存中获取到第一流水线的第一哈希值对应的第一出接口数据,则将第一流水线的stage更新为当前stage的左子节点。
[0251]
例如,如果第一条流水线的当前stage为根节点,则将第一条流水线的stage更新为根节点的左子节点。
[0252]
在上述s603中,当n条流水线中每条流水线的哈希值均已计算完成时,网络设备可依次从缓存中获取每条流水线的哈希值对应的出接口数据,并依次根据获取每条流水线的哈希值对应的出接口数据的情况,更新流水线的stage。
[0253]
其中,更新每条流水线的stage的方法与本技术实施例中描述的更新第一条流水线的stage的方法相同。
[0254]
当n条流水线中的每条流水线的stage均完成一次更新后,可以将stage为完成匹配的流水线中的第一数据报文从流水线中删除,从而可以将网络设备接收到的其他数据报文加入到流水线中,可以提高对接收到的数据报文的匹配和转发效率。
[0255]
需要说明的是,一种情况中,如果n条流水线中的每条流水线的stage均完成一次更新后,不存在流水线的stage流水线为完成匹配,则对n条流水线中的第一数据报文进行下一轮匹配。进行下一轮匹配的方法与上述s602

s604的方法相同。
[0256]
另一种情况中,如果已将网络设备接收到的其他数据报文加入到流水线中,且此时不存在空闲流水线;或者网络设备中不存在其他待转发的数据报文,则对n条流水线中的数据报文进行下一轮匹配。
[0257]
可见,本技术实施例中,可以实现通过n条流水线对n条数据报文进行匹配,当完成对任意一个数据报文的匹配后,则将该数据报文从流水线中删除,并将其他待转发报文加入到流水线中,可以加对快待转发报文的匹配速度。
[0258]
以下以图5c所示的决策树为例,对处理流水线的过程进行说明。
[0259]
假设流水线的数量为2,即最大同时处理的待转发报文数量为2。
[0260]
如果当前网络设备中有4个待转发报文,按照接收时间从早到晚的时间顺序排序,分别为packet 1、packet 2、packet 3、packet 4。假设各待转发报文可以命中的前缀长度分别为:
[0261]
packet 1命中prefix 5;
[0262]
packet 2命中prefix 3;
[0263]
packet 3命中prefix 5;
[0264]
pakcet 4命中prefix 2。
[0265]
并假设prefix1对应的出口(output interface)是1,prefix2对应的出接口是2,prefix3对应的出接口是3,prefix4对应的出接口是4,prefix5对应的出接口是5。
[0266]
首先,分别将packet 1和packet 2加入流水线,此时流水线如表6所示:
[0267]
表6
[0268][0269]
在经过一次对流水线的处理(advance操作)之后,packet1的目的地址与prefix 5匹配,且从图5c中可知,prefix 5的右子节点为空,所以packet1匹配完成,将流水线1的stage更新为匹配完成(finish)。且packet2的目的地址与prefix 5匹配失败,所以packet2下次需要与prefix 5的左子节点prefix 2进行匹配,所以将流水线2的stage更新为2。此时各流水线如表7所示:
[0270]
表7
[0271][0272]
此时已完成对各流水线的一次处理,可以检测是否存在流水线的stage为匹配完成,根据表7可知,packet1已完成匹配,所以可以将packet1从pipeline1中删除,并通过出接口5转发packet1。
[0273]
在将packet1从pipeline1中删除后,pipeline1变为空闲状态,则可将packet 3加入pipeline1。因packet 2还未匹配完成,所以packet 2仍被保留在pipeline2中。此时各流水线如表8所示:
[0274]
表8
[0275][0276]
再经过一次对流水线的处理后,各流水线如表9所示:
[0277]
表9
[0278][0279]
根据表9可知,packet3已匹配完成,所以将packet3从pipeline1中删除,并将packet4加入pipeline1。此时各流水线如表10所示:
[0280]
表10
[0281][0282]
再经过一次对流水线的处理后,各流水线如表11所示:
[0283]
表11
[0284][0285]
再经过一次对流水线的处理后,各流水线如表12所示:
[0286]
表12
[0287][0288][0289]
此时,packet2完成匹配,将packet2从pipeline2中删除,此时网络设备中不存在新接收的待转发报文,所以pipeline2为空,再次对pipeline1进行处理后,各流水线如表13所示。
[0290]
表13
[0291][0292]
再进行一次处理后,各流水线如表14所示。
[0293]
表14
[0294]
[0295]
此时,完成了对packet1、packet 2、packet 3、packet 4的处理。
[0296]
对应于上述方法实施例,本技术实施例还提供一种报文匹配装置,如图7所示,该装置包括:
[0297]
设置模块701,用于将n个第一数据报文加入n条流水线中,将每条流水线的级stage均设置为决策树的根节点,决策树中的每个节点代表一种前缀长度且每个节点代表的前缀长度不同;
[0298]
预取模块702,用于计算n条流水线中第一条流水线的第一哈希值,并异步从内存中预取第一哈希值对应的第一出接口数据,并将第一出接口数据存储在缓存中,在从内存中预取第一出接口数据的同时计算n条流水线中第二条流水线的第二哈希值,重复执行异步从内存中预取哈希值对应的出接口数据,并将出接口数据存储在缓存中,在从内存中预取出接口数据的同时计算流水线的哈希值的过程,直至n条流水线中每条流水线的哈希值均已计算完成时停止;其中,流水线的哈希值为流水线中的数据报文的目的地址与stage代表的前缀长度的哈希值;
[0299]
获取模块703,用于当n条流水线中每条流水线的哈希值均已计算完成,从缓存中获取第一出接口数据;
[0300]
设置模块701,还用于当第一出接口数据表征为用于转发第一条流水线中的第一数据报文时,将第一条流水线中的第一数据报文从第一条流水线中删除,并当接收到第二数据报文时,将第二数据报文加入第一条流水线。
[0301]
可选的,该装置还包括:
[0302]
更新模块,用于当第一出接口数据不表征为用于转发第一条流水线中的第一数据报文时,将第一条流水线的stage更新为根节点的右子节点,将第一条流水线中的出接口信息更新为第一出接口数据。
[0303]
可选的,该装置还包括:判断模块,用于:
[0304]
判断决策树中,根节点的右子节点是否为空;
[0305]
若是,则确定第一出接口数据表征为用于转发第一条流水线中的第一数据报文;
[0306]
若否,则确定第一出接口数据不表征为用于转发第一条流水线中的第一数据报文。
[0307]
可选的,该装置还包括:
[0308]
更新模块,用于如果从缓存中获取不到第一哈希值对应的第一出接口数据,则将第一条流水线的stage更新为根节点的左子节点。
[0309]
可选的,该装置还包括:
[0310]
更新模块,用于当第一出接口数据表征为用于转发第一条流水线中的第一数据报文时,将第一条流水线的stage更新为完成匹配;
[0311]
设置模块701,具体用于当n条流水线的stage均完成一次更新后,将stage为完成匹配的流水线中的第一数据报文从流水线中删除。
[0312]
本技术实施例还提供了一种网络设备,如图8所示,包括处理器801、通信接口802、存储器803和通信总线804,其中,处理器801,通信接口802,存储器803通过通信总线804完成相互间的通信,
[0313]
存储器803,用于存放计算机程序;
[0314]
处理器801,用于执行存储器803上所存放的程序时,实现上述方法实施例中的方法步骤。
[0315]
上述网络设备提到的通信总线可以是外设部件互连标准(peripheral component interconnect,pci)总线或扩展工业标准结构(extended industry standard architecture,eisa)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
[0316]
通信接口用于上述网络设备与其他设备之间的通信。
[0317]
存储器可以包括随机存取存储器(random access memory,ram),也可以包括非易失性存储器(non

volatile memory,nvm),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
[0318]
上述的处理器可以是通用处理器,包括中央处理器(central processing unit,cpu)、网络处理器(network processor,np)等;还可以是数字信号处理器(digital signal processing,dsp)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field

programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
[0319]
在本技术提供的又一实施例中,还提供了一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一报文匹配方法的步骤。
[0320]
在本技术提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一报文匹配方法。
[0321]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solid state disk(ssd))等。
[0322]
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0323]
本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0324]
以上所述仅为本技术的较佳实施例,并不用以限制本技术,凡在本技术的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本技术保护的范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1