将IPv4地址的一部分设置为零是否有效?

我正在使用ServletRequest.getRemoteAddr根据用户的IP地址对Java EE应用程序进行更改。 我们将IP地址范围(FROM_IP和TO_IP)存储在数据库中,只有当用户的IP地址在一个范围内时,系统才会进行authentication

现在,testing人员指出,在FROM_IP和TO_IP值(在任何地方)不应该允许数字0(零)。 请注意,这是一个面向互联网的应用程序,所以我们只会获得公共IP地址。

testing人员是否正确地build议validation? 为什么我们不能在范围值中有零,例如167.23.0.1 – 167.23.255.255?

不,他们完全不正确。

实际上,这是一个有效的IP地址: 192.168.24.0

至于167.23.0.1

将IP地址分隔成虚线段是纯粹的人性化的便利。 记住192.168.1.42要比3232235818容易得多。

对电脑来说重要的是分离(networking掩码)。 将地址的主机部分设为完全为0或1的主机地址是无效的。

因此,192.168.24.0只要networking掩码是这样的一些位被设置在主机部分。 看下面的计算:


 michael@challenger:~$ ipcalc 192.168.24.0/16 Address: 192.168.24.0 11000000.10101000. 00011000.00000000 Netmask: 255.255.0.0 = 16 11111111.11111111. 00000000.00000000 Wildcard: 0.0.255.255 00000000.00000000. 11111111.11111111 => Network: 192.168.0.0/16 11000000.10101000. 00000000.00000000 HostMin: 192.168.0.1 11000000.10101000. 00000000.00000001 HostMax: 192.168.255.254 11000000.10101000. 11111111.11111110 Broadcast: 192.168.255.255 11000000.10101000. 11111111.11111111 Hosts/Net: 65534 Class C, Private Internet 

在这种情况下,地址部分(右侧)设置了2个位。 这是192.168.0.0/16子网中的有效主机地址。


 michael@challenger:~$ ipcalc 192.168.24.255/16 Address: 192.168.24.255 11000000.10101000. 00011000.11111111 Netmask: 255.255.0.0 = 16 11111111.11111111. 00000000.00000000 Wildcard: 0.0.255.255 00000000.00000000. 11111111.11111111 => Network: 192.168.0.0/16 11000000.10101000. 00000000.00000000 HostMin: 192.168.0.1 11000000.10101000. 00000000.00000001 HostMax: 192.168.255.254 11000000.10101000. 11111111.11111110 Broadcast: 192.168.255.255 11000000.10101000. 11111111.11111111 Hosts/Net: 65534 Class C, Private Internet 

在这种情况下,地址部分有10位设置和6位未设置。 这是在同一子网中的另一个有效的主机地址。


 michael@challenger:~$ ipcalc 192.168.24.0/24 Address: 192.168.24.0 11000000.10101000.00011000. 00000000 Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000 Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111 => Network: 192.168.24.0/24 11000000.10101000.00011000. 00000000 HostMin: 192.168.24.1 11000000.10101000.00011000. 00000001 HostMax: 192.168.24.254 11000000.10101000.00011000. 11111110 Broadcast: 192.168.24.255 11000000.10101000.00011000. 11111111 Hosts/Net: 254 Class C, Private Internet 

在这种情况下,地址部分设置了零位。 这不是192.168.24.0/24networking中的有效主机地址。

除非我误解,否则你的testing者是错误的。 有效的IP地址当然可以有一个0。

一般来说:不,地址中是否有0就没关系。

然而,你的testing者所说的话有一点道理。 在某些情况下,旧的或破损的networking设备在最后一个字节中的地址为0时将无法正常工作。 这是由于旧的有路由规则。 在Classfull路由中,您可以从地址的第一个八位字节中知道networking掩码。 如果设备仍然遵循有组织的路由规则,那么很可能会错误地处理像200.100.1.0/16这样的地址。

假设您需要在一个范围内使用510个IP地址,并且您的networking地址是192.1.1.0,那么您将拥有一个/ 23子网,其中一个主机IP是一个.0 IP地址,您的testing人员在.0地址是主机地址。 如果你有一个/ 24networking,那么说这是错的。

为了提供一个非常简单的答案:只要这些地址不是networking或广播地址,ip地址中的一个或多个零对于主机地址是完全有效的。

networking和广播地址是有效的IP地址,它们只是不能被主机使用。