localhost
我想知道做出的 IP 地址的决定的起源是什么127.0.0.1
。 的“含义”是什么127
? 的“含义”是什么0.0.1
?
答案1
127 是子网掩码为 的 A 类网络中的最后一个网络号255.0.0.0
。127.0.0.1
是子网中第一个可分配地址。127.0.0.0
不能使用,因为那将是电线号。但是,使用任何其他数字作为主机部分应该可以正常工作,并恢复为使用127.0.0.1
。如果您愿意,可以通过 ping 亲自尝试127.1.1.1
。为什么他们等到最后一个网络号才实现这一点?我认为没有记录。
答案2
我能找到的关于 127 被分配为环回的最早记录是 1986 年 11 月RFC 990作者:Reynolds 和 Postel:
地址零应解释为“这个”,如“这个网络”。
例如,地址 0.0.0.37 可以被解释为该网络上的主机 37。
...
A 类网络号 127 被赋予了“环回”功能,也就是说,由更高级别协议发送到网络 127 地址的数据报应在主机内部环回。“发送”到网络 127 地址的数据报不应出现在任何网络上。
甚至早在 1981 年 9 月RFC 790其中,0 和 127 已经被保留:
000.rrr.rrr.rrr 保留 [JBP] ... 127.rrr.rrr.rrr 保留 [JBP]
到 1981 年,0 和 127 是唯一保留的 A 类网络。0 用于指向特定主机,因此剩下 127 用于环回。
我知道这不能回答问题,但这是我能找到的最远的地址了。为环回选择 1.0.0.0 可能更有意义,但这个地址已经分配给 BBN 分组无线电网络了。
答案3
互联网的设计者确实了解硬件的工作原理,并且他们在设计时就考虑了低级实现。
在 8 位汇编和机器语言编程中,值 0、127 和 255 很特殊,因为您可以使用一些“技巧”来测试这些值,并使用比其他整数执行速度更快的较小指令来分支到不同的代码。127 是最高有符号 8 位整数,因此将其增加 1 将导致有符号溢出。同样,增加 255 将导致无符号溢出。仅将值 0 加载到寄存器中通常会在芯片上设置零标志。想象一下网络程序在伪代码中如下所示:
if (value == 0) doLocal();
if (value == 127) doLoopback();
if (value == 255) doNetwork();
虽然这取决于芯片,但在当时,大多数芯片可以分别用 2 个字、3 个字和 3 个字(总共 8 个字)对这些测试进行编码,而且这些特定测试都可能在 1 个时钟周期内执行。使用任何其他值可能都需要 4 个字(总共 12 个字),代码大小增加 50%,执行时间也可能增加 50%。
答案4
如果您考虑一下本地主机或环回 IP 地址的含义,您就会意识到您永远不想在主机之外看到该地址或该地址所属的网络。(在主机内部,光线太暗,无法看到。向马克·吐温致歉。)
因此,必须有人选择一个 IP 网络来表示此本地主机地址。我不记得是谁首先选择了它,但它在定期作为“主机要求”发布的 IETF 征求意见稿中指定。
这件事发生的时间太久了,以至于当时还没有人想到“浪费”整个 A 类地址。
localhost 的实用性在于,您可以使用硬编码的 IP 地址与自己对话。早在域名系统出现之前,人们就已开始使用它。实际上,您可以使用 127.xxx 中的任何一个有效地址,但没有人这样做。您不能偷偷将 127 用作真实网络,因为“路由器要求”RFC 不允许在任何互联网上路由该网络。