math - 确定两个 IP 地址是否在同一子网上 - 是否从 IP 地址中删除前导或尾随 0?

标签 math networking ip-address subnet

我知道如果两个 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 和 126001000010 = 1085496376*32* 但是 255128000000 和 126127000001 = 1085276323*84*
我错过了什么吗?

最佳答案

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

所以 126.127.0.1 和网络掩码 255.128.0.0 在子网 126.0.0.0/9

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

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

关于math - 确定两个 IP 地址是否在同一子网上 - 是否从 IP 地址中删除前导或尾随 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148747/

相关文章:

javascript - 使用数组的数学跳过 "16"

java - 使用 java 计算 Romberg 积分

java - 如何获取发送、接收字节和网络带宽利用率

android - 在一个 WiFi 网络上获取多个 Android 设备以共享信息的最佳方式

c# - IP 地址到数字在 Javascript 和 c#.net 中不同

python - 如何从 IP 地址中删除最后几位

python - 在 Pandas 中将 IP 地址转换为整数

c - 64位除以32位

java - 如何找到球体上点和线之间的最小距离

c# - 是否可以为多个客户端创建单个套接字、单线程、TCP/IP 数据包读取器?