В чем разница между 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