是的,你是对的。
我将在这里解释我们是如何得到它的。
对于给定数量的二进制数字(比如 x), 2^x 给出了可以由它组成的不同二进制数的数量。
因此,当我们考虑子网掩码中“0”位的数量时,我们可以使用上述公式找出可以从中组成的不同二进制数的数量。然而,在子网中,保留这些可能的不同二进制数中的两个数来构成网络地址和广播地址。这些是通过将 IP 地址的网络部分与 IP 地址主机部分下的第一个可能的组合和最后一个可能的比特数组合相结合而形成的。
让我通过一个例子来解释这一点。考虑 192.168.209.176/28
11000000 10101000 11010001 10110000 - IP address
11111111 11111111 11111111 11110000 - Subnet mask
子网掩码中有 4 个“0”位。2^4=16。组合为 0000、0001、0010、...、1101、1110、1111。
将 IP 地址的网络部分 (11000000 10101000 11010001 1011) 与第一个组合 (0000) 相结合,我们得到 11000000 10101000 11010001 10110000,当转换为 .162.16 这是该子网的主机地址。
将 IP 地址的网络部分 (11000000 10101000 11010001 1011) 与最后一个组合 (1111) 相结合,我们得到 11000000 10101000 11010001 10111111,当转换为 .9.216 时为 .18.19 这是该子网的广播地址。
正如您在问题中所述,我们必须减去 2 个地址,网络地址和广播地址,因为我们无法将它们分配给主机。因此我们可以修改上面的等式以获得子网中的主机数为 (2^x)-2 其中 x 是子网掩码中的主机位数
现在考虑 192.168.209.176/31。
由于子网掩码中只有 1 个主机位,因此可以形成 2 个地址。但是因为我们必须为网络地址和广播地址保留 2 个地址,所以我们没有留下任何要分配给主机的地址。(2^2)-2=0。
因此带有 /31 的子网没用。