Как работает 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не делается, потому что эта информация кэшируется. Браузер сначала ищет айпишник в ближайших местах (история подключений, кэш ОС/роутера), и, если находит адрес там, то берет его из локального кэша. Если не находит — отправляетhostDNS-серверу. -
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
Браузер
Когда соединение установлено, мы переходим к
httphttp-части.Браузер объясняет серверу, что ему нужно: формирует
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, нажмите на кнопку "Посмотреть гифку":