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

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

我正在对 Java EE 应用程序进行更改,该应用程序将使用以下方式根据用户的 IP 地址进行身份验证ServletRequest.getRemoteAddr。我们将 IP 地址范围(FROM_IP 和 TO_IP)存储在数据库中,只有当用户的 IP 地址落在某个范围内时,系统才会进行身份验证。

现在,测试人员指出,FROM_IP 和 TO_IP 值中(任何地方)都不应允许使用数字 0(零)。请注意,这是一个面向 Internet 的应用程序,因此我们将仅获取公共 IP 地址。

测试人员建议进行验证是否正确?为什么我们不能在 167.23.0.1 - 167.23.255.255 这样的范围值中使用零?

答案1

不,他们完全错了。

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

原样167.23.0.1

将 IP 地址分成点状部分纯粹是为了方便显示。这192.168.1.42比更容易记住3232235818

对计算机来说,重要的是分隔符(网络掩码)。将主机地址的主机部分全部设置为 0 或 1 是无效的。

因此,只要网络掩码使得主机部分中的某些位被设置,则为 192.168.24.0。请参阅以下计算:


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/24 网络中的有效主机地址。

答案2

除非我理解错误,否则您的测试人员完全错了。有效 IP 地址中肯定可以包含 0。

答案3

一般来说:不,地址中是否有 0 并不重要。

但是,测试人员说的话也有一定的道理。在某些情况下,旧的或损坏的网络设备无法在最后八位字节为 0 的地址上正常工作。这是由于旧的全类路由规则造成的。在全类路由中,您可以从地址的第一个八位字节中得知网络掩码。如果设备仍然遵循全类路由规则,则可能会错误地处理 200.100.1.0/16 之类的地址。

答案4

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

网络和广播地址是有效的 IP 地址,只是主机无法使用。

相关内容