一般的匹配某个IP段,在设置的时候会填上IP及掩码来表示,比如linux的iptables,下面分享一下ip掩码的匹配算法。
IP掩码匹配思想:
// mark 表示掩码
// config_ip 表示配置策略中的IP
// match_ip 表示匹配的IP
掩码表示为IP的前多少位,比如24,表示IP的前24位。首先掩码要转换为4字节,即 mark = 0xFFFFFFFF << (32 - mark)
具体匹配为:config_ip 与 match 异或,这样两者相同的位在异或的结果中都是零,然后异或结果与 mark 相与,
这样若前mark位相同,则结果为零,反之则不同。
下面用伪代码表示:
mark = 0xffffffff << (32 - mark)
if (((match_ip ^ config_ip) & mark) == 0)
匹配成功
else
匹配失败
另外:在设置ip规则的时候,要判断ip配置是否冲突(当然,在同一个策略优先级中)
比如先配置了一条192.168.0.0/16 然后又配置了一条 192.168.1.0/24 第一条说的是ip前16位为192.168的,而后一条说的是ip前24位为192.168.1的,很显然第一条的范围比第二条要大,第二条被第一条包含,这就冲突了。下面来研究怎样来判断冲突
// ip1 表示第一条策略ip
// mark1 表示第一条ip掩码
// ip2 表示第二条策略ip
// mark2 表示第二条ip掩码
下面用伪代码表示
mark = mark1 | makr2 ; // 找出范围大的掩码
ip = ip1 ^ ip2
if ((ip & mark) == 0) // 即两IP相同部分是否与范围最大的掩码一致
冲突
else
未冲突
阅读(1124) | 评论(0) | 转发(0) |