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

Я использую 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? И может ли кто-нибудь объяснить, почему разница приведет к этой проблеме?

Ответ 1

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

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

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

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

Ответ 2

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

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

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

jekyll serve --host 0.0.0.0

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

http://host IP adress/4000