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


89

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

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


16
Accoerding下面的答案,192.168.020.100应该不会是相同的192.168.20.100,但它可能是相同的,如果你的系统允许的IP才可以进入这种方式(我已经当通过输入的IP数字复印机看到了这一点带上下箭头的数字)。-如果即使在可以进行“常规”键盘输入的情况下您的系统也有这个问题(例如,您可以进行技术输入192.168.2.100,但会抱怨),那么我建议您对供应商有所了解(如果输入验证有效,那么安全系统的可信度如何)太烂了?)
哈根·冯·埃岑

4
这确实是一个离奇的验证。我会切换安全系统,就像@Hagen暗示的那样。
Lightness Races in Orbit

2
这也可以是特定于软件的。它们在带或不带前导号0的情况下都有效,但是我遇到了一些不支持IP地址的应用程序,该IP地址的每个八位字节没有3位数字。
ps2goat 2014年

2
实际上,所有IP(v4)地址都只是32位,用一种很好的方式表示。如果192.168.002.100您的工具表示0xc0a80264/ 3232236132 / 192.168.2.100,那么这是同一回事。
蒂姆·S.

1
你能接受另一个答案吗?您接受的答案确实是错误的(或至少是不完整的),并且有11张反对票。
Arjan

Answers:


101

这取决于工具。

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

例如,如果您使用以零开头的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),

37
并不是很多ping,而是它使用的底层例程inet_addr()
cde14年

2

21
这不是因为它具有三位数,而是因为数字具有前导零。您可以通过尝试ping 09.09.09.09来进行测试,该操作不起作用,因为9八进制无效。
Dietrich Epp 2014年

65

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

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

无论您将其键入为192.168.0.1还是192.168.000.001,它们都等于11000000.10101000.00000000.00000001


63
点也为方便起见;真正的IP是11000000101010000000000000000001
cpast 2014年

14
@cpast或作为十六进制数字:C0A80001
jfs

13
或作为八进制数字(从0开始,带或不带点),例如ping 0300.0250.2.0144 for 192.168.2.100
Sergey

15
或作为十进制数字3232235521
oldmud0 2014年

14
正如@GreenstoneWalker的答案所指出的那样,许多程序不会将它们视为相同的;它们会与其他程序相同。前导零的数字(不包含数字8或9)将被理解为八进制数字;因此010.000.001.063将被解释为“ 8.0.1.51”(八进制010 =十进制8;八进制063 =十进制51),而不是“ 10.0.1.63”!
Doktor J 2014年

37

它取决于任何给定程序用来解析给定地址的工具或功能。Microsoft和Linux以及其他OS都使用POSIX兼容inet_addr()例程来解析地址。

Ping和FTP等许多TCP / IP程序都使用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都是无效的示例。


3
+1为基础功能。作为补充,如果有效字节(例如.88)被补零,则此功能将导致IP解析失败,因为8不是八进制的有效数字。
3月Ho

在Windows XP(及之前的版本)中,该函数将接受无效的八进制数,并且仍然尝试对其进行转换。这可能导致非常不明显的行为。从Vista开始,无效数字被视为域名,Windows将尝试对此进行DNS查找。这也是很奇怪的行为,但这至少不会造成任何问题。
Tonny

@tonny是因为POSIX inet_addr()对于无效值返回-1,该值循环到255。如Linux手册页中所述,较新的例程具有更好的错误处理。
2014年

@cde我从不费心去深入研究inet_addr()的机制。我相信你的
同意

13

正如“ 轨道飞行竞赛”和其他人指出的那样,

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

...点分地址的组成部分可以用十进制,八进制(前导0)或十六进制(前导0X)指定。

因此,从技术上讲,NO,具有前导零的IP地址与(始终)与没有前导零的IP地址相同。但是,在您的情况下,由于192.168.2.100192.168.002.100相同002 == 2

要求每个组件的长度正好为三个字符且带有错误要求的前导零的任何用户界面都将损坏。


1
(在某些设备上)要求“前导零”的想法似乎没有争议。称其为“不正确要求” /“损坏”的依据是什么?就因为它违反了INET(3)/ inet_addr / inet_aton?需要使用零的实现可能使用其他可以正常通信的代码,因此不会“中断”。(我见过打印机这样做。)是否有理由说INET(3)手册页比其他正式文件(如RFC和本草案所引用的其他文件)更“正确” /更有权威性?
TOOGAM

6

一些实现将前导零的八位字节视为十进制,其他实现则将它们视为八进制。只要八位位组在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。但是不建议再次使用该表示法。


0

提示:在某些情况下,在IP地址中使用零前缀很重要。一个示例是Apache .htaccess拒绝规则。

如果您使用类似

deny from 11.22.33.22

Apache非常愚蠢,因此也会阻止来自以下IP的访问:

111.22.33.22

11.22.33.221

211.22.33.221

通常,任何包含 11.22.33.22的IP地址

因此,为确保您不会阻止任何您不想阻止的IP,应使用:

deny from 011.022.033.022

确保Apache仅阻止来自11.22.33.22 IP地址的访问。


3
有趣。您可以为此提供参考吗?
斯科特

在发现许多访问者由于不使用前导零而被阻止之后,该参考是个人经历以及许多试验和错误。避免错误禁令的另一种方法是使用CIDR格式的IP。例如,11.22.33.22 / 32而不是11.22.33.22
Nick Gar

0

对此要小心。它应该是一样的,但是不是
我找不到对此的解释,但是我可以明确地告诉我,在Windows和Linux上,带和不带前导零的IP地址是不一样的!也许这与从其他格式(例如十六进制或二进制)转换有关。

根据我在Windows和Linux上的经验,这不是工具的依赖,而是操作系统的依赖,这似乎是因为即时通讯在使用诸如10.08.03.100之类的ip时出现了一些问题:

  • 注意:找不到“ 10.08.0.1”和10.09.0.1
  • 注意:“ 10.010.0.1”解析为10.8.0.1

linux / debian7 / 8:与工具“ ping”和“ snmpget”相同的结果

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

Windows7 / 8/10:与工具“ ping”和“ telnet”相同的结果

(对不起,我手边没有英文窗口,错误提示找不到主机)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

前导零通常表示八进制。实际上,八进制010是十进制8,而08和09是无效的八进制数字。因此,是的,(目前)AthomSfere接受的答案是错误的(或至少是不完整的)。查看其评论和其他一些答案。
Arjan

糟糕,对10.010.0.1的处理绝对是糟糕的。在Microsoft Windows中,将ping 10.070.0.1视为10.56.0.1,而10.080.0.1会立即出现错误,“ Ping请求找不到主机10.080.0.1。请检查名称,然后重试。”
TOOGAM

1
是的,@ TOOGAM,八进制070是十进制56。八进制080不是有效数字。
Arjan

-4

这两个IP地址不同。

然而:

  • 人们通常会认为它们是相同的。
  • 某些软件会认为它们相同。
  • 在某些平台上,某些软件会认为它们有所不同。

如果这听起来令人困惑,那是因为没有标准来规范应该编写IP地址的方式,因此在历史的不同阶段和不同平台上,不同的程序员对应该做什么的想法也不尽相同。

IP地址实际上是二进制的,人们倾向于使用点分十进制表示法来表示IP地址。软件可以接受各种数字基础(即十进制,八进制,十六进制),并根据您的编写方式以各种方式解释事物。您如何编写它可以告诉软件您正在编写什么基础。

我建议您:如果要使用点分十进制表示法,请不要使用前导零。某些软件会认为该标志表示您正在输入八进制数字。如果要输入十进制数字,则不会获得期望的结果。

我问了一个类似的问题,并得到了一些很好的答复,因此,如果您想阅读RFC的内容,那儿会有很多有用的信息。


-6

它应该以任何一种方式工作。您甚至可以使用三位数字ping通,计算机将了解IP地址。

编辑:Windows会将其读取为八进制,仅适用于Linux。


这是真的。众所周知,点分十进制格式仅适用于人类。网络上的设备不使用此IP地址表示。
Patrick Seymour 2014年

1
@Brock Vond:是的,除了我认为您不小心将186和168调换了。
Patrick Seymour 2014年

6
对3位数字使用ping可能不起作用。可以将它们视为八进制。
Greenstone Walker

1
@LightnessRacesinOrbit实际上,即使您对它们进行零填充,至少在Windows和Debian(我没有Mac)中,给定的示例也可以使用。仅当数字填充为零且填充数字为零大于7(八进制和十进制相同)时,才会出现错误/功能。如果您尝试输入一个有效的十进制地址,并用零填充(例如012.034.056.078),它将仍然尝试将其解析为八进制,导致ping功能失败。
2014年

1
@MarchHo:是的,这就是我们所有人所说的。
Lightness Races in Orbit

-11

前导零是没有意义的。八位位组是(base-10)0-255,而不是字符串。

由于我不确定您要问的是什么(或者您知道要问什么问题:)):也就是说,IP#必须与您的网络位于同一子网中。如果您在192.168.0.0的子网掩码中选择11.12.13.14,则该设备将无法与该子网对话或使用该子网。


大声笑-不,我说不懂子网,以及网络的基本概念...只是从来没有遇到过需要3位数字的产品。我只是将11.12.13.14用作变量...,但感谢:)
Brock Vond 2014年

9
-1:否,inet_addr依赖它进行地址解析的数十万工具使用前导0表示该字节以base-8表示法给出。这几乎是“毫无意义的”。
Lightness Races in Orbit
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.