Чому localhost 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 не викликає занадто багато питань :)
Roee Adler,

21
Я ще не бачив дверного коврика "Немає місця на зразок 0: 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. Ви можете спробувати самостійно, за допомогою pinging, 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 були єдиними зарезервованими мережами класу A до 1981 р. 0 використовувався для вказівки на конкретного хоста, так що 127 залишалося для зворотного зв'язку.

Я знаю, це не відповідає на питання, але це так далеко, як я міг копати. Можливо, було б більше сенсу вибрати 1.0.0.0 для циклічного зворотного зв'язку, але це вже було надано радіомережі BBN Packet.


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-адреса localhost або loopback, ви розумієте, що ніколи не хочете бачити цю адресу або мережу, до якої належить ця адреса, поза хостом. (Всередині господаря занадто темно, щоб його побачити. Вибачте перед Марком Твеном.)

Отже, комусь довелося вибрати мережу IP, щоб представити цю локальну адресу. Я не пригадую, хто вперше обрав це, але це вказано в Запиті на коментарі IETF, який періодично видається як "Вимоги до хоста".

Це було зроблено так давно, що ідея "витратити" цілу адресу класу А на той час не впадала нікому в голову.

Корисність localhost полягає в тому, що ви можете поговорити з собою, використовуючи жорстко закодовану IP-адресу. Він використовувався задовго до появи системи доменних імен. Ви фактично можете використовувати будь-яку з дійсних адрес 127.xxx, але ніхто ніколи цього не робить. Ви не можете прокрастись та використовувати 127 як справжню мережу, оскільки RFC "Вимоги до маршрутизатора" забороняє коли-небудь маршрутизувати цю мережу в будь-якому Інтернеті.


4

По-перше, весь діапазон 127.xxx вказує на ваш localhost.
127 у двійковій формі - "01111111". "11111111" = 255 і 0 зарезервовано, тому вибір очевидний :)


25
Як це знову очевидно?
Roee Adler

Я вважаю, що вони просто вибрали щось просте. Знову ж таки, всі "1" зарезервовані, тому один нуль було додано :)
kolypto

так чому б не 10111111? :) або 11011111 або 11101111 або 11110111 або 11111011 або 11111101 чи щось подібне?
Mushex Antaranian

1
Ні. Спробуйте ще раз.
Арді Арам

3

Тому що при створенні цих стандартів комп'ютери були повільними і зазвичай обмежувались 8-бітовими регістрами. Порівняння чисел із числами було дуже повільним, особливо якщо ці цифри доводилося вибирати із зворотного боку, то РЕАЛЬНО повільна пам'ять. Реєстри, тобто "CPU on board" зберігання, були набагато швидшими.

Більше того, ці старі комп'ютери мали спеціальні, більш швидкі вказівки щодо виявлення "рівного нулю", "відмінного від нуля", "від'ємного / позитивного цілого" (де знак був ... здогадайтеся, що, лівий біт, тепер бачите зв'язок із 127 , тобто число з усіма двійковими "1", крім крайнього лівого = знак?).

Тому це були спеціальні номери, оскільки вони дозволяли хитрістю програмування заощадити багато циклів процесора на часто виконуваних операціях.

Ви ніколи не бачите "IF CallerIP =" 0 ", але інструкцію" IF NotZero (CallerIP) ".

Ви можете ознайомитись із старовинними інструкціями щодо складання на кшталт "BEQ, BNE" (6502 процесорів) для більш довгих пояснень. Також перевірте цю сторінку .

Наприкінці:

0, 255 та 127 можна перевірити за допомогою однієї, найшвидшої, інструкції. Ще більш високі рівні мов, такі як C, мають "недостатні" функції порівняння, які компілятор може внутрішньо оптимізувати в одну інструкцію.

Програмісти років 70 і 80 справді створювали чудові архітектури із надмірно обмеженими ресурсами, за стандартами на зразок IP-нумерації багато думки та геніальності.


Чудова відповідь. Це дійсно найяскравіше і найрозумніше пояснення.
not2qubit

Насправді, тоді, коли був розроблений IP, і деякі початкові основи для нього були закладені, робота з даними в цілих кратних 8 біт не давалась. Багато архітектур у той час мали регістри та розміри слів у кратних, наприклад, 12 або 18 бітах. Це одна з причин того, що восьмигранник був настільки популярний у той час; 18 біт можна представити як 6 октальних цифр без втрат і без відходів; 12 біт - це 4 вісімкові цифри. Мікрокомп'ютери зазвичай працювали у 8-бітових кількостях, але лише набагато пізніше мікрокомп'ютери почали регулярно підключатися (особливо безпосередньо) до Інтернету.
CVn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.