如何从给定子网中查找第一个和最后一个 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 地址?的主要内容,如果未能解决你的问题,请参考以下文章

IP地址划分

要求划分16个子网,每个子网16台主机,请帮忙划分一下子网掩码

从 JS 中的子网生成随机 IP 地址

第5章 IP地址和子网划分_超网合并网段

主机ip子网掩码 默认网关最后不是0,1。 linux的ip怎么设置?

算法-二分查找2