我教一门有关我公司生产的软件产品的课程,我发现学生经常在配置页面中添加前导零,以便软件连接到我们的硬件。前导零在我们的软件中是有问题的,这就是出现这种情况的原因。
我总是解释说前导零违反了“标准”,认为这就是我所学的。当我将错误报告提交给我的工程部门时,我无法找到权威来源(即“标准”),但我确实找到了一些有趣且相关的信息。
前导零是否因为惯例而不合适,或者它们是否违反了标准?
这是我能找到的最接近不使用前导零的标准,但它是某种过期的草案:
在相关部分中,它写道:
3 Syntax and Semantics
3.1 IPv4 Dotted Octet Format
A 32-bit IPv4 address is divided into four octets. Each octet is
represented numerically in decimal, using the minimum possible number
of digits (leading zeroes are not used, except in the case of 0
itself). The four encoded octets are given most-significant first,
separated by period characters.
IPv4address = d8 "." d8 "." d8 "." d8
d8 = DIGIT ; 0-9
/ %x31-39 DIGIT ; 10-99
/ "1" 2DIGIT ; 100-199
/ "2" %x30-34 DIGIT ; 200-249
/ "25" %x30-35 ; 250-255
我还发现以下文章讨论了这一现象:
答案1
没有标准要求 IPv4 地址必须以某种方式表达。也就是说,RFC 没有指定一种格式,并且有多种格式被广泛使用。最常见的是,您会看到四个八位字节作为十进制数,但您也可能会看到使用单个 8 位十六进制数甚至单个十进制数来代替。虽然八进制数并不常见,但许多实现也接受它们。
这就是通常避免使用前导零的原因;地址可能会产生歧义。“010.010.010.010”可能属于私有范围,但也可能是 Google 著名的 DNS 服务器“8.8.8.8”。以一个前导零开头且不包含数字 8 或 9 的数字通常被解释为八进制。
答案2
理想情况下这不应该有关系,因为当它分解为二进制/十六进制/其他任何数字时,前导零不应该影响最终结果。
例如:192.168.1.1 转换为二进制
192 = 11000000
168 = 10101000
1 = 00000001
1 = 00000001
与 192.168.001.001 完全相同
192 = 11000000
168 = 10101000
001 = 00000001
001 = 00000001
请参阅 SU 先前的回答这里。
答案3
让我们回顾一下我们中的一些人开创互联网世界的时期,并从实际的历史角度来看待这个问题。
历史事实:许多(如果不是大多数)早期路由器都需要(再次强调:需要)这种精确的 IP 地址输入格式:xxx.xxx.xxx.xxx
这意味着:大多数在 1980 年代 - 1990 年代配置路由器的人从来没有想过看到 IP 地址显示为:192.168.001.010 毕竟,用前导零填充通常是强制性的,而且我从来没有遇到过,而且我怀疑大多数人真的没有遇到过要求使用八进制数字的路由器、防火墙、任何类型的 IP 主机。
所以...
001.001.001.001 = 1.1.1.1
10.001.1.010 = 10.1.1.10 (inconsistently padding only some octets makes me sad)
为什么现在要使用填充,因为现在已经快到 2020 年了,大多数系统都接受每个八位字节中 1-3 个十进制字符,而不是老式的 3 个?我能想到一个我经常遇到的原因:
Excel 中的 IP 地址排序列表。
10.1.1.1
10.100.254.50
10.16.2.3
10.3.129.44
10.3.2.50
^ 这就是 Excel 对这些地址进行排序的方式(不是按数字顺序排列!)
但是如果您有一个很大的 IP 列表并希望对它们进行排序:使用填充零,以便 Excel 提供此排序列表:
010.001.001.001
010.003.002.050
010.003.129.044
010.016.002.003
010.100.254.050
现在,如果这个列表有 300 多个地址,并且您想按顺序查看它们,那么填充就是您的好帮手。
此外,如果这些位于数据库中并且使用字符串排序对列表进行排序,那么填充也是您的朋友。
答案4
0.0.0.0/8 为本地网络保留(请参阅 RFC 6890 或更易读的https://en.wikipedia.org/wiki/IPv4#Special-use_addresses)。
因此,任何以 0 开头的地址都是有效的,但它不是特定机器的 IP 地址。