Ответ:
Любой URL содержит следующую структуру <протокол>/<хост>/путь
, например https://yandex.ru/pogoda
. Также URL может содержать данные для отображения страницы.
-
При вводе URL браузер смотрит на протокол запроса. Если протокол в URL не указан, то браузер смотрит на список HSTS (HTTP Strict Transport Security - механизм, принудительно активирующий защищенное соединение через протокол HTTPS), если хост есть в данном списке, то браузер отправит запрос по протоколу HTTPS, если нет, то по HTTP.
-
Для того, чтобы установить соединение с сервером, необходим его IP адрес. Так как мы используем домен, то необходимо установить соответствие домена и IP адреса сервера, где размещается ресурс. При запросе мы обращаемся к DNS. Cначала проверяется кеш DNS. Приоритет опроса DNS кеша следующий:
- Кеш браузера,
- Проверяется hosts файл ,
- Кеш ОС,
- Кеш роутера,
- Кеш интернет-провайдера Если данных о данном запрашиваеомом хосте в кеше нет, то:
- DNS интернет провайдера отправляет запрос к контевому серверу DNS (.),
- Если корневой сервер не знает запрашиваемого домена, то он отправляет запрос серверу ответственному за зону (.ru), в которому привязан домен,
- Если DNS сервер зоны не знает запрашиваемого домена, то запрос отправляется к NS серверу домена. IP адрес хоста, при его наличии у DNS сервера, возвращается обратно по цепочке
- После того, как IP адрес хоста получили, необходимо сформировать на прикладном уровне запрос к серверу. К запросу добавляются следующие заголовки:
- Прикладной уровень: протокол запроса (HTTP/S, FTP и т.д),
- Транспортный (TCP/UDP): порт, по которому обращаемся к серверу.
- Сетевой уровень: IP адрес пакета
- Канальный уровень: определяет есть ли такой адрес в сети. Если нет, то пакет передаётся шлюзу. Устройство шлюза проверяет свою таблицу маршрутизации и направляет пакет в нужном направлении.
- Далее выполняется следующий алгоритм действий установления соединения:
- После того, как запрос достиг сервера, клиент отправляет клиенту запрос (client hello) и свою версию протокола TLS на защищенное соединение.
- Сервер отвечает клиенту (server hello) с информацией о выбранной версии TLS, методом шифрования, методом компресии и публичный сертификат сервера, подписанный центром сертификации. Сертификат содержит публичный ключ, который будет использован клиентом для шифрования данных.
- Клиент подтверждает сертификат сервера с помощью своего списка центров сертификации. Если сертификат подписан центром из списка, то серверу можно доверять.
- Клиент шифрует данные публичным ключем и отправляет серверу зашифрованное сообщение.
- Сервер расшифровывает сообщение с помощью своего приватного ключа и генерирует симметричный мастер-ключ и отправляет его клиенту.
- Клиент отправляет серверу сообщение о финише, шифруя хэш передачи с помощью симметричного ключа.
- Сервер генерирует собственный хеш, а затем расшифровывает полученный от клиента хэш, чтобы проверить совпадает ли хэш клиента с хэшом сервера. Если совпадение обнаружено, то сервер отправляет клиенту сообщение о финише.
После этого защищенное соединение с сервером установлено.
- Далее необходимо сформировать запрос серверу:
- Клиент формирует запрос HTTP, в котором участвует метод (например GET), URL и версию протокола. Например
GET /pogoda HTTP/2
.
- Следующий заголовок клиента HOST, в котором указывается к какому хосту необходимо обратиться. Например
HOST: yandex.ru
. По заголовку HOST сервер может определить к какому сайту на сервере необходимо обратиться.
- Запрос может также содержать и другие заголовки. Необходимо только, чтобы сервер смог понять эти заголовки.