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


36

我正在研究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?


11
这是到子网划分工作原理的强制性链接题。

8
当IPv6地址可以包含12个0时,您的测试人员提出了这一点,我感到很惊讶。PS,如果还为时不晚,您确实应该使您的IP地址字段适合IPv6地址。将来您会避免头痛。
Mark Henderson

2
127.0.0.1有两个零吗?
约翰·史密斯,

1
顺便说一句,表现出对我自己的IP地址whatismyipaddress.com中有0(67.xx.0.xx)
仅限Ritesh

1
类似的问题在这里:XYZ0是有效的IP地址吗?
splattne

Answers:


70

不,它们完全不正确。

实际上,这是一个有效的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网络中的有效主机地址。


11
我将回答这个正确的答案,以补充一点:IP地址的“点分四边形”格式虽然是规范的,但不是唯一的表示格式。尝试命令ping 2130706432ping 017700000001(是,即使在Windows上也是如此)。您可能会对结果感到惊讶。
BMDan 2011年


1
尽管这里所说的确实是正确的,但不幸的是,无论前缀长度如何,都有大量用户界面认为尾随零(或255)是不好的。
Theobroma Cacao

1
192.168.0.257是不正确的,但是192.168.257的正确表示形式192.168.1.1(按192.11010305)。请参阅inet_aton(3)
BMDan 2011年

2
@Raffael:子网零实际上是从classfull路由日开始的保留。例如,当您拥有B类网络(129.97.0.0/16)时,零子网将是任何将位17→X都设置为零(其中X是子网的长度)的网络。因此,网络129.97.0.0/24将是一个零子网,并且在早期是不允许的。如今(感谢),我们使用CIDR,不必担心。
MikeyB 2011年

16

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


12

通常:不,地址中是否有0无关紧要。

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


3

假设您在一个范围内需要510个IP地址,并且您的网络地址是192.1.1.0,您将拥有一个/ 23子网,其中一个主机IP是.0 IP地址,如果.0地址,则测试仪是错误的是主机地址。如果您使用/ 24网络,则说错了是正确的。


2

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

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


1
XY0.255的广播地址怎么办?
Random832

2
您可以将网络地址用作主机,这曾经是对“保密性”的常见测试。值得庆幸的是,此后它已经很不流行了。与此类似,RFC 3021允许在/ 31 中同时使用“广播” “网络”地址,尽管当您只处理两个主机时,这些术语可能并不适用。
BMDan 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.