Вы нажимаете «Оформить», страница крутит спиннер и показывает «Что-то пошло не так». Разработчик открывает логи сервиса — там пусто: запроса не было. Дефект заведён на оплату, а встало всё на шаг раньше.
Между кнопкой и кодом приложения лежит цепочка: имя превращается в адрес, до адреса встаёт соединение, по нему уходит запрос. Знать её нужно, чтобы называть шаг, на котором всё встало.
Успешный путь: имя превращается в адрес, до пары «адрес и порт» встаёт 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 вход на стенд по ключу.
Что почитать дальше
- Клиент-сервер и HTTP — уровнем выше: методы, статус-коды, тело запроса.
- DevTools браузера — где всё это видно: Console, Network, Elements.
- Основы API-тестирования в Postman — как отправить запрос руками.
- Команды Linux и терминал — чем читать логи на той стороне.