从子网掩码计算 IP 范围

Posted

技术标签:

【中文标题】从子网掩码计算 IP 范围【英文标题】:Calculating range of IPs from subnet mask 【发布时间】:2012-10-06 18:51:32 【问题描述】:

假设我有一个 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 不是有效的子网掩码。位中不能有间隙。 好的,你能帮我计算一下乔吗 【参考方案1】:

网络掩码是一系列 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 011)。

如果您将 IP 和网络掩码按位与,则为您提供网络地址。这是范围的底端:

11111111 11111111 11111111 11100000  (mask)
11000000 10101000 00000001 01100101  (ip)
-----------------------------------
11000000 10101000 00000001 01100000  = 192.168.1.96  (network address)

掩码的补码(按位非)为您提供范围的大小:

00000000 00000000 00000000 00011111  = 31

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

【讨论】:

非常详细,非常感谢。但我想知道是否有错误:如果我没记错的话,0.96 到 .127 会产生 32 个元素。那么是 .127 还是 .126? 你是对的,因为基于 0 的数学。范围内有 32 个有效地址,但 0 是其中之一,因此上限为 (n+31)。【参考方案2】:

感谢 Joe 和 dig_123 两位,但是,Joe 的答案可以用 /28 子网来澄清,而不是所述 /27 女巫会更接近他的例子并且落在 92-112 之间。

所以,乔,如果我理解你的意思,你是说你采用子网八位字节;确定增量位值并将其添加到 SN 八位字节中的子网值,这应该给出范围并提供网络、第一个主机、最后一个主机和广播地址的值。那是对的吗?即在我的示例中,第 4 个八位字节为 240,增量为 16。由于第 4 个八位字节中的值为 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

【讨论】:

"...你采用子网八位字节..." 不。八位字节与子网无关。点分十进制表示法只是为了让人类更容易阅读。 IPv4 地址只是 32 位整数。你真的需要在二进制中进行子网划分,然后一切都有意义并且很容易看到。在进行子网划分时忘记八位字节,否则您将面临失败。【参考方案3】:

在 Joe 的回答中添加一些内容:如果您想以更编程的方式执行操作(假设了解位运算符)。

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

Number from mask: 224
Number from IP:   101

使用例如python 或你最喜欢的计算器程序:

Start address byte: 224 & 101 = 96 End address byte: (~224 & 255) | 96 = 127

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

因此,结果是预期的:192.168.1.96 - 192.168.1.127


如果掩码在最后一个数字之前结束,则过程非常相似;举个例子吧:

让我们使用 255.224.0.0 作为掩码,以及相同的 IP 地址 (192.168.1.101)。

同样只有一个数字需要处理,现在是第二个数字:168。

Start address byte: 224 & 168 = 160 End address byte: (~224 & 255) | 160 = 191

现在,左边的数字(第一个位置)保持不变(192),右边的其余数字范围从 0 到 255(根据他们的要求,也可能是从 1 到 254) .

所以解决方案是:192.160.0.0 - 192.191.255.255

【讨论】:

以上是关于从子网掩码计算 IP 范围的主要内容,如果未能解决你的问题,请参考以下文章

知道IP和子网掩码,计算可用IP数量和可用的IP地址

通过IP地址和子网掩码与运算计算相关地址

只知道一个ip地址如何算出他的子网掩码和网络ID以及主机ID的范围呢?

计算机网络-将C网192.168.25.0划分四个子网,计算每个子网的有效IP地址范围和对应网络掩码

子网划分怎么计算?

IP地址的计算