Chinaunix首页 | 论坛 | 博客
  • 博客访问: 382649
  • 博文数量: 62
  • 博客积分: 388
  • 博客等级: 一等列兵
  • 技术积分: 1032
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-03 20:18
文章分类

全部博文(62)

文章存档

2017年(5)

2016年(3)

2015年(3)

2014年(8)

2013年(15)

2012年(28)

分类: C/C++

2013-06-01 23:40:24

一般的匹配某个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
    未冲突
阅读(6821) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~