【问题标题】:Determining if two IP adresses are on same subnet - is it leading or trailing 0s get dropped from IP address?确定两个 IP 地址是否在同一个子网上 - 它是从 IP 地址删除前导 0 还是尾随 0?
【发布时间】:2012-10-20 08:50:18
【问题描述】:

我知道如果两个 IP 地址与子网掩码进行“与”运算,如果结果相同,那么它们就在同一个网络上。如果结果不同,则它们位于不同的网络上。我的问题是,当给定一个省略一些 0 的 IP 地址时,多余的 0 会放在哪里?

例如,如果子网掩码是 255 。 128 . 0 . 0 ,你有 IP 126 。 1. 0 . 10 和 IP 126。 127 . 0 . 1 如果您只是盲目地将带有子网掩码的 IP 与您得到不同的结果,即使它们在同一个网络上也是如此。

126.1.0.10 会变成 126.100.000.100 还是 126.001.000.100?

阅读回复后编辑:

255128000000 AND 126001000010 = 1085496376*32* 但是 255128000000 AND 126127000001 = 1085276323*84*
我错过了什么吗?

【问题讨论】:

  • 在将这些地址与给定的子网掩码进行 AND 运算后,您不应该得到不同的结果。你得到什么结果?最好能显示一些代码。

标签: math networking ip-address subnet


【解决方案1】:

IPv4 地址被写成四个普通十进制数字(每个数字适合一个字节),用点分隔。

普通的十进制数1是“一”,也可以写成001。但是100是一个不同的数,即“一百”。


AND 运算始终是按位 AND,因此要理解它,您必须首先了解点分十进制地址和网络掩码如何对应于原始二进制 32 位地址:

        126   .    127   .     0    .    1
     01111110   01111111   00000000   00000001

        255   .    128   .     0    .    0
AND  11111111   10000000   00000000   00000000
 -----------------------------------------------
     01111110   00000000   00000000   00000000
        126   .      0   .     0    .    0

因此,网络掩码为 255.128.0.0 的 126.127.0.1 位于子网 126.0.0.0/9

在软件中,通常存储 IPv4 地址在单个 32 位变量中——所以 126.127.0.1 是 01111110011111110000000000000001 二进制(也编码 2122252289 十进制,除了 没人关心 em> 32 位 IP 地址的十进制值是多少),只有在需要向人类用户显示时才转换为点分十进制。这种表示就是 glglgl 所描述的乘以 256 几次。

如果您还具有 32 位变量中的网络掩码(111111111000000000000000000000000 二进制或 4286578688 十进制),则可以在单个机器指令中将它们与它们一起获得网络地址 011111100000000000000000000000000。

【讨论】:

    【解决方案2】:

    你完全错过了一些东西:你不只是将你的数字连接在一起,因为 AND 在二进制级别上工作。

    因此,要么按字节处理 IPv4 地址,要么将它们转换为十进制数,但不是用因子 1000,而是用因子 256。

    这就是说,而不是做

    ((126 * 1000 + 1) * 1000 + 0) * 1000 + 10 = 126001000010
    

    你应该这样做

    ((126 * 256 + 1) * 256 + 0) * 256 + 10 = 2113994762
    

    。如果你把它应用到其他数字上,你应该会成功。

    或者,您可以将这 4 个数字分别与在一起,所以

    255 & 126 = 126 (in both cases), 128 & (1 resp. 127) = 0, 0 & (anything) = 0, 0 & (anything) = 0.
    

    所以你得到126.0.0.0 两者,使它们属于同一个子网。

    【讨论】:

    • 第一种方法看不懂。所以你用这个方法转换 IP 和子网掩码然后做什么?
    • @Celeritas:按位和结果。请参阅我的扩展答案。
    【解决方案3】:

    尽管这是一个相当奇怪的问题,但我会尝试回答您的具体问题:

    第二个八位字节中的数字“1”实际上是数字 1,因此它是“001”,而不是“100”。

    也就是说,您的示例应该有效,所以我怀疑您的实现有问题。你不应该担心填充或任何东西。这些是数字,按位与应该“正常工作”。

    您可能希望提供有关问题所在的更多详细信息。

    【讨论】:

      猜你喜欢
      • 2011-10-04
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2020-04-29
      相关资源
      最近更新 更多