В чем разница между 0.0.0.0, 127.0.0.1 и localhost?

271

Я использую Jekyllи Vagrantна моем Mac. Я обнаружил, что Jekyll serverбудет связывать 0.0.0.0:4000вместо 127.0.0.1:4000. Также gem serverбудет привязан к этому адресу по умолчанию. Я все еще могу посетить его через http://localhost:port. Но Jekyll, похоже, для настройки по умолчанию (например, 0.0.0.0:4000) требуется доступ в Интернет. Я не могу работать Jekyll serverбез Интернета. Это небольшая ошибка?

Я тоже пользуюсь Vagrant. Я установил переадресацию портов (8080 => 4000) в Vagrantfile, так как я устанавливаю Jekyllна Vagrantвиртуальную машину и тестирую ее под Macintosh. Если я использую настройку по умолчанию (0.0.0.0:4000), это работает. Я могу посетить это из моего сафари с http://localhost:8080. Но если нет интернета, я не могу привязаться к 0.0.0.0:4000. Вместо этого я использую jekyll server -H 127.0.0.1сервис привязки к сервису 127.0.0.1:4000, тогда я не могу посетить его через http://localhost:8080.

Кто-нибудь может объяснить разницу между 0.0.0.0, 127.0.0.1 и localhost ? И кто-нибудь может объяснить, почему разница вызовет эту проблему ?

Ciel
источник
Эта статья может быть полезной howtogeek.com/225487/…
fangxing

Ответы:

408

127.0.0.1обычно это IP-адрес, назначенный «петлевому» или локальному интерфейсу. Это «фальшивый» сетевой адаптер, который может общаться только внутри одного хоста. Он часто используется, когда вы хотите, чтобы сетевое приложение обслуживало клиентов только на одном хосте. Процесс, который прослушивает 127.0.0.1соединения, будет получать только локальные соединения на этом сокете.

«localhost» обычно является именем хоста для 127.0.0.1IP-адреса. Обычно он устанавливается в /etc/hosts(или эквивалент Windows с именем «hosts» где-то под %WINDIR%). Вы можете использовать его так же, как и любое другое имя хоста - попробуйте "ping localhost", чтобы увидеть, как оно разрешается 127.0.0.1.

0.0.0.0имеет несколько разных значений, но в этом контексте, когда серверу предписано прослушивать, 0.0.0.0это означает «прослушивать каждый доступный сетевой интерфейс». Адаптер обратной связи с IP-адресом 127.0.0.1с точки зрения серверного процесса выглядит так же, как и любой другой сетевой адаптер на машине, поэтому сервер, 0.0.0.0которому необходимо прослушивать, также будет принимать соединения через этот интерфейс.

Надеюсь, это ответит на ваш вопрос по поводу IP. Я не знаком с Jekyll или Vagrant, но я предполагаю, что переадресация портов 8080 => 4000каким-то образом связана с конкретным сетевым адаптером, поэтому при локальном подключении к127.0.0.1

Капитан педантик
источник
Хм, ping localhostкажется, работает на Windows , даже без хозяев файла , указывающей 127.0.0.1на localhost.
Pacerier
Согласитесь с Pacerier. По крайней мере, в Windows localhost ведет себя как 0.0.0.0 (не 127.0.0.1) по умолчанию
drodsou
5
«Это в основном правильно, за исключением вашего описания привязки к 0.0.0.0. Это не привязка к каждому доступному сетевому интерфейсу, как вы описали, а привязка ко всем адресам . В стеках TCP это называется INADDR_ANY - из удаленного ответа» @strangemonad.
Петр Доброгост
15

В текущей версии Jekyll по умолчанию используется http://127.0.0.1:4000/ .
Это хорошо, если вы подключены к сети, но не хотите, чтобы кто-либо другой имел доступ к вашему приложению.

Однако может случиться так, что вы захотите увидеть, как ваше приложение работает на мобильном телефоне или на другом ноутбуке / компьютере.

В этом случае вы можете использовать

jekyll serve --host 0.0.0.0

Это привязывает ваше приложение к хосту и последующему использованию для подключения к нему с другого хоста

http://host's IP adress/4000 
Саньям Джайн
источник