npx http-server возвращает EADDRNOTAVAIL для несуществующего IP-адреса.

Вопрос или проблема

Когда я выполняю 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-адреса в вашей локальной сети или системе.

Оцените материал
Добавить комментарий

Капча загружается...