Все главы учебника
Содержание учебника
Глава 11 / Linux

Сеть: имя, адрес, порт и ответ приложения

10 мин чтенияКонтент v0.10.0

Браузер сообщает, что страница не открывается. Разработчик сразу меняет код, но проблема может находиться раньше: имя не разрешилось, процесс слушает другой адрес или соединение запрещено. Начнём с локального сервиса, где можно контролировать каждую границу без внешнего аккаунта и платного сервера.

В предыдущих главах вы умеете запускать процессы и различать ошибки команды. Теперь свяжем приложение с сетевым адресом. Практика займёт около тридцати минут. Сервер читает только специально созданную папку и слушает loopback; мы не открываем доступ ко всему домашнему каталогу или интернету.

Адрес и порт

IP-адрес помогает доставить пакеты узлу, порт выбирает endpoint транспортного протокола. Процесс может слушать TCP8765, не принимая ничего на TCP80. Loopback127.0.0.1 означает текущую сетевую среду. В VM это сама VM; на хосте тот же адрес относится к хосту, а не автоматически к гостю.

Адрес 0.0.0.0 при привязке означает все подходящие IPv4-интерфейсы, а не «более удобный localhost». В этом курсе его не используем для учебного файлового сервера. Имя localhost может разрешаться также в IPv6 ::1; это отдельный адрес. Диагностика должна назвать, какой вариант действительно использовался.

Управляемый сервер

В первом терминале Ubuntu:

net_lab_dir=$(mktemp -d)
printf 'linux course\n' > "$net_lab_dir/index.html"
python3 -m http.server 8765 --bind 127.0.0.1 --directory "$net_lab_dir"

При успешном запуске приглашение не вернётся, а сервер напечатает адрес. Во втором терминале того же Linux-окружения:

curl --noproxy '*' -sS --connect-timeout 2 --max-time 5 http://127.0.0.1:8765/
curl --noproxy '*' -sS -D - -o /dev/null --max-time 5 http://127.0.0.1:8765/missing

Первый запрос вернёт linux course, второй — HTTP404 в headers. --noproxy '*' исключает настроенный proxy для этого локального опыта. Не отключайте proxy таким образом для любого внешнего адреса в корпоративной сети: это отдельная политика маршрута.

Ответ 404 означает, что сервер ответил по HTTP, но ресурс отсутствует. Curl без специальных флагов не обязан считать каждый HTTP404 ошибкой транспорта. При необходимости --fail меняет этот договор; выберите его сознательно, если скрипту нужен ненулевой статус для HTTP-ошибки.

Кто слушает

В Ubuntu проверьте:

ss -ltn
ip address
ip route

Ss показывает слушающие TCP-сокеты, ip — интерфейсы и маршруты. Найдите 127.0.0.1:8765 среди вывода. Сведения PID через ss -ltnp могут быть ограничены правами; не требуйте видеть чужие процессы. Имена интерфейсов, адреса и gateway зависят от VM/WSL и не должны совпасть с примером.

На macOS команды ip/ss могут отсутствовать. Это не доказательство сломанной сети: вы выполняете Linux-инструкцию на другом хосте. Для курса вернитесь в Ubuntu. Сами portable-команды curl и Python доступны во многих средах, но наблюдение ядра различается.

Если сервер пишет Address already in use, порт уже занят. Не уничтожайте неизвестного владельца. Выберите другой свободный учебный порт и измените обе curl-команды. Мы уже научились обращаться к своему PID; чужой процесс может принадлежать важному инструменту.

Отказ соединения и timeout

Остановите свой сервер Ctrl+C, затем повторите первый curl. На обычном loopback ожидается отказ соединения и ненулевой статус. Это другой результат, чем 404. Удалённый маршрут может молча отбрасывать пакеты и привести к timeout; отсутствие ответа не доказывает, что процесс вообще не запускался.

--connect-timeout ограничивает установление соединения по договору curl, --max-time — общую длительность операции. Не начинайте внешний опыт без предела ожидания. Ping проверяет иной тип обмена: успешный ping не доказывает HTTP, а блокировка ICMP не доказывает недоступность TCP.

DNS и защищённый канал

Для имени сеть сначала получает адрес. В Ubuntu getent ahosts example.com показывает результат системного разрешения; конкретные адреса меняются. Если доступ во внешнюю сеть есть, можно выполнить ограниченное чтение:

curl -I --connect-timeout 3 --max-time 10 https://example.com/

Здесь добавляется TLS: клиент проверяет защищённое соединение и сертификат. Ошибка имени, connect, проверки сертификата и HTTP-status — разные категории. Не используйте -k как привычное исправление TLS; оно скрывает часть проверки. Если сеть недоступна, локальная лаборатория всё равно позволяет завершить главу.

Самостоятельная лаборатория

Составьте таблицу трёх опытов: существующий ресурс, отсутствующий ресурс, остановленный сервер. Для каждого сохраните тело или headers, curl-status, наличие слушающего сокета и состояние своего процесса. Предскажите, что произойдёт, если curl выполнить на хосте, а сервер — внутри VM.

Критерии готовности: вы различаете HTTP404 и connect failure, знаете выбранный bind-адрес, не публикуете домашние файлы и не считаете любой localhost одним общим местом всех систем. После опыта сервер остановлен. Внешнее чтение — дополнительная проверка, а не обязательство купить подключение или облако.

Разбор

Живой сервер даёт 200 для index и 404 для отсутствующего пути; после остановки нет его слушающего сокета. На хосте 127.0.0.1 не гарантирует путь в VM: нужен предусмотренный платформой forwarding или гостевой адрес. В следующем уроке менеджер службы возьмёт на себя запуск и журналы, но эти сетевые границы сохранятся.

Первичные источники: Python http.server, curl manual, Linux ss, Ubuntu networking.