现在,几年后,我也遇到了同样的问题。实际上,这是来自Andrew Tanenbaum计算机网络书中的一个问题,你不能对这些东西进行排序 :)
要解决这个问题,你需要按照以下步骤进行:
你从198.16.0.0开始。
现在公司A请求4000个IP地址。你必须将这个数字(以及以后的任何请求)舍入为2的幂 - 4096。
现在让我们想一想:一个IP地址由32位组成。其中一些是网络位,另一些是主机位(如果您是第一次了解,请阅读
this)。你需要多少主机位,才能让公司A获得4096个主机?正确的答案是:log²(4096) = 12。因此,剩下的20位(32-12)被保留给网络。现在,我们已经有了公司A的起始IP地址和子网掩码:198.16.0.0/20(如果这使您感到困惑,请阅读上面的链接)。
现在,我们需要确定公司A的最后一个IP地址。
为了做到这一点,我们查看我们的IP地址和子网掩码的二进制表示(认为"|"是ip地址的网络部分和主机部分之间的边界):
Start-IP (A):
11000110.00010000.0000|0000.00000000
Subnet-Mask(/20):
11111111.11111111.1111|0000.00000000
如您所见,现在您有12位用于主机,它们都可以自由更改,因此您总共有2^12种可能性= 4096。最后一个可用的IP将是所有主机均等于1的IP:
结束IP:
11000110.00010000.0000 | 1111.11111111
在十进制中,它看起来像:
198.16.15.255
现在让我们看看B公司:
它请求2000-我们将其舍入到2的幂:2048
log²(2048)= 11个主机位= 21个网络位= /21
现在请记住我们分配给A的最后一个IP:
End-IP:
11000110.00010000.00001111.11111111
那么下一个可用的IP地址应该至少比当前IP大1,对吗?
11000110.00010000.00001111.11111111 +1 = 11000110.00010000.00010000.00000000 = 198.16.16.0
我们可以将这个IP作为公司B的起始IP。
现在让我们使用/21的子网掩码来尝试一下:
Start-IP (B):
11000110.00010000.00010|000.00000000
Subnet-Mask(/21):
11111111.11111111.11111|000.00000000
看起来工作正常!我们有11个主机位,因此可以连接2^11台主机=2048台。然而,最后一个可用的IP地址将是所有主机位都等于1的那个:
11000110.00010000.00010|111.11111111 = 198.16.23.255
现在随着公司C的加入,情况开始变得复杂,请耐心听我解释:
问题在于,他们需要比前任更多的IP地址。但是我们仍将处理它 :)
公司C想要4000个IP地址,我们将其四舍五入为4096,并像以前一样计算主机位数:hosts=20。
现在我们将尝试与以前相同的方法,以便您可以看到问题:
我们取上一个分配的IP地址并将其增加一:
11000110.00010000.00010111.11111111 + 1=
11000110.00010000.00011000.00000000
现在让我们将/20的网络掩码应用于这个IP:
Start-IP (B):
11000110.00010000.0001|1000.00000000
Subnet-Mask(/21):
11111111.11111111.1111|0000.00000000
现在你应该看到问题所在:
我们的主机位部分有一个1。因此,我们不能使用所有12位,而只能使用11位,这将给我们只有2^11 = 2018个主机。
所以你可能会想:如果我们把主机部分的1变成0会怎样?那么,在这种情况下,您将完全与提供给公司B的IP地址发生冲突。所以这不是一个选项。唯一的方法是通过仅对网络部分应用增量来将1“推入”网络位部分,以便代替:
11000110.00010000.0001|1000.00000000
你得到的是(仅递增网络部分:11000110.00010000.0001 + 1)
11000110.00010000.0010|0000.00000000
这相当于198.16.32.0。
最后一个IP将再次出现,其中所有主机位均等于1,因此
198.16.47.255
现在您可以使用公司D完成同样的事情 :)
结果应该是:
A: 198.16.0.0 – 198.16.15.255 written as 198.16.0.0/20
B: 198.16.16.0 – 198.16.23.255 written as 198.16.16.0/21
C: 198.16.32.0 – 198.16.47.255 written as 198.16.32.0/20
D: 198.16.64.0 – 198.16.95.255 written as 198.16.64.0/19