如何从给定子网中查找第一个和最后一个 IP 地址?
Posted
技术标签:
【中文标题】如何从给定子网中查找第一个和最后一个 IP 地址?【英文标题】:How to find First and last IP address from a given subnet? 【发布时间】:2016-01-01 15:51:02 【问题描述】:我正在编写一个代码,它将从给定 IP 输出每个子网的第一个和最后一个 IP 地址。
例如,如果 IP 地址是 192.168.1.8/28,那么如果我们计算总共有 16 个子网。那么,如何找到其中任何子网的起始和最后一个 IP 地址呢? (如 12 日或 13 日)
注意: (我正在寻找逻辑而不是实际代码)
【问题讨论】:
我投票决定将此问题作为题外话结束,因为它要么是作业、课程项目,要么是 OP 没有证明他自己首先解决的任何编程挑战问题。跨度> 如何得出192.168.1.8/28
表示有16 个子网的想法?该网络中有 16 个主机地址,我想如果您在每个地址上都有一个 /32
,您可能想要调用 192.168.1.0/28
网络的 16 个子网,但这并不完全准确。
@TheLaughingMan 首先它不是任何作业类型或编程挑战问题。这不是一个离题的问题,它的真正问题可能是让他的程序更有用。我没明白你为什么要结束这个问题。我试图解决它,但我没有得到任何简单的解决方案,而不是通常的常规类型解决方案。所以这就是我问这个问题的原因。
@RonMaupin 我将 IP 地址视为 32 位。因此,您将拥有的最大 CIDR 表示法是 /32。现在回到我提到的示例 192.168.1.8/28 是 C 类类型的 IP 地址,因此有效的 CIDR 表示法大于 /24 。我给了 /28 所以 4 位用作子网位,它可以提供 16 个子网,从而在特定子网中产生 16 个主机。
有类寻址已死; RFC 1518 (1993)、1519 (1993) 和 1817 (1995) 扼杀了它。它已经完全过时了,每个人都需要克服它。正如千禧一代所说,“老兄,这太上世纪了!”您使用/28
声明网络,因此子网的掩码会比这更长。您应该修改问题以澄清您的意思是网络为/24
;类似于192.168.1.0/24
的子网大小为/28
,或者您可以说“192.168.1.8/28
是 16 个连续子网之一中的地址”,但不要假设有类寻址。
【参考方案1】:
根据您的 cmets,我认为您知道 IPv4 地址和掩码都是 32 位无符号整数。只需这两个值,您就可以获得有关 IP 地址的任何信息。您需要实际的 32 位无符号整数掩码来进行 IP 数学运算。
要从掩码长度中获取掩码,您只需设置高阶数 位在 32 位无符号整数中。 要从地址获取网络,您只需AND
地址
面具。
在大多数情况下,对于 IPv4,网络中的第一个可用地址是
network + 1
。对于/31
和/32
,这有点复杂
网络,因为第一个可用地址是实际的网络地址
那些极端案例。
网络的广播地址是网络地址加上NOT
,或者
掩码的逆。
在大多数情况下,对于 IPv4,网络中最后一个可用地址是
广播地址减 1。同样,/31
和 /32
网络是
极端情况,因为最后一个可用地址是广播地址
用于网络。
这些信息应该足以让您开始编写代码。
【讨论】:
以上是关于如何从给定子网中查找第一个和最后一个 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章
要求划分16个子网,每个子网16台主机,请帮忙划分一下子网掩码