Почему локальный IP-адрес 127.0.0.1?

46054
Roee Adler

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

78
Мне тоже интересно об этом. Обратная петля IPv6 составляет 0: 0: 0: 0: 0: 0: 0: 1, что имеет смысл для меня. hyperslug 14 лет назад 2
Да, локальный хост IPv6 не вызывает много вопросов :) Roee Adler 14 лет назад 1
Я еще не видел дверного коврика типа «0: 0: 0: 0: 0: 0: 1»! William Hilsum 14 лет назад 21
@Wil: я буду твоим первым клиентом :) Roee Adler 14 лет назад 0
@ Сожмите это до "нет места, подобного :: 1", и вы получите немного больше бизнеса. new123456 12 лет назад 9
@WilliamHilsum расширите его до «Там нет места, как 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0001» и зарядите больше. Nick T 11 лет назад 6
Для интереса, в начале 2000 года я попытался переопределить localhost в виртуальной сети. Linux был очень рад, что 127.0.0.1/24 назначен на lo, как и BSD. Но попробуйте то же самое в окне Windows, и оно дуется, как только я набрал "127" в окне конфигурации сети. Был или win98 или winXP. Criggie 6 лет назад 0

6 ответов на вопрос

85
John T

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

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

Самое раннее упоминание, которое я могу найти относительно назначения 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.

22
Joseph Bui

Разработчики Интернета действительно знали, как работает аппаратное обеспечение, и они проектировали с учетом реализации на низком уровне.

Значения 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%.

Обратите внимание, что я использовал «слова», потому что старые машины тогда имели необычные размеры слов, но они часто все еще использовали 8-битную арифметику. За 8088 я бы сказал "байты". Joseph Bui 13 лет назад 1
5
kwe

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

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

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

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

4
kolypto

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

Почему это снова очевидно? Roee Adler 14 лет назад 25
Я считаю, что они просто выбрали что-то простое. Опять же, все "1" зарезервированы, поэтому был добавлен один ноль :) kolypto 14 лет назад 0
так почему не 10111111? :) или 11011111 или 11101111 или 11110111 или 11111011 или 11111101 или что-то в этом роде? Mushex Antaranian 14 лет назад 0
Нету. Попробуйте снова. Ardee Aram 10 лет назад 1
3
Dario Fumagalli

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

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

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

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

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

В конце:

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

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

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