Вопрос или проблема
Когда я выполняю ip address show
, я вижу, что сетевой интерфейс обратной петли имеет назначенный адрес 127.0.0.1/8
.
Это означает, что если я хочу использовать сетевой интерфейс обратной петли, я могу запустить npx http-server -a 127.X.X.X
, потому что суффикс /8
подразумевает, что для использования интерфейса обратной петли я могу использовать любой IP-адрес, который начинается с 127
. Например: npx http-server -a 127.4.7.1
.
ip address show
также показывает, что сетевой интерфейс, называемый enp0s3
, имеет назначенный адрес 10.0.2.15/24
.
Однако, когда я пытаюсь использовать адрес, который не назначен, возникает ошибка. Например, npx http-server -a 10.0.2.16
возвращает ошибку:
Error: listen EADDRNOTAVAIL: address not available
Почему адрес 10.0.2.16 “недоступен”?
Что я должен сделать, чтобы иметь возможность использовать 10.0.2.16, когда назначен только 10.0.2.15, подобно 127.4.7.1
?
Вы серьезно неправильно понимаете роль сетевой маски.
Вы можете прослушивать адреса, привязанные к локальным интерфейсам. Сетевые маски показывают стеку TCP/IP, какие адреса являются локальными, а какие доступны только через маршрутизатор. Чтобы слушать IP, его необходимо назначить интерфейсу.
lo
и 127.0.0.0/8
являются особенными, потому что зарезервированы для использования в качестве обратной петли.
Ответ или решение
Когда возникает ошибка EADDRNOTAVAIL при использовании команды npx http-server
с неназначенным IP-адресом, необходимо углубленно разобраться в том, как взаимодействуют IP-адреса с сетевыми интерфейсами. В описанной ситуации необходимо обратить особое внимание на роль сетевой маски и назначение IP-адресов.
Теория
Сетевая маска играет ключевую роль в определении, какие IP-адреса считаются "местными" (то есть, могут быть использованы на локальном устройстве) и какие доступны только через маршрутизатор. Когда вы видите сетевую маску, такую как /8
для 127.0.0.0
, это означает, что все адреса в диапазоне от 127.0.0.0
до 127.255.255.255
предназначены для петлевого интерфейса (loopback). Они могут использоваться для соединения с вашим собственным компьютером без взаимодействия с внешними сетью интерфейсами или маршрутизаторами.
Однако с сетью 10.0.2.0/24
, к которой относится интерфейс enp0s3
, ситуация отличается. Эта маска позволяет использовать только адреса в диапазоне от 10.0.2.0
до 10.0.2.255
для локальных соединений, при этом под "локальными" понимаются адреса, назначенные конкретно этому интерфейсу. В вашем случае, интерфейсу назначен только IP-адрес 10.0.2.15
. Чтобы использовать другой адрес в диапазоне, например, 10.0.2.16
, необходимо непосредственно назначить его интерфейсу.
Пример
Когда вы пытаетесь запустить сервер на адресе 127.4.7.1
, вы можете это сделать, так как все адреса в диапазоне 127.0.0.0/8
автоматически считаются доступными для локального использования благодаря их петлевому назначению. Однако, когда вы пытаетесь использовать 10.0.2.16
, возникает ошибка, так как этот адрес не привязан к интерфейсу enp0s3
.
Применение
Чтобы исправить эту ситуацию и использовать адрес 10.0.2.16
, вам нужно его добавить на сетевой интерфейс. Это можно сделать с помощью команды:
sudo ip addr add 10.0.2.16/24 dev enp0s3
После этого IP-адрес 10.0.2.16
будет назначен интерфейсу и станет доступным для использования сервером. Не забудьте, что для выполнения этих действий могут понадобиться права суперпользователя.
Таким образом, понимание того, как сетевые маски и IP-адреса взаимодействуют с интерфейсами, позволяет корректно назначать и использовать IP-адреса в вашей локальной сети или системе.