// devops interview / networking

Вопросы на собеседовании: Сети и протоколы

DNS, TCP, TLS, HTTP и сетевой путь запроса — от симптома до проверенной причины. Здесь — топ-12 по частоте на реальных собесах: у первых вопросов открыт полный разбор, у остальных — устный эталон. Весь банк темы (12 вопросов) с разборами — в приложении.

Открыть тему в приложении каждый день бесплатно: 3 эталона и 3 проверки арбитром

junior: база, с которой начинают

Приложение пишет Could not resolve host, но коллега уверяет, что DNS-запись есть. Как пройдёшь путь резолвинга и локализуешь сбой?

getent ahosts api.example.com
dig api.example.com A
dig api.example.com AAAA

как ответить Сначала повторяю запрос тем же системным resolver path, что и приложение, например через getent, а затем сравниваю его с прямым DNS-запросом через dig. Проверяю имя, тип записи, CNAME-цепочку, настроенные resolver-адреса и код ответа. Различаю NXDOMAIN, отсутствие нужного типа, SERVFAIL и timeout: у них разные причины и разные действия.

разбор

getent ahosts проходит через системную конфигурацию имён и потому ближе к поведению обычного приложения. dig полезен для точного DNS-ответа, но может отличаться, если приложение использует NSS, локальный stub resolver, собственный кэш или свой DNS-клиент.

Проверяю по слоям:

  • точное имя без опечатки и search suffix;
  • /etc/nsswitch.conf и фактический /etc/resolv.conf;
  • A и AAAA отдельно, затем CNAME до конечного ответа;
  • код ответа, секции authority и оставшийся TTL;
  • доступность настроенного recursive resolver по UDP и, при необходимости, TCP.

NXDOMAIN означает, что имени не существует по авторитетному ответу; NODATA — имя есть, но записи запрошенного типа нет; SERVFAIL часто указывает на проблему резолвера, делегации или DNSSEC; timeout — на сетевой путь или недоступность сервера. Ошибки тоже могут кэшироваться, поэтому мгновенное исправление зоны не обязано сразу изменить ответ всех клиентов.

чтобы прозвучать сильнее Покажи, как запросить цепочку делегации и authoritative server напрямую, не смешивая это с обычным recursive lookup. Объясни split-horizon DNS и почему ответ внутри корпоративной сети может законно отличаться от публичного.

devops-networking-001 · junior · high

Нужно передавать логи или метрики по сети. Как объяснишь выбор между TCP и UDP без лозунга «TCP надёжный, UDP быстрый»?

как ответить TCP даёт приложению упорядоченный поток байтов, управляет потерями и перегрузкой, но не сохраняет границы сообщений. UDP передаёт отдельные datagram без встроенной гарантии доставки, порядка и устранения дублей. Выбор зависит от допустимой потери, требований к задержке и того, реализует ли прикладной протокол собственные подтверждения, повторы и контроль перегрузки.

разбор

Для TCP приложение должно само фреймить сообщения: один send не обязан соответствовать одному recv. Потерянный сегмент обычно восстанавливается retransmission, а последующие байты могут ждать его, чтобы поток остался упорядоченным. Соединение имеет состояние и требует установления перед обменом данными.

UDP сохраняет границу datagram, но пакет может потеряться, прийти повторно или не по порядку; слишком крупная datagram также повышает риск проблем с фрагментацией. Это подходит, когда свежие данные ценнее полной истории, например часть телеметрии может пережить единичную потерю. Но «UDP» не означает отсутствие надёжности: приложение или протокол поверх него может добавить acknowledgements, шифрование и congestion control.

Для логов уточняю требования. Если потеря аудита недопустима, нужен локальный буфер и подтверждаемая доставка, а не только TCP socket. Если важнее не блокировать приложение при перегрузке коллектора, проектирую bounded queue и явную политику drop, иначе любой транспорт способен перенести backpressure в production-процесс.

чтобы прозвучать сильнее Разбери QUIC как пример надёжного транспорта поверх UDP и объясни, почему это не отменяет congestion control. Упомяни head-of-line blocking TCP-потока и различие с независимыми QUIC streams.

devops-networking-002 · junior · high

Чем для диагностики отличаются connection refused и timeout при подключении к TCP-порту? Какие проверки сделаешь с клиента и с сервера?

как ответить Connection refused обычно означает быстрый отрицательный ответ: на адресе нет слушателя либо firewall активно отклонил запрос. Timeout означает, что ожидаемого ответа не получили: пакет или ответ мог быть отброшен, маршрут сломан или узел недоступен. Сверяю DNS и маршрут на клиенте, listener и bind address на сервере, затем firewall и пакетный захват на границе спорного участка.

полный разбор и проверка ответа арбитром — в приложении devops-networking-003 · junior · high

Ты настраиваешь retry для идемпотентного GET к внешнему API: бывают 429, 500, 503, connect timeout и read timeout. Какие случаи повторишь, как ограничишь попытки и почему ретраи на нескольких слоях опасны?

как ответить Повторяю только ошибки, которые контракт сервиса считает временными: сам класс 5xx ещё не делает любой ответ повторяемым. Все попытки делят общий deadline, используют ограниченный exponential backoff с jitter и учитывают Retry-After; владельцем retry должен быть один согласованный слой. Даже безопасный по семантике GET создаёт нагрузку, поэтому retry budget и отмена после ухода исходного клиента обязательны.

полный разбор и проверка ответа арбитром — в приложении devops-networking-004 · junior · medium

После замены сертификата клиенты получают TLS verification error, хотя порт 443 открыт. Что именно проверяет клиент и как разберёшь цепочку без отключения проверки?

openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null
curl -v https://api.example.com/

как ответить Клиент проверяет доверенную цепочку, срок действия и соответствие имени сервиса идентификаторам сертификата. Смотрю сертификаты, которые реально отдаёт endpoint с нужным SNI, а не файл на диске одной машины. Проверяю SAN, промежуточные сертификаты, часы клиента и trust store; -k использую только как диагностический контраст, не как исправление.

полный разбор и проверка ответа арбитром — в приложении devops-networking-005 · junior · medium

middle: где отделяют уверенных

У HTTP-клиента есть connect, read, write и общий timeout. Как задашь их для внешнего сервиса и почему один большой timeout — слабая защита?

как ответить Разные timeout ограничивают разные фазы: установление соединения, отправку, ожидание данных и всю операцию. Настраиваю их от end-to-end SLO и оставляю вызывающему слою время на обработку ошибки, а все retry делят один абсолютный deadline. Проверяю семантику конкретной библиотеки: read timeout часто измеряет бездействие между чтениями, а не полную длительность ответа.

полный разбор и проверка ответа арбитром — в приложении devops-networking-006 · middle · high

Reverse proxy периодически отдаёт 502 и 504. Чем эти симптомы обычно отличаются и какие доказательства соберёшь на proxy и upstream?

location /api/ {
    proxy_pass http://app;
    proxy_connect_timeout 2s;
    proxy_read_timeout 30s;
}

как ответить Обычно 502 означает, что gateway не получил корректный ответ upstream: connect мог быть отклонён, соединение сброшено или ответ оказался невалидным. 504 означает, что gateway дождался своего timeout, ожидая upstream. Точный mapping зависит от proxy, поэтому связываю access/error log с upstream address, статусом, фазовыми таймингами и журналом приложения по request ID.

полный разбор и проверка ответа арбитром — в приложении devops-networking-007 · middle · high

Сервис доступен через curl localhost:8080 на сервере, но недоступен снаружи. Как проверишь bind address, маршрут, firewall и NAT, не открывая порт всему интернету вслепую?

как ответить Сначала смотрю ss -lntp: listener на 127.0.0.1 принимает только локальный трафик, а wildcard или адрес интерфейса — внешний. Затем проверяю путь от клиента, правила firewall и счётчики, а при наличии NAT — преобразование назначения и обратный маршрут. Разрешение делаю для нужного источника и порта, после чего подтверждаю пакетами и логами.

полный разбор и проверка ответа арбитром — в приложении devops-networking-008 · middle · medium

Балансировщик считает все экземпляры healthy, но пользователи получают ошибки только на части запросов. Что проверишь в health check, алгоритме распределения и жизненном цикле экземпляра?

как ответить Проверяю, что health endpoint отражает способность обслужить реальный запрос, а не только наличие процесса. Сопоставляю ошибки с конкретным backend, его весом, версией и зоной, затем смотрю readiness при старте и drain при остановке. Алгоритм и sticky sessions могут концентрировать проблему, но не заменяют исправление неисправного экземпляра.

полный разбор и проверка ответа арбитром — в приложении devops-networking-009 · middle · medium

Клиент открывает новое TCP/TLS-соединение на каждый HTTP-запрос, latency растёт, а на хосте заканчиваются локальные порты. Как исправишь это через connection pool и какие новые риски появятся?

как ответить Переиспользую соединения через bounded pool: это убирает повторные handshakes и снижает churn локальных портов. Ограничиваю размер, очередь ожидания и idle lifetime, согласуя их с timeout сервера и балансировщика. Учитываю stale connections, обновление DNS и то, что один большой pool без backpressure способен перегрузить downstream.

полный разбор и проверка ответа арбитром — в приложении devops-networking-010 · middle · medium

senior: глубина и продакшн

Для аварийного переключения поменяли A-запись и снизили TTL прямо перед изменением, но часть клиентов часами ходит на старый адрес. Почему DNS failover не мгновенный и как строить его надёжнее?

как ответить Новый TTL действует только на ответы, полученные после его публикации; старые кэши имеют прежний оставшийся TTL. Кроме recursive resolver есть кэши ОС, приложения и negative caching, а уже открытые TCP-соединения DNS вообще не переоценивают. Снижаю TTL заранее, измеряю обе площадки и использую управляемый traffic switch или балансировщик, не считая DNS единственным механизмом здоровья.

полный разбор и проверка ответа арбитром — в приложении devops-networking-011 · senior · low

Под нагрузкой новые TCP-подключения начинают timeout-иться, хотя CPU приложения ещё не насыщен. Как отличишь заполненный backlog, медленный accept, лимит descriptor и проблему conntrack?

как ответить Разбираю путь нового соединения до кода приложения: SYN processing, очередь завершённых handshakes, accept, создание descriptor и stateful middleboxes. Снимаю ss, сетевые счётчики, лимиты процесса и conntrack одновременно с packet capture. Настройки backlog увеличиваю только после доказательства, иначе они маскируют медленный accept loop или исчерпанную зависимость.

полный разбор и проверка ответа арбитром — в приложении devops-networking-012 · senior · low

Соседние темы того же собеса