如何判断两个IP地址是否属于同一个网段

dan*_*eed 5 ip-address

一个简单的问题经常让我困惑:有两个IP(v4)地址,192.168.0.1/30和192.168.0.2/24,不知道它们是否属于同一个网段。

你如何确定?

Yan*_*min 4

表示/24构成地址网络部分的位数,在本例中为 24(或 30)。

如果仅对具有最小网络部分的 IP 地址进行 AND 操作,则相同的网络将包含相同的值。

例如,这是一个 C 实现(未经测试):

unsigned int ip1 = (192<<24) | (168<<16) | (0<<8) | (1);
unsigned int ip2 = (192<<24) | (168<<16) | (0<<8) | (2);
unsigned int nm1 = (-1) << (32 - 24);
ip1 &= nm1; // Note: we use nm1 as its the smallest number of bits in the network
ip2 &= nm1;
if (ip1 == ip2) { }  // Same network
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您的 /30 和 /24 是不同的网络,并且将使用路由器来到达不同的地址(即 /24 不会对 IP 1-254 使用路由器,而 /30 将对大多数这些地址使用路由器)。然而,它们在同一地址空间中重叠。