首页 > 代码库 > 根据netmask快速判断是否在一个网域
根据netmask快速判断是否在一个网域
natmask就是子网掩码,与ip进行与的运算,得到一个网域。
ip 由4段构成,例 172.25.45.10 每段由8位二进制组成
即 11111111.11111111.11111111.11111111这个代表的是255.255.255.255
同理 子网掩码也是由8位二进制组成。它又分为网络位和主机位。
172.25.45.10/24 表示有24个1 组成网络位 剩余 8位组成主机位。
一般情况最常见到的子网掩码是 8 即8个1 即 255.0.0.0 16个1 255.255.0.0 24个1 255.255.255.0
32个1 是广播地址 255.255.255.255
这个的计算就是二进制想十进制的转化。
明白了这个一般情况,来谈谈不一样的。举个例子由于惯性思维当我们看到
172.25.42.10/21 和 172.25.47.100/21 这两个ip是感觉就是不在一个网域,因为第三段的不想同 42和47 不一样。但事实它们在一个网段。
我们以第三段为例。 它们各自的网域应该这样计算。
21-16=5就是所有的1的数减去前两段的16个1的数就是第三段的1的个数。第三段的掩码相当于为5
42转化为8位二进制为 00101010 与 第三网段的子网掩码5个1 即 11111000 对应位置与的运算
00101010 对应十进制数是42
11111000 子网掩码
00101000 对应位与的运算得到的 网域
同理
00101111 对应十进制数是47
11111000 子网掩码 00101000 对应位与的运算得到的 网域
一个网域的判断是看它的网络位 所以在不在一个网域在这个例子中和第四段没有关系
可以看到172.25.42.10/21 和 172.25.47.100/21 是在一个网域的。
****************************************************
那如何快速的根据netmask来判断ip是否在一个网域?
172.25.42.10/21 和 172.25.47.100/21
第三段的网络位 为 21-16=5 那主机位 位 8-5=3
根据位权值得计算方法可得
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 1
3个主机位即是 4+2+1=7 5个网络位就是 128+64+32+16+8=248
由于子网掩码是 11111000 与ip进行与的运算 要想运算后在同一个网域 也就是说 ip 的前5个1 也就是网络位要一样 ,那么网络位一样的前提下, 主机位之间 的变化就是 小于等于7.
① 所以 当看到一个ip和它的子网掩码时,先计算出它的关键段的 主机位的变化,
例 9和17 10和18 11和19 它们分别在第一段和第二段 但他们的主机位是一致的
9 11111111 10000000 00000000 0000000
17 11111111 11111111 10000000 0000000
它们的关键段主机位是 127 关键段就是可以判断是否在一个网域的关键段 子网掩码 0到8 就是第一段 8到16 就是第二段 16到24 就是第三段 24到32就是第四段
② 计算出关键段的主机位 例 172.25.42.10/21 和 172.25.47.100/21 它们的关键段是第三段 主机位是 7 那么 首先判断 关键段的ip 是否小于 主机位 ,在例子中 42和47 相差位5小于 7 所以有可能在一个网段。 如果大于 7 则肯定 不在一个网域。
③ 如果小于 7 则可能在一个网域。
0-7
8-15
16-23
24-31
32-39
.
.
.
248-255
可以发现规律
主机位是0到7 是8个一循环
所以 在 小于等于7 的前提下 可以 用关键段的 ip/8 看他们的商是否相同 相同则在一个网域 反之不在一个网域。
例 42/8=5 47/8=5 求商即可 都是5 所以在一起 那 42和48 就不在一个网域。
这样可以用算术的方法来快速的判断。
根据netmask快速判断是否在一个网域