Опишите весь процесс, начиная с ввода адреса сайта в адресную строку до окончания его загрузки на экране.
-
Вы вводите адрес в строку адреса в браузере.
-
Браузер ищет в своём кэше запись о DNS сервере соответствующего IP-адреса.
DNS (Domain Name System) — это база данных с url-адресами сайтов и связанными с ними IP. Каждый URL в интернете имеет свой уникальный IP. IP адрес принадлежит компьютеру, на котором находится сервер запрашиваемого вебсайта.
Чтобы найти запись DNS браузер проверяет 4 кэша:
- Кэш браузера. У браузера есть хранилище DNS записей для сайтов, на которых вы уже были.
- Кэш операционной системы. Если в кэше браузера нет записи о DNS, браузер делает системный запрос к операционной системе, у которой есть свой кэш DNS записей.
- Кэш роутера. Если браузер ничего не нашёл на компьютере, он делает запрос к роутеру, у которого есть свой DNS кэш.
- Кэш провайдера. Если предыдущие попытки закончились неудачей, браузер обращается к кэшу провайдера.
- Если запрашиваемого URL нет в кэше, DNS сервер провайдера отправляет DNS запрос серверу, на котором хостится необходимый вебсайт.
DNS запрос ищет нужный IP на разных DNS серверах. Такой поиск называется рекурсивным, потому что переходит от сервера к серверу, пока не найдет IP или не вернёт ошибку о невозможности его найти. DNS запросы отправляют небольшие пакеты данных с информацией о содержимом запроса и IP адресом, откуда это запрос пришел (IP адрес провайдера). Если эти пакеты теряются, выводится ошибка. При нахождении нужного DNS сервера пакеты берут верный IP адрес и возвращают его браузеру.
- Браузер инициализирует TCP соединение с сервером. Как только браузер получил верный IP адрес, он создаёт соединение для передачи информации. В большинстве случаев браузеры используют TCP протокол для любых HTTP запросов. Для соединения с сервером используется процесс TCP/IP three-way handshake - трёхшаговый процесс, в котором клиент и сервер обмениваются SYN (synchronize) и ACK (acknowledge) сообщениями.
- Компьютер клиента посылает серверу SYN запрос, чтобы узнать открыт ли сервер для новых соединений.
- Если у сервера есть открытые порты для новых соединений, он отвечает пакетом SYN/ACK.
- Клиент получает от сервера SYN/ACK пакет и подтверждает соединение, отослав ACK пакет.
После этого TCP соединение установлено.
-
Браузер посылает HTTP запрос к web серверу. Браузер отсылает GET запрос для нужной веб страницы. Если мы отправляем форму, это будет POST запрос. Этот запрос содержит дополнительную информацию о браузере (заголовок User-Agent), типы запросов, которые он может принять (Accept заголовок) и заголовки соединения (нужно ли сохранять соединение). Также в запросе будет информация о cookies, которые браузер хранит для этого домена.
-
Сервер обрабатывает запрос и даёт ответ. Сервер получает запрос и передаёт его обработчику запросов для чтения и создания ответа. Обработчик запроса — это программа (написанная на PHP, Ruby и т.д.), которая читает запрос, заголовки и cookies, распознаёт, какая информация запрошена и обновляет данные на сервере, если необходимо. Далее собирается ответ в определённом формате (JSON, XML, HTML).
-
Сервер высылает HTTP ответ.
Ответ сервера содержит запрошенную веб страницу вместе с кодом статуса, типом сжатия (Content Encoding), информацией о том, как кэшировать страницу, cookies и т.д.
В первой строчке ответа находится код статуса. Существует 5 типов:
- 1xx содержит только информационное сообщение
- 2xx указывает на успешный запрос
- 3xx переадресует клиента на другой URL
- 4xx указывает на ошибку на стороне клиента
- 5xx указывает на ошибку на стороне сервера
Таким образом, если вы столкнулись с ошибкой, вы можете посмотреь на HTTP ответ и проверить код, который вы получили.
- Браузер отображает HTML контент.
Браузер отображает HTML контент в несколько стадий.
- Рендерит HTML разметку.
- Проверяет HTML теги и отсылает GET запросы за дополнительными элементами (изображениями, css-файлами, JavaScript и т.д.). Эти файлы браузер кэширует, чтобы не скачивать их, когда вы зайдёте на этот сайт в следующий раз.
- Отображает запрошенную страницу у вас в браузере.