卷曲那些有趣的IPv4地址

2021-04-19 22:17:34

每个人都知道,在大多数系统上,您可以指定IPv4地址只有4个十进制数,其中包含周期(点)。例子:

当您例如想要ping本地WiFi路由器和类似时有用。 “ping 192.168.0.1”

IPv4字符串通常由INET_ADDR()函数解析,或者有时它将其直接传递给GetAddrinfo()等名称解析器函数。

此地址解析器支持更多方法来指定地址。您可以例如使用八进制或十六进制指定每个数字。

IPv4地址是32位编号,当写入4个单独的数字时,在4个部分中拆分,每个数字中表示8位。 “a.b.c.d”中的每个单独编号是8位,组合整个32位。有时四个部分被称为四边形。

但是,典型的IPv4地址解析器处理了比仅仅4路分裂更多的方式。当指定为一个,两个或三个数字时,它也可以处理地址(除非仅为一点)。

如果作为单个号码给出,它将其视为单个无符号32位数。最顶层八位的八位存储我们“通常”的写入作为第一个数字等。如上所示的地址,如果我们将其保留为十六进制将成为:

如果您在介于两者之间将IP地址写入两个数字,则假设第一个数字为8位,下一个数字为24位。当您看起来像你看,你可以继续混合基地。同样的地址再次,现在在十六进制+八进制组合中:

当24位数包含很多零时,这允许一些有趣的快捷方式。就像你可以缩短“127.0.0.1”到“127.1”,它仍然有效,是完全合法的。

现在,这些部件应该以这样的比例分成:8.8.16。这是八进制,十六进制和十进制中再次的示例地址:

如上所述的所有这些版本都使用大多数工具接受IPv4地址,有时您可以通过切换到另一种格式来绕过滤波器和保护系统,以便您不匹配过滤器。它以前在节点和Perl包中造成了问题,我猜测了许多其他人。这是一个经常忘记,忽略或刚知的功能。

它乞求为什么这个非常自由主义的支持曾被添加和允许的原因,但我无法弄清楚 - 也许是因为它如何与A / B / C网络匹配。对此语法的支持似乎已在1983年的4.2BSD发布中引入INEt_Aton()函数。

URL中有一个主机名,可以指定为IPv4地址。

RFC 3986 URL规范的第3.2.2节表示IPv4地址必须指定为:

...但实际上,很少有人接受此类URL的客户实际上将地址限制为该格式。我相信主要是因为许多程序将在主机名上传递给名称解析功能,本身将处理其他格式。

本规范的主机解析部分允许IPv4地址的许多变体。 (如果您与我一样,您可能需要在明确之前读取该规范部分左右三次左右)。

由于浏览器所有遵循此规范,因此浏览器因此允许所有允许这种IP号码在他们处理的URL中。

传统上卷曲在营地中,主要是意外地支持的“灵活”IPv4地址格式。它做到了这一点,因为如果你建立了使用系统解析器函数(默认情况下的卷曲),那么这些系统功能将处理这些格式的卷曲。如果建立卷曲以使用C-ARES(这是卷曲的可选名称解析程序后端之一),则使用此类地址格式刚刚使传输失败。

缺点允许系统解析器函数来处理格式的卷曲是卷曲本身与原始格式的主机名一起工作,因此HTTPS服务器证书验证和发送主机如HTTP中的标题并不真正正常工作。

从卷曲7.77.0开始(由于此提交)卷曲将“本身”了解这些IPv4格式并将其归一化其本身。

16843009将标准化为1.1.1.1,然后将其用作http://1.1.1(因为在使用方案时卷曲将假定此URL),其中返回301重定向到https://1.1.1.1/ -l让卷曲跟随......