为什么是localhost IP 127.0.0.1?


85

我想知道做出localhostIP地址决定的根源是什么127.0.0.1。的“含义”是127什么?的“含义”是0.0.1什么?


2
我对此也很好奇。IPv6环回为0:0:0:0:0:0:0:1,这对我来说很有意义。
hyperslug

1
是的,IPv6的本地主机不会引发太多问题:)
Roee Adler,2009年

21
我还没有看到“没有像0:0:0:0:0:0:0:0:1这样的地方”门垫!
William Hilsum

9
@Wil将其压缩到“没有像:: 1这样的地方”,您将获得更多的业务。
new123456 2011年

6
@WilliamHilsum将其扩展为“没有像0000:0000:0000:0000:0000:0000:0000:0000:0001这样的地方”并收取更多费用。
Nick T

Answers:


87

127是子网掩码为的A类网络中的最后一个网络号255.0.0.0127.0.0.1是子网中的第一个可分配地址。127.0.0.0不能使用,因为那是线号。但是将其他任何数字用作主机部分应该可以正常工作,并恢复为using 127.0.0.1。如果需要,可以通过ping自己尝试一下127.1.1.1。他们为什么要等到最后一个网络号码来实现此目的?我认为没有记录在案。


14
我会看到他们任意选择127的唯一原因是,这是一个容易记住的数字(01111111),也许他们允许1600万个主机地址仅用于与自身及其自身进行通信(例如某些程序和Windows组件的使用方式)如今的港口)。RFC仅真正提到将127.0.0.1/32用作环回的标准做法。除了循环返回到主机并且从不访问网络之外,关于它们对其余块的预期还很模糊,因此我的猜测是。
RoyalKnight

2
将所有块地址恢复为127.0.0.1取决于实现,并且可能只是Linux堆栈的特性。Solaris至少要求将接口绑定到目标地址,才能使ping测试成功。
jlliagre 2011年

56

最早提及127的任务是回送,是雷诺和Postel 于1986年11月发表的RFC 990

如在“此网络”中一样,地址零将被解释为“此”的含义。

例如,地址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]

0和127是1981年唯一保留的A类网络。0用于指向特定主机,因此保留127用于回送。

我知道这并不能回答问题,但这可以追溯到我能追溯的最远。选择1.0.0.0进行环回可能更有意义,但这已经提供给BBN分组无线网络。


23

互联网的设计师真的知道硬件的工作原理,并且在设计时考虑了底层的实现。

值0、127和255在8位汇编和机器语言编程中是特殊的,因为可以使用“技巧”来测试这些值,并使用比其他整数执行得更快的较小指令来分支到不同的代码。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%。


1
请注意,我之所以使用“字”,是因为那时的旧机器具有不寻常的字长,但是它们仍然经常使用8位算术。对于8088,我会说“字节”。
Joseph Bui

5

如果考虑本地主机或环回IP地址的含义,您将意识到自己永远不想在主机外部看到该地址或该地址所属的网络。(在主持人里面,太黑了,看不到它。向马克·吐温道歉。)

因此,必须有人选择一个IP网络来表示此本地主机地址。我不记得是谁首先选择了它,但是它在IETF请求注释中指定,该请求会定期发布为“主机要求”。

这项工作已经进行了很长时间,以至于当时“浪费”整个A类地址的想法并没有引起任何人的注意。

localhost的实用程序是您可以使用硬编码的IP地址与您自己交谈。它早在域名系统出现之前就已使用。您实际上可以使用127.xxx个有效地址中的任何一个,但从未有人使用过。您不能偷偷地将127用作真实网络,因为“路由器要求” RFC禁止在任何Internet上路由该网络。


4

首先,整个127.xxx范围都指向您的本地主机。
二进制127是“ 01111111”。“ 11111111” = 255和0保留,因此选择很明显:)


25
怎么又变得显而易见了?
罗伊·阿德勒

我相信他们只是选择了一些简单的方法。同样,所有“ 1”
均被

那为什么不10111111?:)或11011111或11101111或11110111或11111011或11111101或类似的东西?
Mushex Antaranian

1
不。再试一次。
Ardee Aram 2013年

3

因为创建这些标准时,计算机速度很慢,通常仅限于8位寄存器。将数字与数字进行比较非常慢,特别是如果必须从后面读取这些数字,则存储速度会非常慢。寄存器,即“板载CPU”的存储速度更快。

此外,那些旧计算机具有特殊的,更快的指令来检测“等于零”,“不同于零”,“负/正整数”(其中的符号是……猜出什么,最左边的位,现在看到与127的连接) ,即除最左边的=号外,所有二进制均为“ 1”的数字)。

因此,这些是特殊的数字,因为它们允许编程技巧在频繁执行的操作上节省大量CPU周期。

您将永远不会看到“ IF CallerIP =“ 0”,而只会看到“ IF NotZero(CallerIP)”指令。

您可以查看古老的汇编说明,例如“ BEQ,BNE”(6502 CPU)以获取更多说明。还要检查此页面

到底:

0、255和127都可以用一条最快的指令进行检查。甚至像C这样的高级语言也具有“ shortuct”比较功能,编译器可以在内部将这些功能优化为一条指令。

70年代和80年代的程序员确实生产了具有稀缺资源的宏伟架构,而在IP编号等标准背后,却有很多思想和天才。


好答案。这确实是最清晰,最明智的解释。
not2qubit

实际上,早在IP设计之初,就已经奠定了IP的一些早期基础,但还没有处理8位整数倍的数据。例如,当时的许多体系结构的寄存器和字长都是12或18位的倍数。这就是八进制在当时如此受欢迎的原因之一;18位可以精确地表示为8个八进制数字,并且不会造成丢失和浪费;12位是4个八进制数字。微型计算机通常工作在8位数量,但它只是多少晚些时候微型计算机开始被定期连接(尤其是直接)连接到因特网。
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.