带有和不带有前导零的 IP 地址是否相同?

带有和不带有前导零的 IP 地址是否相同?

我有一个安全系统,网络设置只允许三位 IP 地址。我无法将其设置为192.168.2.100,而是必须使用192.168.002.100

这两个 IP 地址不同吗?我需要将路由器的 LAN 设置为全部192.168.xxx.xxx才能正常工作吗?我找不到有关此问题的任何可靠信息。

答案1

这取决于工具。

对于大多数目的来说,两者是相同的,但并非总是如此。

例如,如果您使用以零开头的数字,则 ping 将假定该数字是八进制。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

答案2

假设您使用的所有软件都正确使用点十进制和子网划分,那么它们是相同的。

例如,192.168.0.1 仅是点二进制值 11000000.10101000.00000000.00000001 的友好点十进制表示法。

无论您输入的是 192.168.0.1 还是 192.168.000.001,它们都等于 11000000.10101000.00000000.00000001

答案3

这取决于任何给定程序用来解析给定地址的工具或函数。Microsoft 和 Linux 以及其他操作系统都使用POSIX兼容的inet_addr()用于解析地址的例程。

许多 TCP/IP 程序(例如 Ping 和 FTP)使用 inet_addr() 套接字函数将 IP 地址字符串转换为 4 字节地址。此函数接受标准十进制、八进制和十六进制表示法的 IP 地址。
Microsoft KB115388 Ping 和 FTP 将以零开头的 IP 地址解析为八进制

 

inet_addr() 函数将 Internet 主机地址 cp 从 IPv4 数字和点表示法转换为网络字节顺序的二进制数据。

在所有上述形式中,点分地址的组成部分都可以用十进制、八进制(以 0 开头)或十六进制(以 0X 开头)指定。任何这些形式的地址统称为IPv4数字和点表示法。使用四个十进制数的形式称为 IPv4 点分十进制表示法(或有时称为:IPv4 点分四进制表示法)。
inet_addr(3): Internet 地址更改例程 - Linux 手册页

因此,您的特定系统可能要求每个八位字节采用三位十进制表示法,但这不是通用的,因此应小心确保输入了正确的 IP 地址。

当然,只有每种类型的有效数字才会起作用。超出范围的八进制、十六进制或十进制数字也会失败或导致问题。八进制 088、十六进制 0xGG 或十进制 280 都是无效的示例。

答案4

一些实现认为以零开头的八位字节是十进制的,而其他实现认为它们是八进制的。只要八位字节在 0 到 7 的范围内,这没有区别。因此,例如在两种实现中都会192.168.002.100被解释为。192.168.2.100

但是,如果您输入地址,则192.168.010.100可能会根据实现将其解释为192.168.10.100192.168.8.100。实现确实存在,这将认为前导零是语法错误,这也并非不可能。此外,在某些情况下,软件可能会坚持要求您必须出于某种原因使用规范表示。出于所有这些原因,我建议您在编写 IP 地址时避免使用前导零。

如果您编写需要解析 IP 地址的软件,我建议接受前导零,但在发生这种情况时将警告输出到适当的位置。

稍微相关的是,有些实现允许在点分符号中使用少于四个组件。当组件少于四个时,最后一个组件有超过 8 位,而前面的组件正好有 8 位。例如,192.168.612实际上是一种有效的写法192.168.2.100。但同样不建议使用该符号。

相关内容