Как работает Web
Что делает браузер, чтобы загрузить Веб-страницу?
-
account_circle
Пользователь
Вводит адрес сайта в поисковую строку браузера.
-
dvr
Браузер
Получает адрес. Возьмем для примера
https://www.google.com
. Вот, что в нем есть:https
— это протокол (может быть незащищенный (http
) или защищённый (https
));google.com
- этоhost
, по которому нужно сделать обращение: он представлен доменным именем;/index.html
- это адрес ресурса, который нужно получить на веб-сервере.
Браузер делает разбор адреса. Он знает, что машины понимают только цифры. Поэтому берёт
host
и на его основе получаетIP
-адрес (это адрес веб-сервера). Другими словами, происходит преобразование (resolve) доменного имени вIP
-адрес. Для этого используетсяDNS
-сервер (Domain Name Server).Однако, если ранее адрес уже использовался, то запрос к
DNS
не делается, потому что эта информация кэшируется. Браузер сначала ищет айпишник в ближайших местах (история подключений, кэш ОС/роутера), и, если находит адрес там, то берет его из локального кэша. Если не находит — отправляетhost
DNS
-серверу. -
storage
DNS-сервер
Находит
IP
-адрес сайта в адресной книге и отправляет браузеру. -
dvr
Браузер
Получает
IP
-адрес, и теперь можно установитьTCP
-соединение с веб-сервером.TCP
— это протокол с набором правил, по которым осуществляется соединение. ПриTCP
-соединении обязательно подтверждение получения информации: если подтверждение не получено, то информация отправляется заново.Для
TCP
-соединения есть важная характеристика: порт, по которому оно должно быть установлено:80
- дляhttp
-протокола;443
- дляhttps
-протокола.
При установке
TCP
-соединения идет обмен пакетами с флагамиACK/SYN/FIN
. Если мы взаимодействуем поhttps
-протоколу, то происходит так называемое трехстороннее рукопожатиеTCP
(TLS handshake) - это обмен сертификатами, проверка подлинности сертификатов, обмен публичными ключами, т.е. происходит установка доверенного соединения:SYN
-пакет: браузер отправляет запрос на соединение;SYN/ACK
-пакет: сервер подтверждает получение;ACK
-пакет: браузер подтверждает, что получилSYN/ACK
-пакет.
-
sync
Соединение установлено
-
dvr
Браузер
Когда соединение установлено, мы переходим к
http
http-части.Браузер объясняет серверу, что ему нужно: формирует
http
-заголовок.Это простой текстовый заголовок. Он включает в себя: метод получения информации (
GET/POST
или другие),URL
, версиюhttp
-протокола, которая используется клиентом,host
,connection
(чаще всегоclose
),cookie
и т.п.Можно отметить, что до версии
http
-протокола1.0
не было поддержки виртуальных хостов и нельзя было указать такой заголовок, какhost
. Начиная с версии1.0
почти везде используются виртуальные веб-сервера, когда можно на одном веб-сервере хостить несколько веб-серверов, разделенных по хостам. Поэтому вhttp
-заголовке указывается заголовокhost
и имя хоста, которое, как правило, совпадает с доменным именем.После формирования
http
-заголовка браузер отправляет его серверу. -
dns
Сервер
Веб-сервер получает заголовок и производит обработку, формирует ответ и отправляет браузеру.
Ответом может быть:
- в случае успеха — заголовок со
status code: 200
иhtml
-страница; - в случае ошибки — сообщение об ошибке.
- в случае успеха — заголовок со
-
dvr
Браузер
Если пришел заголовок со
status code: 200
, браузер берет полученнуюhtml
-страницу (которая приходит в пакетах данных) и делает парсинг (сбор данных).HTML
- достаточно сложный язык, он не парсится в один проход. Части парсинга:- лексический анализ — выделение лексем, токенов;
- синтаксический анализ — проверка правильности самого языка;
- парсинг — формирование дерева распарсенных элементов.
При парсинге
HTML
создаютсяDOM
,CSSOM
и непосредственноRender tree
с набором элементов, на основе которого происходит отображение страницы. Процесс рендеринга — это и есть постепенное отображение контента на экране.Если на странице есть скрипты, они могут изменять положение элементов, их размер. В таком случае запускаются дополнительные процессы парсинга.
Наконец, происходит отображение страницы на основе распарсенной информации.
-
account_circle
Пользователь
Видит страницу и взаимодействует с ней.
Запросы в действии
JavaScript дает нам возможность самостоятельно составлять и отправлять запросы на сервер. Чтобы протестировать взаимодействие с сервером и посмотреть на его ответ, сделаем fetch
-запрос к открытому API
гифок GIPHY и попробуем получить картинку. Подробнее о работе API
и fetch
-запросах можно прочитать здесь.
Пусть это будет простой GET
-запрос без указания дополнительных параметров:
async function loadData() {
let response = await fetch("https://api.giphy.com/v1/gifs/translate?api_key=вставить_API_Key_с_сайта_GIPHY=cat");
let data = await response.json();
try {
if(response.status === 200){
// здесь пишем код, который должен вывести на странице гифку, status code и response headers
} else {
throw new Error ("Проверьте корректность запроса.");
}
} catch (error) {
console.log(error.message);
// а здесь пишем код, который должен вывести на страницу сообщение об ошибке
}
}
loadData();
На основе шаблона функции loadData()
смоделированы две ситуации:
- успешный запрос:
fetch
-запрос составлен верно, вместо фразы "вставить_API_Key_с_сайта_GIPHY" был добавлен актуальный ключ; - запрос с ошибкой: а здесь ключ добавлен не был, в таком виде
fetch
некорректен — запросу не хватает учетных данных.
Чтобы узнать, сработает ли запрос, какой статус и какие заголовки придут с сервера в параметрах ответа response.status
и response.headers
, нажмите на кнопку "Посмотреть гифку":