我应该向我的软件 UI 添加验证(IP 子网 UI)允许用户输入一对 IP 地址和子网掩码。我应该确保两个网络接口未配置在同一个子网中。
我的理解是,如果我在 IP 地址和子网掩码之间执行按位与运算,我将获得一个网络 ID,如果 N/W ID 不相同,这是否足以声称两个网络接口不在同一个子网中?
此问题仅限于IPV4。
答案1
您需要使用相同的网络掩码来确定网络是否相同。您需要使用最短的网络掩码进行比较。这就是您确定两个地址是否在同一个网络中的方法。
除地址和掩码大小外,IPv4 和 IPv6 的过程完全相同。
例如,10.0.0.0/25
和10.0.0.64/26
将返回具有最短掩码(255.255.255.128
)的相同网络,但将返回具有最长掩码(255.255.255.192
)的不同网络,即使第二个网络是第一个网络的子网,因此第二个网络中的任何地址都属于第一个网络。
使用最短的掩码:
10.0.0.0 -> 00001010000000000000000000000000
255.255.255.128 -> 11111111111111111111111110000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
10.0.0.64 -> 00001010000000000000000001000000
255.255.255.128 -> 11111111111111111111111110000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
戴上最长的口罩:
10.0.0.0 -> 00001010000000000000000000000000
255.255.255.192 -> 11111111111111111111111111000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
10.0.0.64 -> 00001010000000000000000001000000
255.255.255.192 -> 11111111111111111111111111000000
AND -> ================================
00001010000000000000000001000000 = 10.0.0.64
使用指定的掩码:
10.0.0.0 -> 00001010000000000000000000000000
255.255.255.128 -> 11111111111111111111111110000000
AND -> ================================
00001010000000000000000000000000 = 10.0.0.0
10.0.0.64 -> 00001010000000000000000001000000
255.255.255.192 -> 11111111111111111111111111000000
AND -> ================================
00001010000000000000000001000000 = 10.0.0.64
可以看到,只有使用最短掩码的例子才真正返回了正确的答案,即第二个地址在第一个地址的网络中。
答案2
首先,您实际上只需要一个子网掩码条目,因为如果它们有两个不同的掩码,则不应将它们放在同一个子网上。但除此之外,是的,您将地址与掩码相加,如果得到相同的结果,则它们位于同一个子网上。