Почему локальный 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 не вызывает много вопросов :)
Роу Адлер
21
Я еще не видел коврик "0: 0: 0: 0: 0: 0: 1"!
Уильям Хилсум
9
@ Сожмите это до "нет места, подобного :: 1", и вы получите немного больше бизнеса.
new123456
6
@WilliamHilsum расширите его до «Там нет места, как 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0001» и зарядите больше.
Ник Т

Ответы:

87

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

Джон Т
источник
14
Единственные причины, по которым я вижу, что они произвольно выбирают 127, заключаются в том, что этот номер легко запомнить (01111111), и, возможно, они разрешают 16 миллионам адресов хоста для связи только с самим собой (например, как некоторые программы и компоненты Windows используют). порты в наше время). RFC только действительно упомянули, что это стандартная практика для 127.0.0.1/32, которая будет использоваться для обратной связи. Это довольно туманно в отношении того, что они предназначали для остальной части блока, за исключением того, что он возвращается к хосту и никогда не попадает в сеть, отсюда мое предположение выше.
RoyalKnight
2
Возврат всех адресов блоков к 127.0.0.1 зависит от реализации и, возможно, может быть просто особенностью стека Linux. По крайней мере, Solaris требует, чтобы интерфейс был привязан к адресу назначения для успешного выполнения теста ping.
Jlliagre
56

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

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

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

...

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

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

000.rrr.rrr.rrr Зарезервировано [JBP]
...
127.rrr.rrr.rrr Зарезервировано [JBP]

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

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

hyperslug
источник
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 я бы сказал "байты".
Джозеф Буй
5

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

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

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

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

KWE
источник
4

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

kolypto
источник
25
Почему это снова очевидно?
Роуи Адлер
Я считаю, что они просто выбрали что-то простое. Опять же, все "1" зарезервированы, поэтому был добавлен один ноль :)
kolypto
так почему не 10111111? :) или 11011111 или 11101111 или 11110111 или 11111011 или 11111101 или что-то в этом роде?
Mushex Antaranian
1
Нет. Попробуйте еще раз.
Арди Арам
4

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

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

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

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

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

В конце:

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

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

Дарио Фумагалли
источник
Отличный ответ. Это действительно самое ясное и разумное объяснение.
not2qubit
На самом деле, когда проектировался IP и были заложены некоторые ранние основы, работа с данными в целых числах, кратных 8 битам, не была данностью. Например, многие архитектуры в то время имели регистры и размеры слов, кратные 12 или 18 битам. Это одна из причин, почему восьмеричное было так популярно в то время; 18 бит могут быть представлены как ровно 6 восьмеричных цифр без потерь и без потерь; 12 бит - это 4 восьмеричные цифры. Микрокомпьютеры обычно работали в 8-битных количествах, но только намного позже микрокомпьютеры начали регулярно подключаться (особенно напрямую) к Интернету.
CVn