我错误地错过了IP地址的句点,并输入了192.168.072。 >
为什么?


我在Windows域上的Windows PC上。


如果我对192.168.0.58进行ping操作得到192.168.072的响应,因此192.168.0.58中的192.168.72(在我的原始错误中)似乎很重要。博客条目以获取更多详细信息或自己撰写博客


评论

相关:blog.superuser.com/2012/02/10/wtfriday-http2915189091

有趣的是,在Linux上发生了完全相同的事情:ping 192.168.072打印PING 192.168.072(192.168.0.58)56(84)字节的数据。[...]。

更随机的是,您有一台位于192.168.0.58的计算机来获得响应。那有几率呢?

@KronoS如果您在学校或公司网络中,实际上并不是那么奇怪。一些DHCP服务器将按递增顺序提供地址,并且大多数将被使用。

192.168.0.58对我来说超时。.所有的ping请求都可能以某种方式将服务器关闭吗?!

#1 楼

每个人都使它与RFC,IP类等过分复杂。只需运行一些测试,以查看ping命令如何解析用户的IP输入(去除了多余的谷壳): Windows中)允许您使用不同的IP地址格式。 IPv4地址可以分为以下四个部分(“点分四进制”):pingA.B.C.D命令允许您省略一些内容,并填写默认值ping,如下所示:

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:


如果仅提供单个零件,则其值小于255(一个八位位组的最大值),则将其视为上述的八位位组,但是如果它大于255,则它将被视为一个八位位组。被转换并滚动到下一个字段(即0)。

有一些边缘情况,例如提供四个以上的部分似乎不起作用(例如,对mod 256的IP进行ping操作对于google.com0.74.125.226.4都无效)。

因此,有很多方法可以表示(IPv4)IP地址。您可以使用平面或点分四进制(或点分三重,点分双精度,甚至点分单精度)格式,并且对于每种格式,都可以使用(甚至混合和匹配)十进制,八进制和十六进制。例如,可以通过以下方式ping 74.125.226.4.0



0x(域名)

google.com(点分十进制)

google.com(十进制十进制)

74.125.226.4(八进制点缀)

1249763844(十进制八进制)

0112.0175.0342.0004(十进制虚线)

011237361004(扁平十六进制)

0x4A.0x7D.0xE2.0x04((ಠ_ಠ)

(感谢没有添加二进制符号支持!)

应用程序:

在您的情况下,ping 0x4A7DE204使用上表中的第三种格式(74.0175.0xe2.4),因此您实际上是在ping 192.168.072。此外,由于最后一部分的前导零,因此将其视为八进制,十进制为58。

已解开谜底。


注意,尽管Windows A.B.0.C命令允许输入使用多种格式,并以可见的方式解释非标准格式,但这并不一定意味着您可以在任何地方使用这种格式。有些程序可能会强迫您提供点分四进制的所有四个部分,另一些程序可能不允许十进制和八进制的混合和匹配,依此类推。

此外,IPv6地址进一步使解析逻辑和输入变得复杂格式可接受性。

附录:

syss指出,如果在其中一个数字中使用无效字符(例如,使用八进制时使用192.168.0.072ping,则使用8十六进制模式等),那么9足够聪明,可以识别它并将其解释为字符串(-al?-ic?)URL而不是数字IP地址。

(作为某人曾经有过无数的动脉瘤和心脏病发作,试图编写所谓的“简单”代码来适应数据值排列的指数爆炸式增长,我很欣赏,它似乎能够正确地处理所有输入变化;在这种情况下,至少31 + 32 + 33 + 34 = 120个变体。)

因此,在指定g时会按预期的方式ping ping,并将010.020.030.040传递给q 4312079q将被视为URL而不是IP地址,例如8.16.24.32,它可能(但遗憾的是不存在)。换句话说,它尝试对顶级域010.020.030.080上的域ping上的子域foo.bar.baz.com上的子域010执行ping操作。但是,由于020不是有效的TLD(例如030080及其伙伴),因此连接会在第一步失败。

080也会发生相同的情况,其中无效字符位于不同的八位字节中。同样,.com ping .net,但090.010.010.010失败。

好吧,我想这就是您不会流利使用多个数字基的原因。
它可能更容易,更安全只需确保始终使用4点分四进制(“ 40q”?“ quaaddy-quad”?“ cutie-q”?)地址即可。

因此继续学习一些数字基础。您将可以炫耀派对并成为派对的生活,正如他们所说的那样,这里有十种人:懂二进制的人和不懂二进制的人。

甚至不考虑IPv6地址;我认为它们是111枚海豹之一!

评论


太复杂了吗?实验可能非常有用,并且在这种情况下产生了很好的答案。但是如果没有理论,文档或标准,您可能会错过一个关键因素,却一无所知。或者,您可能正在确定一个特定版本的工作方式,并且在那里大约90%的实现都出错了。或者,您可以提出解释实验结果的规则,但比预期的规则复杂。在这种情况下,我认为文档的规则(对于inet_aton())在一个方面更简单-对于“低于/高于255”没有条件。

– LarsH
2012-10-12 18:35

你看!计算机科学的“科学”部分应运而生! (假设,实验,验证)

–伊兹卡塔
2012年10月12日19:20

@LarsH,这是我的观点,但是ping命令(至少在Windows上是)类似于Microsoft的许多程序(尤其是臭名昭著的IE)。它试图变得太宽容,拿走你扔给它的任何东西并试图解释它。是的,有一个关于IP地址格式的官方文档,但这不是关于ISO和RFC的问题,它是实用的,我做了一些事情,这是一个很奇怪的问题,无需借助(公认的冗长,干燥,无聊)技术规范)—尽管OP希望阅读它们也可以链接到它们。

– Synetech
2012年10月12日19:47

除chmod之外,应完全放弃0前缀的八进制解析。而已。这是八进制的唯一例外。期。

–詹姆斯·邓恩
2012-10-12 23:42

对于将RGB HEX转换为DEC很有用。大声笑〜C:\> ping 0xffffcc使用32字节的数据ping 0.255.255.204:

–威尔逊
2012年10月15日7:51



#2 楼

造成这种情况的原因有两个:
首先,前缀“ 0”表示一个八进制数字。由于oct(072)= dec(58),192.168.072 = 192.168.58。
其次,倒数第二个IP可以作为速记从IP地址中删除。 127.0.1被解释为127.0.0.1,在您的情况下192.168.58被解释为192.168.0.58。

评论


它不将零分组。实际上,它将每个点视为与下一个字节边界相对应的分隔符。因此,IP地址2130706433和127.0.0.1是相同的地址。

– Serge
2012年10月12日12:07

更确切地说,在IP地址的情况下是四点符号

–纪尧姆86
2012年12月12日13:24

著名的前导零再次击中!

–Luc M
2012年10月12日14:21

现在,这才是真正的答案!

– Alex Gordon
2012-10-12 18:48

这个答案是不正确的,具有误导性。在1.0.2.3(1.2.3)中添加0会得到一个不同的IP地址(1.2.0.3)。

–sch
2012-10-12 19:53

#3 楼

除了@ neu242关于八进制表示法的要点,以及观察到IP地址可以缩短之外,另一个关键部分是知道缩短的IP地址是如何解释的。如果缺少四个数字,解析器会将零填充字节添加到字节序列的末尾(或开头)。但这与OP所报告的行为不匹配:192.168.072被解析为192.168.0.58,而不是192.168.58.0,也不解析为0.192.168.58。

显然Windows和Linux ping(您使用的版本尝试和我尝试的)使用等效于inet_aton()的东西来解析IP地址参数。 inet_aton()的手册页中说: )被解释为16位值,该值定义二进制地址的最右边2个字节,等效于192.168.072

上述规则等效于说,如果缺少四个数字,则所需的零填充字节会立即添加到给出的最后一个数字之前,而不是在字节串的末尾或开头。 (如果给定的最后一个数字小于256,则可以用这种方式表示。)

请注意,较新版本的ping可能不允许这种简写形式或八进制解释。我发现的iputils(包括ping)的2010年源代码使用inet_pton()而不是inet_aton()来解析IP地址参数。 inet_pton()的手册页上说:


与inet_aton(3)和inet_addr(3)不同,inet_pton()支持IPv6地址。另一方面,inet_pton()仅接受点分十进制表示法的IPv4地址,
而inet_aton(3)和inet_addr(3)允许使用更通用的
数字和点表示法(十六进制和八进制数字格式,以及不需要显式写入所有四个字节的
格式。)


评论


到目前为止,这是恕我直言的最佳答案。

–乔什
2012年10月12日17:07

在Windows上,您正在Winsock中寻找inet_addr。

–user7116
13年5月17日在19:57

#4 楼

您还必须考虑到ip可以由在其位置上有意义的整数相加来表示。

> 192.168.58将是192.168.0.58,因为

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0


192.11010106也将是192.168.0.58因为是

    0 * 256^1 
+  58 * 256^0 
=  58


3232235578也将是192.168.0.58,因为

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106


评论


“ 192.168.56将为192.168.0.56,因为0 * 256 ^ 1 + 58 * 256 ^ 0 = 58”您确定吗?您希望在第一种情况下168乘以256 ^ 1,在第二种情况下乘以256 ^ 2。类似地,将192乘以256 ^ 2与256 ^ 3。因此,如果还有其他规则(例如,丢弃零),则192.168.56只能= 192.168.0.56。

– LarsH
2012年10月12日14:35



@LarsH,我认为这里要说的是它是从左到右的,这与“正常”计数是指从1算起的所有基数不同。因此,第一个点导致其左边的任何内容乘以256 ^ 3,第二个点与256 ^ 2相乘,第三个点与256相乘。如果在其左侧没有点,则将其乘以256 ^ n。所以1.2.3。如果我理解正确,则(1.2.3.0)与1.2.3(1.2.0.3)会有所不同。

–雅各布
2012年10月12日14:59

@ iX3:如果是这种情况,那么“ 192.168.56将是192.168.0.56”将是不正确的,因为在第一种情况下,56将乘以256 ^ 1,而在第二种情况下,仅将56乘以y 256 ^ 0。 OP的192.168.072将被解释为192.168.58.0而不是192.168.0.58。

– LarsH
2012年12月12日15:02



有点误导的是,地址为0的事实是第三个数字。考虑此地址192.168.1.56,三位数形式为192.168.312,因为1 * 256 ^ 1 + 56 * 256 ^ 0为312

– vesquam
2012-10-12 15:40

点仅用于描述应乘以256的幂的数字。解析器将查找第一个点,并将其前的数字乘以256 ^ 3。重复第二和第三点,但分别重复256 ^ 2和256 ^ 1。然后,它将所有结果加在一起(尽管结果相同,但有些隐含内容可能会保持运行总计)。如果这些点中的任何一个丢失,它只是不进行乘法运算,而只是将最终数字加到运行的总数中。这就是为什么1.2.3。导致错误,因为解析器找不到要添加到总数中的最后一个数字。

–贾斯汀·ᚅᚔᚈᚄᚒᚔ
2012年10月12日在16:26