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

Bro*_*ond 92 networking ip

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

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

Gre*_*ker 104

这取决于工具。

在大多数情况下,两者是相同的,但并非总是如此。

例如,如果您使用以零开头的 3 位数字(或以零开头的两位数字,感谢@Dietrich-Epp),则 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),
Run Code Online (Sandbox Code Playgroud)

  • 不是 ping,而是它使用的底层例程 **`inet_addr()`** (38认同)
  • 这不是因为它有三位数字,而是因为数字有一个前导零。您可以通过尝试 ping 09.09.09.09 来测试这一点,这不起作用,因为 9 在八进制中无效。 (21认同)
  • 它也发生在 OSX 上。 (2认同)

Aus*_*nch 66

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

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

无论你输入 192.168.0.1 还是 192.168.000.001 它们都等于 11000000.10101000.00000000.00000001

  • 圆点也是为了方便;真实IP是11000000101010000000000000000001 (63认同)
  • 或作为十进制数 [`3232235521`](http://3232235521) (15认同)
  • @cpast 或十六进制数:`C0A80001` (14认同)
  • 正如@GreenstoneWalker 的回答所指出的,许多程序不会将它们视为相同的;带有前导零的数字(不包含数字 8 或 9)将被理解为八进制数;因此 010.000.001.063 将被解释为“8.0.1.51”(八进制 010 = 十进制 8;八进制 063 = 十进制 51)而不是“10.0.1.63”! (14认同)
  • 或作为八进制数(以 0 开头,带或不带点)例如 ping 0300.0250.2.0144 表示 192.168.2.100 (13认同)
  • 这个答案只是简单的**错误**。虽然它们在某些系统上*可能*等效,但在使用将前导零解释为八进制表示法的 API 时它们*不*等效。毫无疑问,*是的*它们是相同的,这是**错误的**和不负责任的。 (5认同)
  • 十六进制、八进制和十进制转换让我笑了,但真正的 IP 地址是严格的二进制。即使您的硬件设备出于某种原因使用三态逻辑并以三进制形式存储地址,IP 路由协议也要求在用于网络 ID 估计的二进制格式地址。 (3认同)

cde*_*cde 37

这取决于任何给定程序用来解析给定地址的工具或函数。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 都是无效示例。

  • +1 为基础功能。另外,如果有效字节(例如 .88)被零填充,此函数将导致 IP 解析失败,因为 8 不是八进制中的有效数字。 (3认同)

Jon*_*art 14

正如Lightness Races in Orbit和其他人指出的那样,

INET(3)手册页介绍了inet_addrinet_aton,用于“IPv4的数字,和点符号转换成二进制形式的”转换的标准功能。它说

...点分地址的组成部分可以指定为十进制、八进制(以 0开头)或十六进制(以 0X 开头)。

所以从技术上讲,,带有前导零的 IP 地址并不(总是)与没有前导零的 IP 地址相同。但是,在您的情况下,192.168.2.100192.168.002.100是相同的,因为002 == 2.

任何要求每个组件的长度恰好为三个字符且带有不正确要求的前导零的用户界面都会被破坏。

  • 需要“前导零”(在某些设备上)的想法似乎没有争议;称其为“不正确要求”/“损坏”的依据是什么?就因为它违反了 INET(3)/inet_addr/inet_aton?需要这样的零的实现很可能使用其他可以正常通信的代码,因此不会被“破坏”。(我见过打印机这样做。)是否有依据说 INET(3) 手册页比其他官方文档更“正确”/更权威的资源,如 [本草案文档] 引用的 RFC 和其他文档(https://tools.ietf.org/html/draft-main-ipaddr-text-rep-02)? (2认同)

kas*_*erd 6

一些实现将带有前导零的八位字节视为十进制其他实现将它们视为八进制。只要八位字节在 0 到 7 的范围内,就没有区别。因此,例如将192.168.002.100被解释为192.168.2.100在两种实现中。

但是如果你要输入一个地址,因为192.168.010.100它可以被解释为192.168.10.100或者192.168.8.100取决于实现。实现确实存在也不太可能,这会将前导零视为语法错误。此外,在某些情况下,软件可能会出于某种原因坚持要求您使用规范表示。出于所有这些原因,我建议您在编写 IP 地址时避免使用前导零。

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

稍微相关的是,有些实现允许您在点符号中使用少于四个的组件。当少于四个分量时,最后一个分量多于 8 位,而较早的分量恰好为 8 位。例如192.168.612,实际上是一种有效的写入方式192.168.2.100。但不建议再次使用该符号。