我正在使用兄弟打印机驱动程序设置我的 Ubuntu,并尝试使用我的打印机的 IP 将我的电脑连接到打印机。
在我的打印机上,IP 地址是192.168.000.008
。因此我在设置中输入了该地址进行连接,但无济于事。
但是,当我输入时,192.168.0.8
它起作用了。我还可以连接localhost:192.168.0.8
到打印机设置服务器。
这是否意味着默认情况下,如果 IP 地址有,000
它会简化为0
?如果数字前面有零,008
它会简化为吗8
?
IP 地址的简化规则是什么?还有其他我遗漏的吗?如果我错了,那么为什么简化有效192.168.0.8
而192.168.000.008
没有?
更新:
我正在关注这里的教程:https://kbpdfstudio.qoppa.com/install-printer-driver-on-linux/
当我到达上述教程中的第 7 步时,我输入了 Y(在我的默认终端中,而不是 Web 浏览器 @Kamil Maciorowski @TJ Crowder),然后选择“输入 IP 地址”进行连接。我最初没有包括这个,因为我主要想知道 IP 缩短是怎么回事。很抱歉缺少这些信息!我在为 ubuntu 下载打印机驱动程序时遇到了困难,所以希望这能帮助一些人!
答案1
前导零是不是标准部件IPv4 地址语法,没有适用于所有系统的单一“简化”规则。有些系统会完全拒绝此类地址,这是有充分理由的。而那些没有这样做的系统则二解释这些地址的方法。
零填充的点分十进制在最早的 IPv4 文档中相当常见,如今您会发现各种应用程序和许多“嵌入式”系统(打印机、电视、烤面包机)都只为您提供xxx.xxx.xxx.xxx
带有零填充的固定大小输入字段。在这些系统中,008
只是十进制 8。
然而,在 PC 操作系统以及基于 Linux 的设备上,许多程序使用几十年前从 BSD 系统继承的 IPv4 地址解析器,它接受一些不属于任何官方语法的变体。
在这个原始的 4.2BSDinet_aton()
函数中,单个数字不必是十进制:它们也可以用八进制或十六进制指定,就像在 C 和其他各种编程语言中一样。如果数字以 开头,0x
则它是十六进制的,如果数字以 开头,0
则它是八进制的。请记住,八进制只有数字 0-7,这意味着08
不是有效数字(07 后面是 010)。
因此,您有两种不同的方法来处理以零开头的地址,它们可能会产生完全不同的值。例如,如果您输入011
,则在认为它是零填充十进制的系统上,它表示 11,但在认为它是八进制的系统上,它变为 9。
结论:如果系统军队以这种方式输入地址,通常可以假设它只是通过删除前导零来“简化”地址。但在任何其他情况下,不要使用前导零,因为它们可能以不可预测的方式被解释。
也可以看看:https://datatracker.ietf.org/doc/html/draft-main-ipaddr-text-rep-02
答案2
您正在考虑将 IPv4 地址视为字符串,但事实并非如此。换句话说,您知道每个.
字符之间通常有 3 个字符,因此您尝试遵守这一点。但是,它不是字符串;它是一个 4 字节数字。3232235528
是编写您提供的 IPv4 地址的有效方法。.
八位字节之间有逻辑分隔符,以便于人类解读。通过放置它们,您基本上将每个八位字节表示为 1 字节数字,并将其放在每个字符之间.
。
为了稍微简化一下,您输入的内容是(其中X << Y
是左移运算符,表示将数字X
按位向左移动Y
):
192<< 24 +168<< 16 +0<< 8 +8<< 0 = 3232235528
现在,我并不是说也许你的路由器的 Web GUI(只是作为一个随机的例子)会接受这一点(一些 GUI 要求八位字节分离),但作为一个有趣的练习,转到你的命令行(linux 为 sh,windows 为 cmd)并运行
ping 2130706433。
这相当于输入
ping 127.0.0.1
并被ICMP命令接受。
作为额外的事实,它可能会帮助你了解其背后的软件(因为如果你在计算机上做的事情不是在硬件层面上完成的,那么它就是用编程语言编写的)。查看 StackOverflow 上的这个答案为什么 08 在 Java 中不是有效的整数文字?。这个答案解释了一些编程语言将前导 0 解释为什么。C/C++ 也有这种行为。您可能有兴趣知道很多操作系统都是用 C 编写的(至少 *nix 是,OSX 也是)。
尽管如此,我认为用户 1686 有更明确的解释和历史(可能更有用)。
答案3
像“192.168.0.8”这样的值不是 IP 地址。它是一个表示IP 地址。实际的 IP 地址只是一个 32 位整数,例如 3232235528 或 0xC0A80008。但这对于人类来说有点难以记住,也很难与其他 IP 地址进行比较,因此每当计算机向人类显示这样的地址时,它都会使用所谓的“点分十进制”表示法。该数字被分解为“八位字节”(字节),每个字节都表示为一个整数。您可以通过在 shell 中输入“ping 3232235528”或“ping 0xC0A80008”来确认这一点。
重要的是要认识到,点分十进制表示法中的每个数字都只是一个数字。从数学上讲,8 = 008 = 8.000 = 008.000。
“ping 192.168.000.008”失败的原因与 ping 如何解释地址有关。我知道我上面说过“8 = 008”,但对于 ping 实用程序来说,这并不完全正确。从历史上看,在十六进制出现之前,任何想要做任何涉及二进制的事情的人都会使用二进制数的八进制表示。早期的程序员没有意识到这会导致什么样的问题,他们建立了一个惯例,即任何以零开头的数字都是八进制数,而不是十进制数。无论好坏,ping 仍然尊重这种表示法。该实用程序看到最后一个八位字节是“008”,试图将其解释为八进制数,但失败了(因为八进制数只使用从 0 到 7 的数字),因此认为整个 IP 地址格式不正确,并转而将其解释为主机名,但找不到主机名。您的打印机不使用这种符号,而是将每个八位字节解释为十进制数。
答案4
其他答案很好地解释了 IP 地址作为文本输入的各种表示形式。但您的打印机报告其 IP 的原因192.168.000.008
很可能只是懒惰的编程。将数字格式化为文本时,假设字符数固定会更简单。