定义子网CIDR时IP是否必须为对应子网段的首个IP地址?
CIDR子网表示与ipaddress库行为说明
- 按照标准CIDR子网定义规则,
1.2.3.0/24代表前24位为网络位的子网,地址范围覆盖1.2.3.0到1.2.3.255,段内共256个IP地址。 - 此前存在疑问:如果使用不规范的写法
1.2.3.64/24定义子网,是否会被识别为1.2.3.64到1.2.3.255的范围,查阅公开文档未找到统一规则说明。
不同网络工具对非对齐的CIDR写法(即给出的IP主机位不为0,和前缀长度不匹配)处理逻辑差异很大,没有统一的强制标准,必须以实际使用的工具文档和测试结果为准。
Java ipaddress库(5.2.1版本)实测结果
最初误判new IPAddressString("1.2.3.64/24").getSequentialRange()会返回1.2.3.64到1.2.3.255的范围,后续实测修正了该结论:
- 直接调用
getSequentialRange()获取范围时:
上下限返回值均为// 取范围下限 new IPAddressString("1.2.3.64/24").getSequentialRange().getLower() // 取范围上限 new IPAddressString("1.2.3.64/24").getSequentialRange().getUpper()1.2.3.64,即该方法会将这种非对齐的输入识别为单个IP地址,逻辑合理。 - 如果需要获取前缀对应的标准子网块范围,需要显式调用前缀对齐方法:
该写法会正确返回子网下限// 取/24标准子网下限 new IPAddressString("1.2.3.64/24").getAddress().toPrefixBlock().getLower() // 取/24标准子网上限 new IPAddressString("1.2.3.64/24").getAddress().toPrefixBlock().getUpper()1.2.3.0、上限1.2.3.255,是获取规范子网范围的可靠方式。
内容的提问来源于stack exchange,提问作者osexp2000
相关产品推荐
相关产品推荐

