2

我知道如果两个 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*
我错过了什么吗?

4

3 回答 3

10

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

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


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 十进制,除了没有人关心32 位 IP 地址的十进制值是什么),并且仅当需要向人类用户显示时,它才会转换为点分十进制。这种表示是 glglgl 所描述的乘以 256 几次。

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

于 2012-10-30T23:02:38.407 回答
3

你完全错过了一些东西:你不只是将你的数字连接在一起,因为 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了两者,使它们属于同一个子网。

于 2012-10-30T23:30:56.050 回答
0

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

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

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

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

于 2012-10-30T23:01:59.033 回答