← назад к разделу

Вы нажимаете «Оформить», страница крутит спиннер и показывает «Что-то пошло не так». Разработчик открывает логи сервиса — там пусто: запроса не было. Дефект заведён на оплату, а встало всё на шаг раньше.

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

браузер DNS сервер 10.2.14.7:443 какой адрес у shop.test? 10.2.14.7 TCP :443 — рукопожатие канал открыт GET /orders/42 200 · список заказов в «Сети»: строка со статусом 200 TCP :443 — пакеты уходят ответа нет браузер: «сайт недоступен»в «Сети» — ни одной строки со статусомприложение запроса не видело

Успешный путь: имя превращается в адрес, до пары «адрес и порт» встаёт TCP-соединение, по нему уходит запрос и возвращается ответ со статусом. Во второй половине обрыв на третьем шаге: пакеты уходят, ответа нет — и на экране «сайт недоступен», а во вкладке «Сеть» пусто. Логи сервиса в этом случае тоже чисты: запроса там не было.

Обязательно

Что уходит с вашей машины

«У меня не работает» — это два разных дефекта с разными исполнителями: приложение посчитало неверно или до приложения ничего не доехало.

Между клиентом (браузер, мобильное приложение, Postman) и сервером — процессом на другой машине, который слушает соединения и отвечает, — нет прямого провода: запрос идёт через роутер, корпоративный прокси и балансировщик, и любой может ответить вместо сервера или промолчать. Поэтому первый вопрос перед баг-репортом: ответ был? Ответил сервер хоть чем-нибудь, даже ошибкой 500, — причина в коде; ответа нет — чинить доступность. Сам обмен разбирает клиент-сервер и HTTP, здесь мы уровнем ниже.

Адрес, порт и имя

Компьютеры не соединяются по именам: shop.test — для людей, пакету нужен номер.

IP-адрес — адрес машины: 10.2.14.7 (IPv4, четыре числа от 0 до 255) или длинный IPv6. Порт — число от 0 до 65535, номер квартиры в доме: какой программе на машине отдать пакет. За частью портов закреплены привычные сервисы: 80 у HTTP, 443 у HTTPS, 5432 у PostgreSQL, 22 у SSH. Порт в браузере не пишут: для https:// подставляется 443.

Имя в адрес превращает DNS. Сначала система смотрит файл hosts (/etc/hosts, на Windows — в System32\drivers\etc): строчка оттуда перебивает всё. Не нашла — спрашивает сервер имён и запоминает ответ на TTL из записи, обычно минуты или часы. Из-за кэша переехавший стенд ещё какое-то время открывается по старому адресу.

«Не резолвится домен» — это ровно тот шаг: nslookup shop.test (или dig) возвращает пусто, и приложение тут ни при чём.

Из чего состоит адрес: URI, URL, URN

Ссылка из задачи ломается на параметре, а объяснить, где именно, нечем: «ссылка» не разобрана на части.

URI — общее название идентификатора ресурса, видов у него два. URL говорит, где ресурс лежит и как его взять. URN называет ресурс, не говоря о месте: urn:isbn:9785446104222 — книга, но не адрес, откуда её скачать. В работе почти всегда URL, а URI встречается в документации API.

https://shop.test:8443/orders/42?status=paid&page=2#items
схема   хост     порт путь      параметры          якорь

Параметры после ? — источник половины проверок: фильтры, постраничность, сортировка. А якорь после # на сервер не уходит вообще — его обрабатывает браузер, и дефект по ссылке с якорем ищут там же.

TCP и UDP: гарантия против скорости

Страница грузится десять секунд, звонок рассыпается на куски: жалобы одинаковые, а протоколы разные.

TCP — соединение с гарантией. До первого полезного байта стороны обмениваются тремя сообщениями (рукопожатие), дальше каждый кусок нумеруется и подтверждается: потерялся — уйдёт заново, пришли вперемешку — соберутся по порядку. Платят временем: рукопожатие стоит оборота «туда-обратно», поэтому «первый запрос медленный, дальше быстро» — часто не дефект. UDP — ни рукопожатия, ни подтверждений: отправил и забыл, зато мгновенно.

Делят по одному признаку: ценен каждый байт — TCP, данные быстро устаревают — UDP. Страницы, API, файлы и оплата идут по TCP; голос, видео, игры и телеметрия — по UDP: ждать переотправку уехавшего кадра бессмысленно. По UDP уходит и DNS-запрос.

Для проверок: рассыпавшийся звук в видеозвонке — штатное поведение UDP при потерях, воспроизводить его надо на плохой сети, а не на офисном Wi-Fi. Зависшая на минуту страница — это TCP ждёт переотправок; время ожидания в баг-репорте пишут числом.

Слои: на каком уровне искать причину

Причин у «не работает» десяток, и лежат они на разных уровнях, поэтому сеть описывают слоями: учебная модель OSI делит её на семь, рабочая TCP/IP — на четыре. Заучивать названия незачем, вся польза — отнести симптом к уровню:

  • прикладной — HTTP и DNS: 404, 500, неверные данные в ответе;
  • транспортный — TCP, UDP и порты: «соединение сброшено», таймауты;
  • сетевой — IP и маршруты: «хост недоступен»;
  • канальный и физический — Wi-Fi и кабель: пропал интернет.

Правило одно: не чините верх, пока не проверен низ. Отсюда и жаргон: L4-балансировщик работает с портами, L7 — с URL.

Прокси и VPN

У вас «сайт недоступен», у коллеги тот же адрес открывается — разница в том, как машина выходит в сеть.

Прокси — посредник, через которого идут запросы: корпоративный выпускает наружу по правилам, а на той стороне соединение принимает балансировщик. Поэтому часть ошибок в браузере пишет не приложение: 500 — приложение упало внутри; 502 и 504 обычно от посредника: «тот, кто должен был ответить, не ответил».

VPN — зашифрованный туннель в другую сеть. Встречается дважды: без него нет маршрута до стенда во внутренней сети; и как способ проверить гео — язык и валюту приложение выбирает по адресу выхода. Обратная сторона — забытый включённый VPN: половина «плавающих» дефектов с ценой и языком идёт отсюда.

Чем смотреть

Угадывать ничего не нужно — всё это видно.

  • Вкладка «Сеть» в DevTools — первая остановка: есть ли строка запроса, какой статус, сколько заняла.
  • ping адрес — доходят ли до машины пакеты. Тишина не приговор: служебные пакеты часто запрещены правилами, а сервис жив.
  • curl -v telnet://10.2.14.7:8080 (или telnet 10.2.14.7 8080) — принимает ли кто-то соединения на порту. Исходов три: Connected — порт открыт; Connection refused — слушать некому, приложение не поднялось; тишина до таймаута — пакеты роняет межсетевой экран.
  • Снифферы — Wireshark показывает сам трафик, Fiddler встаёт посередине HTTP-обмена и подменяет запросы.

Где теряют полдня

  • Дефект заводят на приложение, которое запроса не видело. Строки во вкладке «Сеть» нет или у неё нет статуса — чинить надо доступность стенда.
  • Смотрят не на тот стенд. Адрес в закладке остался с прошлой задачи, признак — «дефект не воспроизводится»: у вас сборка недельной давности.
  • Кэш имени. Стенд переехал, а машина ходит по старому адресу: у вас старая версия, у всех новая. Лечится nslookup и взглядом в hosts.
  • 502 принимают за 500. «Сервер не отвечает» на экране часто написано посредником, а не приложением.
Дополнительно: при первом чтении можно пропустить

Глубже: семь уровней OSI, маска подсети, DNS и SSHрасширенное

Четырёх уровней из раздела выше хватает для работы, но на собеседовании просят все семь, и стоит знать их с примерами. Снизу вверх: физический это кабель и Wi-Fi, канальный это MAC-адреса и коммутатор, который передаёт кадры внутри одной сети, сетевой это IP-адреса и маршрутизатор, который передаёт пакеты между сетями, транспортный это TCP с гарантией доставки и UDP без неё плюс порты, сеансовый и представительский это установление сеанса и кодирование, на практике их относят к TLS и форматам, прикладной это HTTP, DNS и всё, с чем вы работаете. Модель TCP/IP сжимает это в четыре уровня: доступ к сети, интернет, транспорт, приложение. Протокол ARP живёт на стыке канального и сетевого: по IP-адресу находит MAC-адрес соседа.

Маска подсети говорит, какая часть IP-адреса обозначает сеть, а какая устройство. Запись /24 означает 24 бита на сеть и 8 на устройства: 256 адресов, из них первый это адрес сети, последний широковещательный, то есть «всем сразу», и 254 остаются устройствам. /28 даёт 16 адресов, 14 полезных. Маска 255.255.255.0 это тот же /24: ноль в последнем октете и есть место для устройств.

DNS переводит имя в адрес: браузер смотрит свой кэш, потом кэш системы, потом спрашивает резолвер провайдера, а тот при необходимости идёт к корневым серверам, серверам зоны .ru и серверу домена. Ответ кэшируется на время TTL, поэтому после смены адреса сайт у части людей ещё открывается по старому. Записи, которые встречаются тестировщику: A адрес, CNAME псевдоним, MX почта, TXT подтверждения.

SSH это защищённый вход на сервер в терминал: ssh user@host. Войти можно по паролю или по ключу: открытую часть ключа кладут на сервер в authorized_keys, закрытая остаётся у вас, и пароль больше не спрашивают. Так тестировщик попадает на стенд, чтобы посмотреть логи или перезапустить сервис.

Коротко

  • Соединение встаёт до пары «адрес и порт»; имя в адрес превращает DNS, а до DNS — файл hosts.
  • TCP гарантирует доставку и порядок ценой рукопожатия; UDP быстрый и без обещаний — потери в голосе и видео норма.
  • Слои нужны, чтобы не чинить верх, пока не проверен низ.
  • Якорь после # на сервер не уходит — такой дефект всегда на стороне браузера.
  • 500 пишет приложение, 502 и 504 — обычно посредник.
  • OSI: семь уровней от кабеля до HTTP, TCP/IP четыре; коммутатор на канальном, маршрутизатор на сетевом; маска /24 это 256 адресов и 254 устройства; DNS кэширует ответ на TTL; SSH вход на стенд по ключу.

Что почитать дальше