我想知道做出localhost
IP地址决定的根源是什么127.0.0.1
。的“含义”是127
什么?的“含义”是0.0.1
什么?
我想知道做出localhost
IP地址决定的根源是什么127.0.0.1
。的“含义”是127
什么?的“含义”是0.0.1
什么?
Answers:
127是子网掩码为的A类网络中的最后一个网络号255.0.0.0
。127.0.0.1
是子网中的第一个可分配地址。127.0.0.0
不能使用,因为那是线号。但是将其他任何数字用作主机部分应该可以正常工作,并恢复为using 127.0.0.1
。如果需要,可以通过ping自己尝试一下127.1.1.1
。他们为什么要等到最后一个网络号码来实现此目的?我认为没有记录在案。
最早提及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分组无线网络。
互联网的设计师真的知道硬件的工作原理,并且在设计时考虑了底层的实现。
值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%。
如果考虑本地主机或环回IP地址的含义,您将意识到自己永远不想在主机外部看到该地址或该地址所属的网络。(在主持人里面,太黑了,看不到它。向马克·吐温道歉。)
因此,必须有人选择一个IP网络来表示此本地主机地址。我不记得是谁首先选择了它,但是它在IETF请求注释中指定,该请求会定期发布为“主机要求”。
这项工作已经进行了很长时间,以至于当时“浪费”整个A类地址的想法并没有引起任何人的注意。
localhost的实用程序是您可以使用硬编码的IP地址与您自己交谈。它早在域名系统出现之前就已使用。您实际上可以使用127.xxx个有效地址中的任何一个,但从未有人使用过。您不能偷偷地将127用作真实网络,因为“路由器要求” RFC禁止在任何Internet上路由该网络。
首先,整个127.xxx范围都指向您的本地主机。
二进制127是“ 01111111”。“ 11111111” = 255和0保留,因此选择很明显:)
因为创建这些标准时,计算机速度很慢,通常仅限于8位寄存器。将数字与数字进行比较非常慢,特别是如果必须从后面读取这些数字,则存储速度会非常慢。寄存器,即“板载CPU”的存储速度更快。
此外,那些旧计算机具有特殊的,更快的指令来检测“等于零”,“不同于零”,“负/正整数”(其中的符号是……猜出什么,最左边的位,现在看到与127的连接) ,即除最左边的=号外,所有二进制均为“ 1”的数字)。
因此,这些是特殊的数字,因为它们允许编程技巧在频繁执行的操作上节省大量CPU周期。
您将永远不会看到“ IF CallerIP =“ 0”,而只会看到“ IF NotZero(CallerIP)”指令。
您可以查看古老的汇编说明,例如“ BEQ,BNE”(6502 CPU)以获取更多说明。还要检查此页面。
到底:
0、255和127都可以用一条最快的指令进行检查。甚至像C这样的高级语言也具有“ shortuct”比较功能,编译器可以在内部将这些功能优化为一条指令。
70年代和80年代的程序员确实生产了具有稀缺资源的宏伟架构,而在IP编号等标准背后,却有很多思想和天才。