close
menu
labrika
blog-icon
Январь 24, 2022

Как работает веб-сервер и что такое HTTP-взаимодействие?

В этой статье мы рассказываем о том, как работает веб-сервер, какие данные отправляются и принимаются между вашим браузером и веб-сервером.

Принцип работы веб-сервера

Веб-сервер – это компьютер, который отвечает за хранение файлов веб-сайта и обмен ими с другими компьютерами. Он обычно используется для приема от клиентов запросов на веб-документы и возвращения ответов на них с определенной информацией.

Сайт становится доступен на веб-сервере после того, как зарегистрировано его доменное имя и службой (https://ru.wikipedia.org/wiki/DNS) DNS (Domain Name System) выполнено преобразование адресов — то есть связывание IP-адреса, обозначенного набором цифр (например, 192.168.5.12), и доменного имени (www.site.com).

С одним IP-адресом может быть связано несколько доменных имен. В этом случае переадресация запроса к нужному сайту происходит за счет программного обеспечения сервера, которое определяет, из какой папки запускать программу или загружать файл.

На веб-сервере хранятся файлы сайта, а именно все HTML-документы и связанные с ними ресурсы, включая изображения, стили CSS, файлы JavaScript, шрифты и видео.

Ресурсы представляют собой не только реальные файлы на сервере (HTML, js, png и т. д.). Часть содержимого генерируется в момент поступления запроса специальным программным кодом с помощью шаблонов и баз данных - например: список новостей, сводка погоды, результаты поиска по сайту, корзина покупок и прочее. Соответственно различают статические (неизменяемые) ресурсы и динамические (изменяемые и адаптированные под конкретного пользователя). Получив запрос на динамическое содержимое, веб-приложение извлекает данные из БД и заполняет ими указанный в запросе шаблон.

Как происходит взаимодействие между клиентом и веб-сервером?

Клиент, которым обычно является веб-браузер, передает веб-серверу запросы на получение ресурсов, обозначенных URL-адресами. Ресурсы — это HTML-страницы, изображения, файлы, медиа-потоки или другие данные, которые необходимы клиенту. В ответ веб-сервер передаёт клиенту запрошенную информацию.

Более детально этот процесс можно описать следующим образом:

  1. Браузер делит запрошенный URL на три части: протокол, доменное имя, название файла. Например, URL:https:// www.site.com/ file.html будет разделен на следующие части:
    • Протокол («https»).
    • Доменное имя («www.site.com»).
    • Имя файла («file.html»).
  2. Браузер при помощи сервисов DNS преобразует доменное имя в IP адрес, который используется для связи с серверной машиной.
  3. Используя полученный IP адрес, браузер связывается с нужным веб-сервером и посылает на него запрос, требующий отправки файла «www.site.com / file.html».
  4. Веб-сервер получает запрос и ищет указанную в нём HTML-страницу. Если страница существует, сервер отправляет браузеру ответ, в котором будет HTML-код веб-страницы и заголовок с информацией о запрошенном содержимом. Он предназначен для браузера и нужен, чтобы правильно определить размер, язык переданного файла и другие параметры. Пользователь не видит эту информацию. В заголовке передается и код ответа сервера – например, 200 ОК, когда страница найдена, или сообщение об ошибке 404, если сервер не может найти запрошенную страницу. Подробнее о кодах ответа читайте ниже - в разделе «Коды состояния http».
  5. Браузер читает полученную от сервера HTML-страницу и подгружает другие необходимые ресурсы, которые с ней связаны - изображения, файлы стилей CSS и JavaScript, отвечающие за оформление и функционал страницы, и т. д.
  6. После того, как браузер закончит загрузку всех этих ресурсов, веб-страница будет отображена на экране монитора.

Схематично взаимодействие между браузером и веб-сервером можно представить так:

 

Рассмотрим это же взаимодействие на уровне HTTP-протокола.

Что такое HTTP-взаимодействие?

Обмен данными между клиентом и веб-сервером происходит по протоколу HTTP.

HTTP (HyperText Transfer Protocol, то есть «протокол передачи гипертекста») — это протокол, предназначенный для передачи гипертекстовых документов (то есть документов, которые могут содержать ссылки, позволяющие организовать переход к другим документам). Правила HTTP лежат в основе передачи информации в сети Интернет.

Задача, которая традиционно решается с помощью протокола HTTP — обмен данными между пользовательским приложением, осуществляющим доступ к веб-ресурсам (обычно это веб-браузер) и веб-сервером.

Клиентское приложение формирует HTTP-запрос и отправляет его на сервер, после чего серверное программное обеспечение обрабатывает данный запрос, формирует HTTP-ответ и передаёт его обратно клиенту, как правило, вместе с HTML-страницей или другими запрошенными данными.

 

Каждое HTTP-сообщение состоит из трех частей:

  1. Стартовая строка (Starting line) — включает служебные данные, определяет тип сообщения.
  2. Заголовки (Headers) — описывают клиента и сервер, содержимое сообщения, параметры передачи и др.

    Все заголовки HTTP разделяются на четыре основных группы:

    • General Headers («Основные заголовки») — могут включаться в любое сообщение клиента и сервера. Например, заголовок Date используется для хранения даты и времени запроса/ответа.
    • Request Headers («Заголовки запроса») — используются только в запросах клиента. Например, заголовки Host, Referer и User-Agent.
    • Response Headers («Заголовки ответа») — предназначены только для ответов от сервера. Например, заголовок Server указывает название и версию веб-сервера.
    • Entity Headers («Заголовки сущности») — могут находиться как в запросах, так и в ответах. Передают мета-информацию об объекте, отправленном в теле сообщения. Например, все заголовки с префиксом Content- предоставляют информацию о структуре, кодировке и размере тела сообщения. Заголовок Last-Modified содержит время и дату последнего изменения документа.

    Больше узнать о заголовках можно в спецификации протокола HTTP https://datatracker.ietf.org/doc/html/rfc7231.

  3. Тело сообщения (Message Body) — содержит данные, запрошенные с сайта.

Стартовая строка и заголовок являются обязательными элементами, а тело сообщения может отсутствовать.

Структура HTTP-запроса от клиента

Если клиент хочет загрузить, например страницу «About», HTTP-запрос может включать следующие элементы:

GET /about.html HTTP/1.1
Host: www.site.com
Referer: https://www.google.com/
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64)
Accept-Language: en-us

Где:

GET /about.html HTTP/1.1

Стартовая строка, в которой содержатся:

GET - метод запроса, указывающий на основную операцию, которую необходимо осуществить над ресурсом;

/ about.html — запрашиваемый документ;

HTTP – протокол передачи данных;

/1.1 – версия протокола 1.1.

Host: www.site.com

Заголовок Host содержит имя сайта, с которого нужно загрузить документ.

Referer: https://www.google.com/

В заголовке Referer прописан URL страницы, откуда сделан запрос.

User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64)

Заголовок User-Agent включает:

Mozilla/5.0 – название и версию браузера, отправившего запрос;

Windows NT 6.3; Win64; x64 – название и версию операционной системы.

Accept-Language: en-us

Заголовок Accept-Language указывает язык, используемый в браузере.

Структура HTTP-ответа веб-сервера

  • Стартовая строка в HTTP-ответе указывает версию протокола передачи данных (HTTP/1.1), код статуса ответа (трехзначное число - например, 200), описание статуса (короткое пояснение к коду ответа – например, OK).
  • Заголовки – предоставляют информацию об ответе, сервере или об объекте, отправленном в теле сообщения. Например, в заголовках Content-Type и Content-Length будут указаны тип и размер контента (в байтах).
  • Тело ответа – при запросе содержимого веб-ресурса в нём содержится HTML-код запрошенной страницы или выгружаемые файлы. Отделяется от заголовков пустой строкой.

Пример HTTP-ответа:

HTTP/1.1 200 OK
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 25 Jan 2021 16:54:33 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 98
Last-Modified: Mon, 25 Jan 2021 16:22:21 GMT
<html>
  <head>
    <title>An Example Page</title>
  </head>
  <body>
    <p>Hello World</p>
  </body>
</html>

Где:

HTTP/1.1 200 OK

 

Стартовая строка, в которой прописаны:

HTTP – протокол передачи данных;

/1.1 – версия протокола 1.1;

200 – код ответа сервера (страница доступна);

ОК - пояснение к коду ответа.

 

Server: nginx/1.4.6 (Ubuntu)

Заголовок Server указывает название и версию сервера, который ответил - nginx/1.4.6 (Ubuntu).

Date: Mon, 25 Jan 2021 16:54:33 GMT

 

Заголовок Date используется для указания даты и времени ответа.

Content-Type: text/html; charset=UTF-8

 

В заголовке Content-Type прописаны тип отправленного контента (text/html) и его кодировка (charset=UTF-8).

Content-Length: 98

 

Заголовок Content-Length указывает размер контента (в байтах) – 98.

Last-Modified: Mon, 25 Jan 2021 16:22:21 GMT

Заголовок Last-Modified содержит дату и время последнего изменения документа.

<html>

  <head>

    <title>An Example Page</title>

  </head>

  <body>

    <p>Hello World</p>

  </body>

</html>

 

Тело ответа, в котором содержится HTML-код запрошенной страницы.

Коды состояния HTTP

Трехзначный код, возвращаемый сервером в стартовой строке ответа, называется кодом состояния HTTP. Он определяет результат совершения запроса. Коды состояния HTTP разработаны в соответствии со стандартами, определенными Инженерным советом Интернета (IETF).

Первая цифра кода указывает на класс состояния. В настоящее время выделено пять классов состояния:

  1. 1xx — Информационное сообщение (информирует о процессе передачи).
  2. 2xx — Сообщение об успехе (запрос получен и обработан).
  3. 3xx — Сообщение о перенаправлении (запрашиваемый ресурс был перемещен на другой адрес).
  4. 4xx — Сообщения об ошибках со стороны клиента (запрос содержит ошибки или не отвечает протоколу).
  5. 5xx — Сообщения об ошибках, относящихся к серверу (сервер не смог обработать запрос, хотя тот был составлен правильно).

Вторая и третья цифры в коде детализируют статус ответа. Например:

  • 200 OK — запрос получен и успешно обработан.
  • 201 Created — запрос получен и успешно обработан, в результате чего создан новый ресурс или его экземпляр.
  • 301 Moved Permanently — запрашиваемый ресурс был перемещен навсегда, и последующие запросы к нему должны происходить по новому адресу. Адрес, по которому клиенту следует произвести запрос, сервер указывает в заголовке Location.
  • 302 Moved Temporarily - ресурс перемещен временно.
  • 401 Unauthorized (Неавторизованный запрос) - для доступа к документу необходимо вводить пароль или быть зарегистрированным пользователем.
  • 404 Not Found — сервер не нашел ресурс по этому адресу.
  • 500 Internal Server Error - сервер столкнулся с непредвиденным условием, которое не позволяет ему выполнить запрос.
  • 503 Service Unavailable - сервис недоступен из-за временной перегрузки или отключения на техническое обслуживание.

Набор кодов состояния описан в соответствующих документах RFC https://datatracker.ietf.org/doc/html/rfc7231#section-6 («Request for Comments»), содержащих технические спецификации и стандарты, установленные IETF.

Вы можете проверить код статуса ответа страниц вашего сайта на сервисе Labrika в таблице «Свойства страниц сайта», расположенной в разделе «Инструменты».

Как работает веб-сервер и что такое HTTP-взаимодействие?

Что такое куки (сookie)?

Куки или cookie (от англ. «печенье») — это небольшой текстовый файл с набором служебных данных о посещении сайтов, который веб-сервер отправляет для сохранения в браузере пользователя.

Браузер всякий раз при попытке открыть страницу сайта пересылает cookie обратно веб-серверу.

Примеры использования cookie:

  • Автоматическая авторизация - с помощью cookie будут «запоминаться» логин и пароль.
  • Для сохранения информации о товарах, добавленных в корзину.
  • Для персонализации страниц с помощью cookie сохраняются личная информация и персональные настройки пользователя.
  • В инструментах веб-аналитики - для отслеживания действий пользователей и сбора статистики.

От сервера браузеру cookie передаются в составе HTTP-ответа с помощью заголовка Set-Cookie:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: имя=значение

Браузер отправляет их серверу в HTTP-запросе в заголовке Cookie:

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: имя=значение

Например, cookie могут содержать пароль, если пользователь авторизован на данном сайте:

GET /cart HTTP/1.1
Host: www.site.com
Referer: https://www.google.com/
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64)
Accept-Language: en-us
Cookie: login=joe@example.com; password=a497f4d4h7b956

Параметры HTTP-заголовков Cookie и Set-Cookie определяются в спецификации RFC 6265 https://tools.ietf.org/html/rfc6265.

Без cookie каждый просмотр веб-страницы является изолированным действием, не связанным с другими просмотрами страниц того же сайта. Сookie позволяют выявить связь между просмотрами веб-страниц одним и тем же пользователем.

Аутентификация пользователей (то есть проверка их подлинности) с помощью cookie происходит следующим образом:

  1. Пользователь вводит логин и пароль в соответствующих полях на странице входа и отправляет их на сервер.
  2. Сервер получает имя пользователя и пароль, проверяет их и, если они верные, отправляет страницу успешного входа, прикрепив cookie с неким идентификатором сессии. Эти cookie могут быть действительны не только для текущей сессии браузера, но и быть настроены на длительное хранение.
  3. Каждый раз, когда пользователь запрашивает страницу с сервера, браузер автоматически отправляет cookie с идентификатором сессии серверу. Сервер проверяет идентификатор по своей базе и, при наличии в ней такого идентификатора, «узнаёт» пользователя.

HTTP и HTTPS

При передаче по протоколу HTTP данные не защищаются и передаются в открытом виде.

Расширение HTTPS (аббр. от англ. HyperText Transfer Protocol Secure) создано для того, чтобы соединение было безопасным, а данные передавались в зашифрованном виде по криптографическому протоколу SSL (secure sockets layer) или TLS (transport layer security). Это специальная «обертка» поверх HTTP, которая шифрует данные, делая их недоступными для злоумышленников.

 

Чтобы сайт стал работать по протоколу безопасного соединения HТТPS, нужен SSL-сертификат, который содержит криптографические ключи, а также данные о веб-сайте и подтверждает его подлинность. Надежные сертификаты выдаются специальными удостоверяющими центрами. Подробнее о том, как получить SSL-сертификат, вы можете прочитать в отдельной статье на нашем сайте.

Схема передачи данных по протоколу HTTPS

  1. Браузер пользователя просит сайт предоставить SSL-сертификат для подтверждения подлинности веб-ресурса.
  2. Сайт, поддерживающий HTTPS, отправляет сертификат.
  3. Браузер проверяет легальность сертификата в центре сертификации.
  4. Браузер и сайт договариваются о секретном ключе для шифрования данных. Они делают это при помощи асимметричного шифрования, которое предполагает использование двух ключей — открытого (для шифровки отправляемого сообщения) и закрытого (для расшифровки полученного сообщения).
  5. Браузер и сайт передают информацию, используя симметричное шифрование, при котором данные зашифровываются и расшифровываются с помощью одного и того же общего ключа.

 

Синтаксически HTTPS идентичен протоколу HTTP, то есть использует те же стартовые строки и заголовки.

Значение HTTPS для SEO

Использование протокола HTTPS является значимым фактором ранжирования сайтов в результатах поиска. Ещё в 2015 году специалист Google Гэри Иллис заявил, что повышение рейтинга компании по протоколу HTTPS может стать решающим фактором, когда в остальном сигналы качества для двух результатов поиска равны (https://searchengineland.com/googles-gary-illyes-https-may-break-ties-between-two-equal-search-results-230691). Если поисковый робот обнаружит две одинаковые страницы - одну с HTTP, а вторую с HTTPS, он добавит в индекс страницу с безопасным протоколом.

Сайт, который не использует HTTPS-протокол, со временем может потерять свои позиции в поиске. Отсутствие HTTPS говорит пользователям и поисковым системам, что безопасность их данных находится под угрозой, а значит, отображать такой сайт на первых страницах выдачи и переходить на него не стоит.

Кроме того, в строке браузера, например, Google Chrome, рядом с адресом сайта без HTTPS ставится отметка «Не защищено».

Тогда как сайты, использующие безопасный протокол HTTPS, помечаются значком в виде замка.

Посмотреть данные о наличии на вашем сайте протокола HTTPS и SSL-сертификата, позволяющего использовать зашифрованное соединение, вы можете на сервисе Labrika в отчете «Безопасность» раздела «Технический аудит».

Протокол HTTPS обязательно должен быть на тех сайтах, которые запрашивают конфиденциальные данные пользователей: логины и пароли от аккаунтов, номера банковских карт, адреса электронной почты и т. п. В первую очередь это касается коммерческих ресурсов, социальных сетей, почтовых сервисов, сайтов с регистрацией пользователей.

Online SEO-инструменты для продвижения сайтов

Проверьте свой сайт и сайты конкурентов на 230 факторов поисковых систем.