【问题标题】:Subnet CIDR: Does the ip need be the first ip in the subnet?子网 CIDR:ip 是否需要是子网中的第一个 ip?
【发布时间】:2022-06-21 10:57:35
【问题描述】:

定义子网时,如1.2.3.0/24,表示子网中从1.2.3.0到1.2.3.255的255台主机。

但是如果我用1.2.3.64/24 错误地定义了子网怎么办?这是否意味着范围是从1.2.3.641.2.3.255

我找不到有关此的正式文件。

编辑:在 Java ipaddress lib 中,1.2.3.64/24 将被视为 1.2.3.64 到 1.2.3.255 的范围,而不是 1.2.3.0 到 1.2.3.255!。代码为:new IPAddressString("1.2.3.64/24").getSequentialRange()

【问题讨论】:

    标签: cidr


    【解决方案1】:

    这很有趣,因为我似乎也找不到任何正式的规范说明为什么将非固定位设置为 0 是惯例。看着RFC 4632 说:

    [无类前缀] 明确 32 位 IPv4 中的哪些位
    地址被解释为关联的网络号(或前缀)
    有一个站点,用于对单个终端系统进行编号
    在网站内。

    即使按照将非固定位设置为0 的约定,您也可能具有IP 以非零数字结尾的CIDR 表示法。例如:192.168.1.254/31,表示从192.168.1.254192.168.1.255的IP范围。

    CIDR 表示法仅指定固定位数,因此即使您输入.64/24 似乎仍仅代表 IP 地址的 24 个固定位。

    您可以看到来自 ARIN 的 CIDR Calculator 表明 1.2.3.64/24 仍然代表从 1.2.3.01.2.3.255 的所有 IP 地址。 Screenshot here.

    现在可能是实施了不同的系统来以不同的方式处理这种情况,所以我个人会遵循约定,但从 CIDR 表示法(以及我在 RFC 中似乎可以找到的)的角度来看,它仍然应该代表整个范围。

    【讨论】:

    • 谢谢。是的,192.168.1.254/31 有意义,但是 1.2.3.64/24 在定义子网方面没有意义,当然 1.2.3.64/24 作为指定其 ip 和子网 cidr 的概念是有意义的。所以当遇到 1.2.3.64/24 作为子网时我会抛出错误。
    • 另一个值得注意的事情是在 Java ipaddress lib 中,1.2.3.64/24 将被视为从 1.2.3.64 到 1.2.3.255 的范围,而不是 1.2.3.0 到 1.2.3.255!。代码为:new IPAddressString("1.2.3.64/24").getSequentialRange()
    • 这绝对很有趣,我最好的猜测是他们在构建该库时做出的特定于实现的决定,因为它不匹配来自 ARIN 或(很容易)在 RFC 中找到的 CIDR 计算器。绝对值得注意和有趣。另外,在这里对延迟回复表示歉意。
    【解决方案2】:

    没有正式的规范表明将非固定位设置为 0 是一种约定。但是,在描述子网而不是单个地址时,通常的做法是将这些主机位保留为零。这是一个非正式的约定。如果您正在描述一个子网,那么如果您打算忽略这些位,为什么要将它们设置为零以外的任何值?这就是所有网络工程师和大多数其他人所做的,他们在描述整个子网时将这些位保留为零。

    类似 1.2.3.64/24 的规范是地址的网络部分是前 24 位,地址的主机部分是剩余的 8 位。所以,网络是 1.2.3.0,主机是 0.0.0.64。

    同样,1.2.3.0/24 表示网络为 1.2.3.0,主机为 0.0.0.0。但是,就像我说的,当主机为0时,通常用于表示整个子网,即主机可以取任何值。

    事实上,将 1.2.3.0 用作单个地址是不寻常的,因为许多路由器不接受 0 的主机。

    您如何解析这些内容是特定于任何库的。一些库将 1.2.3.64/24 解析为整个子网,丢弃 0.0.0.64。一些库将 1.2.3.64/24 解析为 1.2.3.64。一些库有单独的方法来做其中一个。

    使用 IPAddress 库,同一个解析器可以解析地址和子网。当它解析 1.2.3.64/24 或 1.2.3.0/24 时,解析器需要确定你的意思。对于前者,它将 1.2.3.64/24 解释为前缀长度为 24 的地址 1.2.3.64,因为如果您不希望 64 意味着什么,为什么还有 0.0.0.64 呢?为什么要扔掉?

    对于 1.2.3.0/24,它解释为整个子网,因为就像我说的,0 的主机通常用于指代整个子网。

    但是,如果您希望在解析这些内容时选择其他含义,请使用library provides other options

    new IPAddressString("1.2.3.64/24").getSequentialRange() 被解析为范围“1.2.3.64 -> 1.2.3.64”。该库的早期版本表现不同,但过去几年的所有最新版本都是这样解析它的。

    免责声明:我是该库的项目经理。

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 2012-04-17
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2014-02-20
      • 2016-03-19
      • 2016-12-24
      相关资源
      最近更新 更多