Как происходит загрузка веб-страницы от DNS-запроса до отображения в браузере
Что проверяют
Насколько глубоко вы видите сеть и HTTP, а для бэкендера ещё и понимаете ли, где в этой цепочке ваш код и что он может ускорить или сломать. Следом часто спрашивают, чем HTTP/2 отличается от HTTP/3 или что происходит на сервере между nginx и Django.
Как отвечать
Идите по этапам и на каждом называйте кэш или оптимизацию:
- DNS: браузер проверяет свой кэш и кэш ОС, затем спрашивает рекурсивный резолвер. Тот при пустом кэше идёт от корневых серверов к серверам зоны и к авторитативному серверу домена. Ответ живёт столько, сколько задано в TTL;
- соединение: TCP-рукопожатие SYN, SYN-ACK, ACK, затем TLS. В TLS 1.3 рукопожатие занимает один круг вместо двух. HTTP/3 работает поверх QUIC на UDP и совмещает транспортное и TLS-рукопожатие;
- запрос:
GETс заголовками, куками,Accept-Encoding. HTTP/2 мультиплексирует много запросов в одном соединении; - сервер: балансировщик или CDN, дальше nginx терминирует TLS, отдаёт статику и проксирует запрос в
gunicorn(WSGI) илиuvicorn(ASGI). Там middleware, роутинг, view, запросы к базе, шаблон или JSON. Это единственная часть пути, которую пишете вы, и обычно самая медленная; - ответ: статус,
Content-Type,Cache-Control, сжатие gzip или brotli; - рендеринг: парсинг HTML в DOM, CSS в CSSOM, из них дерево отрисовки, затем layout, paint и композитинг. Синхронный
<script>останавливает парсинг, поэтому скрипты подключают сdeferилиasync, а CSS блокирует отрисовку.
По ходу разбора HTML браузер находит новые ресурсы (стили, скрипты, картинки) и повторяет для них ту же цепочку, но уже с готовым соединением.
Где спотыкаются
Пропускают кэши. На деле до авторитативного DNS-сервера доходит малая доля запросов, а статика часто вообще не покидает кэш браузера.
Называют протокол «SSL». SSL давно выведен из употребления, сейчас это TLS 1.2 и 1.3.
Не могут подробно рассказать серверную часть, хотя собеседование на Python-бэкенд. Интервьюер ждёт как раз разговора про воркеры, пул соединений к базе и то, где запрос тратит время.