Сеть и протоколы для тестировщика
Два замера, которые выглядят как одно «не работает». Обращение на порт, где никто не слушает: ответ через 21 миллисекунду, «соединение отвергнуто». Обращение к серверу, который соединение принял и замолчал: ровно 2000 миллисекунд ожидания и «время вышло». Первый случай - сервиса нет. Второй - сервис есть и завис. Это разные задачи и разные ответственные.
Стержень: «не работает» разбирают по слоям снизу вверх, а рассинхрон таймаутов между посредником и сервисом даёт 504 при живом сервисе.
// Формулировки: «как локализуешь сетевую проблему?», «чем таймаут соединения отличается от таймаута ответа?», «почему через балансировщик падает, а напрямую нет?».
Слои и порядок диагностики
Запрос проходит четыре слоя, и на каждом свой отказ. DNS: имя не превратилось в адрес - «такого хоста нет». TCP: адрес есть, но соединение не устанавливается - «отвергнуто» (никто не слушает) или «время вышло» (пакеты не доходят, обычно межсетевой экран). TLS: соединение есть, но не сошлись на шифровании или сертификат просрочен. HTTP: всё установилось, и приложение ответило кодом.
Разбирают снизу вверх, потому что верхний слой без нижнего не работает. Инструменты соответствуют слоям: команда резолва имени проверяет DNS, попытка подключиться на порт - TCP, а curl -v показывает всю цепочку разом: какой адрес выбран, как прошло шифрование, какие заголовки ушли и вернулись, каким кодом всё кончилось.
// Главная польза от curl -v в другом: он отделяет клиента от сервера. Если через него баг воспроизводится - проблема на сервере, и репорт идёт бэкендерам. Если не воспроизводится - дело в клиенте: в его заголовках, настройках или посреднике. Это экономит день переписки на каждом таком случае.
# видно выбранный адрес, шифрование,
# заголовки в обе стороны и код ответа
curl -v https://api.example.com/orders/42 \
-H "Authorization: Bearer $TOKEN"- отвергнуто / время вышло
- никто не слушает порт / пакеты не доходят или сервис завис
- curl -v
- показывает всю цепочку: адрес, шифрование, заголовки, код
Таймауты и почему приходит 504
Таймауты бывают двух видов, и путать их нельзя. Таймаут соединения - сколько ждём, пока установится связь. Таймаут ответа - сколько ждём ответ по уже установленной связи. В моём замере первый случай отработал за 21 миллисекунду (соединение отвергнуто сразу), второй съел всё отведённое время до последней миллисекунды.
А вот замер, объясняющий самую частую жалобу. Сервис честно считает три секунды и отвечает 200 - я обратился к нему напрямую и получил ответ через 3002 миллисекунды. Между клиентом и сервисом поставил посредника с таймаутом в одну секунду. Тот же запрос через посредника: 1003 миллисекунды и 504. Сервис исправен, запрос корректен, но посредник сдался раньше.
// Отсюда правило: таймауты в цепочке должны быть согласованы, и наружный обязан быть не меньше внутреннего. «Напрямую работает, через балансировщик 504» - это почти всегда не про сервис, а про рассинхрон настроек. Тестировщик, который это знает, приносит разработчикам диагноз, а не загадку.
- таймаут соединения / ответа
- ждём установления связи / ждём ответ по установленной связи
- 504
- посредник не дождался ответа от сервиса за отведённое ему время
Посредники, имена и мобильная сеть
Посредник (обратный прокси или балансировщик) стоит перед сервисом и незаметно меняет картину: подставляет настоящий адрес клиента в отдельный заголовок, режет или добавляет заголовки, ограничивает размер тела, держит свои таймауты. Поэтому «работает напрямую, падает через него» - обычное дело, и разбирается сравнением того, что именно он поменял.
Имена тоже подводят. Ответ DNS кэшируется на время жизни записи, разные резолверы могут отвечать по-разному, а локальный файл соответствий на вашей машине перебивает всё. Классическая потеря недели: в этом файле осталась строчка со старым стендом, и человек честно тестирует не ту среду, а потом не может объяснить расхождение.
// И условия сети. Офисный провод не покажет того, что живёт на мобильном интернете: большие задержки, потери пакетов, смена сети на ходу. Это эмулируют - в панели разработчика есть режим замедления - и проверяют, что приложение переживает медленный ответ и обрыв. Отдельная ловушка на стороне клиента: исчерпанный набор переиспользуемых соединений выглядит как «сервер тормозит», хотя сервер здесь ни при чём.
- обратный прокси
- посредник перед сервисом: свои таймауты, лимиты и заголовки
- локальный файл имён
- перебивает DNS на вашей машине; забытая строка = не та среда
Как отвечать: «Через Postman работает, из кода нет - как разбираешься?»
Не гадаю, а нахожу различие, потому что сервер-то один и тот же. Первым делом воспроизвожу оба варианта через curl с подробным выводом: он показывает всю цепочку - какой адрес выбран, как прошло шифрование, какие заголовки ушли и вернулись, каким кодом всё кончилось. Дальше сравниваю по порядку убывания вероятности. Заголовки: Postman сам добавляет тип содержимого, принимаемые форматы, своё имя клиента и куки из окружения, а в коде их легко забыть или послать другими. Посредник: Postman может ходить через системный прокси, а код напрямую или через другой - и тогда цепочка разная. Тело и кодировка: сериализация в коде отличается от того, что руками вставлено в Postman, вплоть до лишнего пробела или другой кодировки. Таймауты: у клиента в коде может стоять короткий по умолчанию, и он не дожидается. И проверяю имена: не ходят ли они на разные адреса из-за локального файла соответствий или кэша. Метод простой - подробный вывод на обоих, разница по заголовкам, посреднику и телу. Обычно всё сводится к одному забытому заголовку.
Почему это сильный ответ: показан системный способ сравнения вместо догадок, различия перечислены по вероятности, и названа конкретная команда, дающая всю цепочку.
На чём валят
- −Репортить «API лежит», когда имя не резолвится на конкретной машине.
- −Забытая строка в локальном файле имён - неделя тестирования не той среды.
- −Считать 504 поломкой сервиса: сервис ответил за 3 секунды, а посредник ждал одну.
- −Не различать «соединение отвергнуто» и «время вышло» - это разные диагнозы.
- −Тестировать только на офисной сети - пользователь живёт на мобильном интернете с потерями.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Что HTTPS добавляет к обычному HTTP?A)Шифрование канала через TLS — трафик нельзя прочитать или подменить по путиB)Сжатие ответов, за счёт которого страницы грузятся заметно быстрееC)Кэширование страниц на стороне сервера для ускорения ответовD)Автоматическую проверку HTML-разметки на ошибки вёрстки перед её отправкой
показать ответ и разбор
+A)Шифрование канала через TLS — трафик нельзя прочитать или подменить по пути// разбор: HTTPS — это HTTP поверх TLS: канал шифруется, поэтому данные (пароли, токены, куки) нельзя прочитать или незаметно подменить при перехвате, а сертификат подтверждает подлинность сервера. Сам формат запросов и ответов HTTP при этом не меняется. Тестировщик проверяет: работает ли редирект с http на https, валиден ли сертификат, не уходят ли чувствительные данные по открытому http, нет ли смешанного контента (mixed content).
- Что происходит после ввода URL и до появления страницы?A)Браузер сразу отправляет HTTP-запрос прямо на домен, минуя промежуточные шагиB)Сервер сам находит браузер по имени и присылает страницу без запроса от клиентаC)Браузер открывает соединение прямо по имени домена, IP-адрес при этом не требуетсяD)Резолв имени через DNS → TCP-соединение → TLS (для https) → HTTP-запрос → ответ
показать ответ и разбор
+D)Резолв имени через DNS → TCP-соединение → TLS (для https) → HTTP-запрос → ответ// разбор: Упрощённо цепочка такая: браузер резолвит доменное имя в IP через DNS, устанавливает TCP-соединение с этим IP (рукопожатие), для https проводит TLS-рукопожатие, затем шлёт HTTP-запрос и получает ответ, который рендерит. Понимание слоёв помогает локализовать сбой: не резолвится имя (DNS), не открывается соединение (сеть/порт), ошибка сертификата (TLS) или уже ошибка приложения (HTTP-код). Это классический вопрос собеса тестировщика.
- Зачем тестировщику прокси-снифферы вроде Charles, Fiddler или вкладки Network в DevTools?A)Чтобы редактировать исходный код страницы прямо в браузере на летуB)Чтобы видеть и при необходимости подменять реальные HTTP-запросы и ответыC)Чтобы замерять покрытие кода автотестами во время их прогонаD)Чтобы автоматически находить SQL-инъекции в базе данных приложения
показать ответ и разбор
+B)Чтобы видеть и при необходимости подменять реальные HTTP-запросы и ответы// разбор: Снифферы-прокси перехватывают трафик между приложением и сервером: тестировщик видит реальные запросы и ответы (заголовки, тело, коды, тайминги), может поставить точку останова и подменить запрос или ответ, эмулировать ошибку сервера, медленную сеть, битые данные. Это ключ к отладке интеграций и к обходу клиентской валидации (запрос шлём напрямую). Вкладка Network в DevTools — то же для веба в браузере. Это не редактор кода и не инструмент покрытия.
- Что проверяется при TLS-рукопожатии в начале HTTPS-соединения?A)Правильность логина и пароля пользователя перед входом в приложениеB)Скорость канала, чтобы выбрать оптимальный размер передаваемых пакетовC)Подлинность сертификата сервера и согласование ключей для шифрованияD)Наличие у пользователя прав на запрошенный ресурс приложения
показать ответ и разбор
+C)Подлинность сертификата сервера и согласование ключей для шифрования// разбор: При TLS-рукопожатии клиент и сервер договариваются о версии протокола и шифрах, сервер предъявляет сертификат, а клиент его проверяет: выдан ли доверенным центром (цепочка до корневого CA), не истёк ли, совпадает ли домен. Затем стороны согласуют сеансовый ключ, которым дальше шифруется трафик. Это про подлинность сервера и шифрование канала, а не про логин пользователя или его права — те проверяются уже на уровне приложения, после установки защищённого канала.
- Почему запрос из браузера блокируется по CORS, а тот же запрос из Postman проходит?A)CORS — это правило самого браузера; Postman не браузер и его не применяетB)Postman автоматически подставляет недостающие права доступа к APIC)Сервер отдаёт Postman другие данные, чем браузеру, ориентируясь на User-AgentD)В Postman запрос идёт по HTTP, а в браузере по HTTPS, отсюда и блокировка
показать ответ и разбор
+A)CORS — это правило самого браузера; Postman не браузер и его не применяет// разбор: CORS (Cross-Origin Resource Sharing) — механизм безопасности браузера: при кросс-доменном запросе браузер смотрит заголовки ответа Access-Control-Allow-Origin и подобные и блокирует доступ скрипта к ответу, если домен не разрешён. Сервер при этом обычно отвечает нормально — доступ режет именно браузер. Postman и curl не браузеры, политику не применяют, поэтому запрос «проходит». Значит CORS чинят на сервере (заголовки), а воспроизводится ошибка только в браузере.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.