Что происходит при открытии сайта

Собираем общую картину: что происходит сверху вниз, когда вы вводите адрес сайта и жмёте Enter.

Это «обзор с высоты птичьего полёта» — каждый шаг мы подробно разберём в следующих разделах. Сейчас важно увидеть всю цепочку целиком.

Сценарий: вы открываете сайт

Вы вводите https://shop.example.com и нажимаете Enter. Вот что происходит, в правильном порядке:

  1. Разбор URL. Браузер раскладывает адрес на части: схема (https), хост (shop.example.com), порт (по умолчанию 443), путь, query-параметры.
  2. DNS. Имя shop.example.com нужно превратить в IP-адрес. Браузер спрашивает у DNS-резолвера и получает, например, 93.184.216.34.
  3. TCP-соединение. С этим IP по порту 443 устанавливается TCP-соединение через «трёхстороннее рукопожатие» (SYN → SYN-ACK → ACK).
  4. TLS-рукопожатие. Поскольку это HTTPS, поверх TCP согласуется шифрование: проверяется сертификат сервера, договариваются о ключах.
  5. HTTP-запрос. Браузер отправляет запрос вида GET / HTTP/1.1 с заголовками (Host, User-Agent, Cookie и т.д.).
  6. Обработка на сервере. Сервер принимает запрос, возможно, лезет в базу, формирует HTML и отвечает со статусом (например, 200 OK).
  7. Рендеринг. Браузер получает HTML, видит ссылки на CSS, JS, картинки — и для каждого ресурса при необходимости повторяет шаги выше.

Где на этих шагах лежат уровни

URL, DNS, HTTP, TLS       -> прикладной уровень
TCP-рукопожатие, порт 443 -> транспортный уровень
IP-адрес, маршрутизация   -> сетевой уровень
Wi-Fi/Ethernet до роутера -> канальный уровень

Разбор URL прямо сейчас

Первый шаг — разбор адреса — легко показать на чистом Python из стандартной библиотеки. Модуль urllib.parse делает ровно то, что делает браузер: раскладывает URL на компоненты.

from urllib.parse import urlparse, parse_qs

url = 'https://shop.example.com:443/catalog/items?page=2&sort=price#reviews'
p = urlparse(url)

print('Схема (протокол):', p.scheme)
print('Хост:            ', p.hostname)
print('Порт:            ', p.port)
print('Путь:            ', p.path)
print('Query:           ', p.query)
print('Фрагмент:        ', p.fragment)
print('Параметры:       ', parse_qs(p.query))

Вывод:

Схема (протокол): https
Хост:             shop.example.com
Порт:             443
Путь:             /catalog/items
Query:            page=2&sort=price
Фрагмент:         reviews
Параметры:        {'page': ['2'], 'sort': ['price']}

Браузер делает то же самое, только в нативном коде, и дальше использует hostname для DNS, port для соединения, а path и query уходят в HTTP-запрос.

Зачем держать эту картину в голове

Это самый частый вопрос на собеседовании: «Что происходит, когда вы вводите URL и жмёте Enter?». Хороший ответ проходит по всей цепочке: URL → DNS → TCP → TLS → HTTP → рендеринг. В последнем разделе курса мы разберём этот вопрос максимально подробно. Сейчас держите в голове скелет — на него мы будем «навешивать» детали.

Итог

  • Открытие сайта — это цепочка: URL → DNS → TCP → TLS → HTTP → рендеринг.
  • Каждый шаг живёт на своём уровне модели.
  • Разбор URL — это работа прикладного уровня; в Python его делает urllib.parse.
  • Эту цепочку нужно уметь рассказать целиком — это классика собеседований.
Проверьте себя
1. Какой шаг идёт ПЕРВЫМ после разбора URL при открытии https-сайта?
ATLS-рукопожатие
BОтправка HTTP-запроса
CDNS-резолвинг имени в IP
DРендеринг HTML
2. Почему при HTTPS добавляется шаг TLS-рукопожатия?
AЧтобы ускорить загрузку
BЧтобы согласовать шифрование и проверить сертификат сервера
CЧтобы найти IP-адрес
DЭто часть DNS
3. Что вернёт urlparse для порта в адресе https://site.com/page (порт не указан явно)?
A443
B80
CNone
DОшибку
Поддержать проект