从子网掩码计算IP地址范围

16

假设我有一个子网掩码为255.255.255.242,并且我知道该子网内的一个IP地址为192.168.1.101。

现在我计算IP范围的方法如下:

在子网掩码中,找到第一个不是255的八位数字。在我的例子中,它是第4个八位数字,是242。因此,将256减去242,得到14。所以我们现在知道这些网络(即192.168.1.x网络)都具有14的范围。因此,只需开始逐个列出它们即可......

192.168.1.0
192.168.1.14
192.168.1.28
....42
....56
....70
....84
....98
....112

这里我们可以停下了。我的地址是192.168.1.101,属于.98网络。.98网络包含从192.168.1.98到192.168.1.111的所有IP地址,因为我们知道192.168.1.112开始了下一个网络。

我想确认是否这是正确且最简单的方法。


255.255.255.242 不是一个有效的子网掩码。位中不能有间隙。 - Joe
好的,你能帮我计算一下吗,Joe? - dig_123
3个回答

42
一个网络掩码是由一系列1位组成的。这些位必须是连续的且没有0间隔。使用1位的所有内容都是网络的一部分,其余的则可以在该网络中分配给主机。255.255.255.224拥有27个“1”,这意味着它是一个/27网络。
要正确计算此值,您需要将IP转换为数字表示法。例如,255.255.255.224是11111111 11111111 11111111 11100000,相当于4294967264。192.168.1.101是3232235877(11000000 10101000 00000001 01100101)。
如果将IP与网络掩码进行按位AND运算,则可得到网络地址,这是范围底端:
11111111 11111111 11111111 11100000  (mask)
11000000 10101000 00000001 01100101  (ip)
-----------------------------------
11000000 10101000 00000001 01100000  = 192.168.1.96  (network address)

掩码的补数(按位NOT)给出了范围的大小:

00000000 00000000 00000000 00011111  = 31

因此,该IP的范围在192.168.1.96至192.168.1.127之间。(127 = 96 + 31)


非常详细,非常感谢。但我想知道是否有错误:如果我没有弄错的话,从.96到.127会产生32个元素。所以是.127还是.126? - dvkch
你是对的,因为这是基于0的数学。在该范围内有32个有效地址,但其中一个是0,因此上限是(n+31)。 - Joe

0

补充一下Joe的回答:如果你想以更加程序化的方式进行操作(假设你了解位运算符)。

你已经知道只有最后一个数字会改变,但是这种方法在其他情况下也可以稍微不同地使用,我稍后会展示。

Number from mask: 224
Number from IP:   101

使用例如Python或您喜爱的计算器程序:

  • 起始地址字节:224 & 101 = 96
  • 结束地址字节:(~224 & 255) | 96 = 127

(~224 & 255)只是将244中每个不为1的位设置为1(即最后5位);将结果与96进行OR操作,只是从第一个地址复制前3位。

因此,结果符合预期:192.168.1.96 - 192.168.1.127


如果掩码在最后一个数字之前结束,则有一个非常相似的过程;让我们举个例子:
让我们使用 255.224.0.0 作为掩码,以及相同的 IP 地址(192。168.1.101)。
再次只需注意一个数字,现在是第二位上的数字:168。
- 起始地址字节:224 & 168 = 160 - 结束地址字节:(~224 & 255) | 160 = 191
现在,左侧的数字(第一位)保持不变(192),右侧的其他数字范围从0到255(根据要求可能是从1到254)。
因此解决方案为:192.160.0.0 - 192.191.255.255

0
感谢Joe和dig_123的回答,但是Joe的回答可以通过使用/28子网掩码来澄清,这将更接近他的示例并落在92-112之间。
所以,Joe,如果我理解正确,您是说要取子网化的八位组;确定增量位值并将其添加到SN八位组中的子网值,这应该给出范围并提供网络、第一个主机、最后一个主机和广播地址的值。这正确吗?即在我的示例中,第四个八位组将是240,增量将是16。由于第四个八位组中的值为96,它落在16位增量的计算范围内,实际上它落在96和112之间,这是16位范围之一,因此我们可以得出此示例的网络地址:
0-15
15-31
32-47
48-63
64-79
80-95
96-111
112-127
128
NW 192.168.1.96 /28
1st 192.168.1.97 /28
Last 192.168.1.110 /28
Bcast 192.168.1.111 /28

1
“...你拿到子网化的八位组...”不对。八位组与子网化无关。点分十进制表示法只是为了让人类更容易阅读。IPv4地址只是32位整数。在二进制下进行子网划分,一切都变得清晰易懂。在子网划分时忘记八位组,否则你会自食其果。 - Ron Maupin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接