我正在使用兄弟打印机驱动程序设置我的 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(在我的默认终端中,而不是网络浏览器 @Kamil Maciorowski @TJ Crowder),然后选择“输入 IP 地址”进行连接。我最初没有包括这个,因为我主要想知道 IP 缩短是怎么回事。很抱歉这个缺失的信息!我很难为 ubuntu 下载打印机驱动程序,所以希望这可以帮助一些人!
前导零不是 IPv4 地址语法的标准部分,并且没有适用于所有系统的单一“简化”规则。有些人会完全拒绝这样的地址,这是有充分理由的。而那些没有的,有两种解释这些地址的方法。
零填充点分十进制在最早的 IPv4 文档中有些常见,现在您会发现各种应用程序和许多“嵌入式”系统(打印机、电视、烤面包机),它们只是为您提供一个固定大小
xxx.xxx.xxx.xxx
的零填充输入字段. 在那些系统中,008
只是十进制的 8。然而,在 PC 操作系统和基于 Linux 的设备上,许多程序使用几十年前从 BSD 系统继承的 IPv4 地址解析器,它接受不属于任何官方语法的几种变体。
在这个原始的 4.2BSD
inet_aton()
函数中,各个数字不必是十进制:它们也可以用八进制或十六进制指定,就像在 C 和其他各种编程语言中一样。如果数字以0x
十六进制开头,则为0
八进制。请记住,八进制只有数字 0-7,这意味着08
它不是有效数字(07 后跟 010)。所以你有两种不同的方法来处理带有前导零的地址,它们可能会产生完全不同的值。例如,如果您输入
011
,这意味着在认为它是零填充十进制的系统上为 11,但在认为它是八进制的系统上它变为 9。总结:如果系统强制您以这种方式输入地址,您通常可以假设它只是通过删除前导零来“简化”地址。但在任何其他情况下,不要使用前导零,因为它们可能会以不可预知的方式解释。
另见:https ://datatracker.ietf.org/doc/html/draft-main-ipaddr-text-rep-02
您正在考虑像字符串这样的 IPv4 地址,但事实并非如此。换句话说,您知道每个
.
字符之间通常有 3 个字符,因此您正试图遵守这一点。但是,它不是字符串;这是一个 4 字节的数字。3232235528
是编写您提供的 IPv4 地址的有效方法。这些.
是八位字节之间的逻辑分隔符,以使人类更容易破译。通过放置它们,您基本上将每个八位字节表示为一个 1 字节数,并将其放在每个.
字符之间。为了简化一点,您输入的是(
X << Y
左移运算符在哪里,表示将数字左移X
一位Y
):现在,我并不是说也许你是路由器的 Web GUI(只是作为一个随机示例)会采用它(一些 GUI 的需求八位字节分离),但作为一个有趣的练习,转到你的命令行(sh for linux, cmd for windows)并运行
这相当于打字
它被 ICMP 命令接受。
作为更多奖励事实,它可能会帮助您了解其背后的软件(因为您在计算机上所做的事情是用编程语言编写的,如果它不是在硬件级别完成的话)。从 StackOverflow 签出这个答案为什么 08 在 Java 中不是有效的整数文字?. 这个答案解释了一些编程语言将前导 0 解释为什么。C/C++ 也有这种行为。您可能会感兴趣的是,许多操作系统的使用都是用 C 编写的(至少,*nix 是,并且扩展名为 OSX)。
综上所述,我认为 user1686 有更明确的解释和历史(这可能更有用)。
“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 地址格式不正确,并重新将其解释为无法找到的主机名。您的打印机不使用此表示法,并将每个八位字节解释为十进制数。
其他答案很好地解释了 IP 地址作为文本输入的各种表示形式。但是您的打印机报告其 IP 的原因
192.168.000.008
很可能只是懒惰的编程。将数字格式化为文本时,假设固定数量的字符更简单。