
Мне было интересно, каково происхождение решения сделать 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 г.RFC990авторы Рейнольдс и Постел:
Нулевой адрес следует интерпретировать как «это», например, «эта сеть».
Например, адрес 0.0.0.37 можно интерпретировать как хост 37 в этой сети.
...
Сетевому номеру класса A 127 назначена функция «loopback», то есть датаграмма, отправленная протоколом более высокого уровня на адрес сети 127, должна вернуться обратно внутрь хоста. Никакая датаграмма, «отправленная» на адрес сети 127, не должна появляться ни в какой сети где бы то ни было.
Еще в сентябре 1981 г.RFC790, 0 и 127 уже зарезервированы:
000.rrr.rrr.rrr Зарезервировано [JBP] ... 127.rrr.rrr.rrr Зарезервировано [JBP]
К 1981 году единственными зарезервированными сетями класса A были 0 и 127. 0 использовался для указания на конкретный хост, поэтому 127 оставался для обратной связи.
Я знаю, что это не ответ на вопрос, но это самое далекое, что я смог выкопать. Возможно, было бы разумнее выбрать 1.0.0.0 для loopback, но он уже был предоставлен BBN Packet Radio Network.
решение3
Разработчики Интернета действительно знали, как работает аппаратное обеспечение, и при проектировании учитывали низкоуровневую реализацию.
Значения 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%-ное увеличение времени выполнения.
решение4
Если вы задумаетесь о том, что означает локальный хост или петлевой IP-адрес, вы поймете, что вы никогда не захотите видеть этот адрес или сеть, к которой этот адрес принадлежит, за пределами хоста. (Внутри хоста слишком темно, чтобы его увидеть. Приношу извинения Марку Твену.)
Итак, кто-то должен был выбрать IP-сеть для представления этого адреса localhost. Я не помню, кто первым это выбрал, но это указано в запросе IETF на комментарии, который периодически выпускается как «Требования к хосту».
Это было сделано так давно, что идея «потратить впустую» целый адрес класса А в то время никому не приходила в голову.
Удобство localhost в том, что вы можете общаться с самим собой, используя жестко закодированный IP-адрес. Он использовался задолго до появления системы доменных имен. На самом деле вы могли бы использовать любой из допустимых адресов 127.xxx, но никто этого не делает. Вы не можете пробраться и использовать 127 как настоящую сеть, поскольку RFC «Требования к маршрутизатору» запрещает маршрутизацию этой сети в любом интернете.