我质疑用于python的ipcalc模块(ipcalc)的结果(似乎netaddr可能是更好的选择。
以192.168.1.25/30
为例。以二进制形式,最后一个八位位组是00011001 AND 11111100 = 00011000
,因此我得到192.168.1.24
作为网络ID,范围为192.168.1.24 - 192.168.1.27
。
在指定时使用ipcalc
subnet = ipcalc.Network('192.168.1.25/30')
for x in subnet: print x
输出为
192.168.1.25
192.168.1.26
192.168.1.27
192.168.1.28
我不理解不一致之处。使用CIDR表示法时,似乎同时指定192.168.1.24/30
和192.168.1.25/30
(或.26/30
或.27/30
)是指同一子网。
正确吗?这仅仅是ipcalc模块中的错误吗?
目前有一个打开的错误:No way to resolve IP + Netmask to Network Object
以及讨论该问题的早期错误报告:Strange subnet calculations
但是他们还添加了一个名为network
的功能,用于从IP获取网络地址。从手册:
>>> localnet = Network('127.128.99.3/8')
>>> print localnet.network()
127.0.0.0
该手册特别指出,构造函数Network
应将网络地址作为其第一个参数,而不是网络中的任何IP。如果您问我,那一定会让您感到困惑(特别是因为上面的代码块打破了这个条件)。在使用它之前,我至少会阅读该模块的代码。
正确的子网是192.168.1.24/30,因此ips 192.168.1.24到192.168.1.27成为该网络的一部分。