IP数据包分类经典算法总结

本文详细介绍了几种IP数据包分类的经典算法,包括RFC算法、Set-pruning trie、Grid of trie、Cross-Producting算法和Bit Vector算法。每种算法的原理、性能分析和优缺点都进行了阐述,如RFC算法的多阶段缩减思想,Set-pruning trie的集合归并解决回溯问题,以及TCAM算法的快速并行搜索。这些算法在实际网络中有着广泛应用,但各有其适用场景和限制,例如空间复杂度和查找速度的权衡。

1 RFC算法

1.1 RFC算法介绍

RFC(Recursive Flow Classification)算法[1]是一种多维IP分类快速查找算法,通过对实际的过滤规则数据库的考察,发现数据库中的过滤规则都有内在的结构和冗余度,这个特点可以为分类算法所利用。

RFC算法的主要思想是将IP分类问题看成一个将包头中的S比特数据到T比特的classID的一个映射(T=logN且N<<S,N是过滤规则的总数)。如果预先计算出包头中的这S位共2s种不同情况中每种情况所对应的classID值。那么每一个包只需要一次查表,即一次内存访问就可以得到相应的classID,但是这样会消耗极大的空间。RFC的思想是映射不是通过一步来完成,而是通过多个阶段(phase)完成,如图1.1所示。每个阶段的结果是将一个较大的集合映射成一个较小的集合,称其为一次缩减(reduction)。RFC算法共分P个阶段,每个阶段由一些列的并行的查找组成。每个查找的结果值比用于查找的索引值要短(故称为一次缩减)。

clip_image004     clip_image006

                      图1 RFC的基本构思                                                            图2 一个四阶段的RFC缩减树

图1.2中建立了一种4阶段的缩减树,对IP包查找过程如下:

1)在第一阶段(Phase 0),包头中的K个域被分成若干个块(chunks),每个块被用来作为并行查找的索引;

2)后面的几个阶段,每次查找内存的索引值都是由前几个阶段的查找结果合并而成的。一种简单的合并办法就是将查找结果按二进制串连接起来(concatenation),

    但还有更好的方法可以节省空间;

3)在最后一个阶段,查找的结果得到一个值。由于我们进行了预先的计算,这个值就是该包对应的classID。

1.2 RFC算法性能分析

RFC算法受到两个参数的影响:

1)选取的阶段的数目P

2)在给定P的情况下,"缩减"树的形状.也就是后面的阶段的索引值从前面哪几个阶段的查找结果进行合并。

    在给定P的情况下,给出一种严格的判定方法来选择最优的缩减树很困难。[1]中给出了两种启发性原则:

1)尽可能合并具有一定“相关性”的块。如我们尽可能早的将同一个IP地址的两个块进行合并。因为具有“相关性”的两个块往往在同一条规则或者在少数几个规则中

   集中出现。尽早对其进行合并,可以避免后续合并产生不必要的扩展;

2)在不引起内存激增的情况下.尽可能合并多的块。

   在P和缩减树固定的情况下,随着过滤规则树N的增加,消耗的内存量也增加。同时,对于同样的过滤规则数据库,P=3比P=4消耗更多的内存,但是查找速度前者比后者要快。

RFC算法的优点:(1)易于并行处理,处于同一阶段的预处理表和交叉乘积表可被并行地索引,处于不同阶段的表也可被并行的索引,这些表各自独立,处于不同的存储单元。(2)与其他算法相比,更适用于实际的网络中。

RFC算法的缺点:缺乏一般性,因为它与分类器的结构有关,因此需要针对不同的分类器来进行微调(tuning)才能达到理想中的最佳工作状态。一般的解决方法是在算法设计时便留有许多的参数供日后设定,像在RFC算法中所需要的阶段数,每一阶段中所做

### IP数据包校验和算法的种类和实现方式 IP数据包的校验和算法主要用于验证IP头部的完整性,确保在传输过程中没有发生错误。IPv4和IPv6的校验和算法略有不同,IPv4的校验和仅覆盖IP头部,而IPv6的校验和机制有所调整[^1]。 #### IPv4校验和计算 IPv4校验和计算范围仅限于IP头部的20字节,不包括数据部分。计算过程如下: 1. 将IP头部中的校验和字段置为0。 2. 将IP头部以16位为单位进行分割。 3. 对所有16位字进行二进制反码求和。 4. 最后将求和结果取反码,填入校验和字段。 ```c unsigned short ip_checksum(unsigned short *buf, int nwords) { unsigned long sum = 0; while (nwords--) { sum += *buf++; if (sum & 0xFFFF0000) { sum &= 0xFFFF; sum += 1; } } return ~(sum & 0xFFFF); } ``` 该算法在实际应用中需要处理字节序和填充字节等细节。 #### IPv6校验和计算 IPv6的校验和计算方式与IPv4不同,其校验和字段位于IPv6扩展头部中,并且校验和的计算范围可能包括扩展头部和上层协议数据。IPv6的校验和计算通常由传输层协议(如TCP/UDP)完成,而不是IP层本身[^1]。 --- ### TCP数据包校验和算法的种类和实现方式 TCP校验和不仅覆盖TCP头部和数据,还包括一个IP伪头部(pseudo-header),以确保数据的完整性和正确性。伪头部包括源IP地址、目的IP地址、协议类型(TCP)和TCP数据长度。 #### TCP校验和计算范围 TCP校验和的计算范围包括以下部分: 1. **IP伪头部**:12字节,包括源IP地址(4字节)、目的IP地址(4字节)、协议类型(2字节,第一字节补0)、TCP数据长度(2字节)。 2. **TCP头部和数据**:整个TCP头部和数据部分。 3. **填充字节**:如果TCP数据长度为奇数字节,则在最后添加一个填充字节(0),仅用于校验和计算,不传输[^2]。 #### TCP校验和计算方法 TCP校验和的计算方法与IP校验和类似,采用二进制反码求和的方式: 1. 将TCP头部和数据部分按16位分组。 2. 将IP伪头部也作为计算的一部分。 3. 对所有16位字进行求和,并处理进位。 4. 最后将结果取反码,作为校验和值。 ```c unsigned short tcp_checksum(unsigned short *addr, int len, unsigned int source_ip, unsigned int dest_ip) { long sum = 0; unsigned short *w = addr; int nleft = len; // 处理伪头部 sum += (source_ip >> 16) & 0xFFFF; sum += source_ip & 0xFFFF; sum += (dest_ip >> 16) & 0xFFFF; sum += dest_ip & 0xFFFF; sum += htons(IPPROTO_TCP); sum += htons(len); // 处理TCP头部和数据 while (nleft > 1) { sum += *w++; nleft -= 2; } if (nleft == 1) { *(unsigned char *)(&sum) = *(unsigned char *)w; sum += 1; } sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); return ~sum; } ``` TCP校验和是必须的,而UDP校验和是可选的,如果UDP校验和字段为0,则表示不进行校验和计算[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值