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

Rit*_*esh 36 ip authentication ip-address ipv4

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

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

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

Mik*_*eyB 73

不,他们完全不正确。

事实上,这是一个有效的 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,地址部分(右侧)设置了 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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,地址部分有 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
Run Code Online (Sandbox Code Playgroud)

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

  • 我将跳到这个正确的答案上,补充一点:IP 地址的“点分四边形”格式虽然是规范的,但并不是唯一的表示格式。试试命令 `ping 2130706432` 或 `ping 017700000001`(是的,即使在 Windows 上也是如此)。您可能会发现自己对结果感到惊讶。 (12认同)
  • http://1076000524 :) (5认同)
  • @Raffael:子网零实际上是全类路由时代的保留。例如,当您拥有 B 类网络 (129.97.0.0/16) 时,零子网将是任何位 17→X 都设置为零的网络(其中 X 是子网的长度)。所以网络 129.97.0.0/24 将是一个零子网,在早期是不允许的。现在(谢天谢地)我们使用 CIDR 并且不用担心。 (3认同)
  • `192.168.0.257` 不正确,但 `192.168.257` 是 `192.168.1.1` 的正确表示(如 `192.11010305`)。请参见“inet_aton(3)”。 (2认同)

EEA*_*EAA 18

除非我误解,否则你的测试人员是完全错误的。有效的 IP 地址当然可以包含 0。


peh*_*hrs 13

一般情况:不,地址中是否有 0 无关紧要。

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