80

Я задавался вопросом, каково происхождение решения сделать IP-адрес localhost 127.0.0.1 . Что такое "значение" 127? что означает значение 0.0.1?

6 ответов6

86

127 - это последний номер сети в сети класса A с маской подсети 255.0.0.0 . 127.0.0.1 - первый назначаемый адрес в подсети. 127.0.0.0 нельзя использовать, потому что это будет номер провода. Но использование любых других номеров для части хоста должно работать нормально и вернуться к использованию 127.0.0.1 . Вы можете попробовать это сами, 127.1.1.1 если хотите. Почему они ждали до последнего номера сети, чтобы реализовать это? Я не думаю, что это задокументировано.

56

Самое раннее упоминание, которое я могу найти относительно назначения 127 как петли, - ноябрь 1986 RFC 990, созданный Рейнольдсом и Постелом:

Нулевой адрес следует интерпретировать как означающий "это", как в "этой сети".

Например, адрес 0.0.0.37 может быть интерпретирован как означающий хост 37 в этой сети.

...

Сетевой номер 127 класса А назначается функцией "обратной связи", то есть дейтаграмма, отправляемая по протоколу более высокого уровня на адрес сети 127, должна зацикливаться внутри хоста. Ни одна датаграмма, "отправленная" на сетевой адрес 127, никогда не должна появляться ни в одной сети.

Еще в сентябре 1981 года RFC 790, 0 и 127 уже были зарезервированы:

000.rrr.rrr.rrr                 Reserved                     [JBP]
...
127.rrr.rrr.rrr                 Reserved                     [JBP]

0 и 127 были единственными зарезервированными сетями класса А к 1981 году. 0 использовался для указания на конкретный хост, поэтому оставалось 127 для обратной петли.

Я знаю, что это не отвечает на вопрос, но это так далеко, как я мог копать. Возможно, было бы более целесообразно выбрать 1.0.0.0 для обратной связи, но это уже было передано BBN Packet Radio Network.

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%.

5

Если вы думаете о том, что означает локальный или петлевой IP-адрес, вы понимаете, что никогда не хотите видеть этот адрес или сеть, к которой принадлежит этот адрес, за пределами хоста. (Внутри хозяина слишком темно, чтобы увидеть это. Извинения Марку Твену.)

Итак, кто-то должен был выбрать IP-сеть для представления этого адреса локального хоста. Я не помню, кто первым выбрал его, но он указан в Запросе комментариев IETF, который периодически выдается как "Требования к хосту".

Это было сделано так давно, что идея "тратить" весь адрес класса А в то время никому не приходила в голову.

Утилита localhost заключается в том, что вы можете общаться с самим собой, используя жестко запрограммированный IP-адрес. Он использовался задолго до появления системы доменных имен. На самом деле вы можете использовать любой из действительных адресов 127.xxx, но никто этого не сделает. Вы не можете красться и использовать 127 в качестве реальной сети, потому что RFC "Требования к маршрутизатору" запрещает когда-либо маршрутизировать эту сеть в любом Интернете.

4

Во-первых, весь диапазон 127.xxx указывает на ваш локальный хост.
127 в двоичном виде это "01111111". "11111111" = 255 и 0 зарезервированы, поэтому выбор очевиден :)

3

Потому что, когда эти стандарты были созданы, компьютеры работали медленно и обычно ограничивались 8-битными регистрами. Сравнение чисел с числами было очень медленным, особенно если эти числа нужно было извлечь из спины, тогда ДЕЙСТВИТЕЛЬНО медленная память. Регистрируется, то есть память "CPU on board" была намного быстрее.

Более того, у этих старых компьютеров были специальные, более быстрые инструкции для определения "равно нулю", "отличается от нуля", «отрицательное / положительное целое число» (где знак был ... угадайте, какой самый левый бит теперь видит связь с 127 это число со всеми двоичными числами "1", кроме крайнего левого знака «=»?).

Поэтому это были специальные числа, потому что они позволяли программировать хитрость, чтобы сэкономить много циклов ЦП на часто выполняемых операциях.

Вы никогда не увидите команду «IF CallerIP =" 0 ", а только инструкцию« IF NotZero(CallerIP)».

Вы можете проверить древние инструкции по сборке, такие как «BEQ, BNE» (6502 ЦП) для более подробных объяснений. Также проверьте эту страницу.

В конце:

0, 255 и 127 можно проверить с помощью одной самой быстрой инструкции. Еще более высокоуровневые языки, такие как C, имеют функции сравнения "shortuct", которые компилятор может внутренне оптимизировать в одну инструкцию.

Программисты 70 и 80 лет действительно создавали великолепные архитектуры с супер дефицитными ресурсами, за такими стандартами, как IP-нумерация, много мыслей и гениальности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .