首页 > 代码库 > 根据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快速判断是否在一个网域