Главная/ Учимся Javascript, CSS, HTML/ Тоже нужно знать/ Как работает браузер: HTTP запрос.

Как работает браузер: HTTP запрос.

Дата публикации: 18.10.2010

В предыдущей статье рассмотрели схемы обмена данными между браузером и сервером с помощью HTTP протокола и его запросов. Теперь познакомимся ближе с самим HTTP запросом.

Структура HTTP запроса

Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:

  1. строка запроса — указан метод запроса (HTTP-метод), URI, версия протокола;
  2. заголовки — характеризуют тело сообщения, параметры передачи и прочие сведения;
  3. тело сообщения — данные сообщения.

Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом. Например, строка запроса может выглядеть так:

GET http://www.mpbox.ru/ HTTP/1.1

Остановимся более подробно на методах запроса.

Методы HTTP

Метод указывает какая операция будет производится над ресурсом, представляет собой короткое английское слово, записанное заглавными буквами. Название метода чувствительно к регистру. В спецификации HTTP 1.1 определены следующие методы: OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, LINK, UNLINK. Чтобы не перегружать мозг избыточной информацией рассмотрим используемые чаще всего.

Метод GET

GET — используется для запроса содержимого указанного ресурса. Это с его помощью браузер получает HTML код конкретной страницы и все ее объекты (изображения, CSS и т.п). Тело такого запроса является пустым. Ответ может кэшироваться. GET запрос может передать параметры на сервер для уточнения запрашиваемых данных. Параметры запроса содержаться в адресе запроса, отделяются от URI знаком «?», пары параметр-значение разделяются символом «&». Подобный адрес запроса может выглядеть так:

http://www.domain-name.com?param1=value1&param2=value2

Кроме обычных GET запросов, есть еще условные и частичные.

Условный GET

Условный GET запрос (conditional GET) предназначен для уменьшения ненужной загрузки сети, и позволяет обновлять кэшированные объекты без пересылки данных, уже сохраненных клиентом. Условный GET содержит в своем заголовке определенные условия и данные получает от сервера, только если ответ удовлетворяет запрашиваемым условиям. Спецификацией HTTP 1.1 определены условия: If-Modified-Since, If-Match, If-None-Match, If-Range. Наиболее часто ныне используется If-Modified-Since, которым задается дата и время последнего изменения объекта. При последующем обращении к данному ресурсу, браузер проверит значение этого заголовка, если он не изменился, объект возьмется из кэша клиента.

Частичный GET

Частичный GET запрос (partial GET) предназначен для уменьшения ненужной загрузки сети. Позволяет собирать объект из частей без передачи данных уже имеющихся на стороне клиента и потому запрашивает передачу только части объекта. Используется заголовок Range.

Метод POST

POST предназначен для передачи данных на сервер. Тело такого запроса обычно содержит данные. Сообщение ответа сервера на выполнение метода POST не кэшируется. Этот метод второй по популярности использования, в основном его применяют в веб формах для получения каких-то данных от пользователей ресурса (формы входа, регистрации, отправка сообщений и т.п.).

Заметка

HTTP запросы можно разделить на безопасные (когда пользователь просто запрашивает данные и не может повлиять на работу сервера) и небезопасные (когда пользователь отправляет серверу определенные данные и потенциально может повлиять на его работу).

URI и версия протокола

URI — это последовательность символов (строка), идентифицирующая абстрактный или физический ресурс.

Версия протокола служит для указания, с какой версией протокола способен работать клиент/сервер и выглядит в виде HTTP/[версия]. Сейчас большинство поддерживают версию 1.1.

Заголовки HTTP

Каждый запрос имеет как минимум свой заголовок, который сообщить серверу информацию о своей конфигурации и данные о форматах документов, которые он может принимать. Заголовок представлен в текстовом виде. Например:

GET / HTTP/1.1
Host: www.google.com.ua
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6 GTB7.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PREF=ID=2578ccacb1ecf2aa:U=3a0a80ae418769c4:TM=1264579766:LM=1284111039:DV=sTIUytipGDoC:S=N0XC7wB0v7c6CCnH;

Такой заголовок имеет вес равный 956b.

Каждый ответ состоит из трех частей: строка состояния (содержит три поля: версию HTTP, код состояния и описание), заголовок ответа (информация о сервере и передаваемых данных) и сами данные. Первые две части представлены тоже в текстовом виде и выглядит это примерно так:

Request URL:http://ksayri.info/
Request Method:GET
Status Code:200 OK

Accept-Ranges:bytes
Connection:close
Content-Encoding:gzip
Content-Length:2553
Content-Type:text/html
Date:Fri, 08 Oct 2010 08:35:53 GMT
ETag:"9cb33-1638-490d5608b0540"
Last-Modified:Wed, 22 Sep 2010 09:00:29 GMT
Server:Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny8 with Suhosin-Patch
Vary:Accept-Encoding

Только первые две части в особо тяжелых случаях могут весить 0.5 килобайт.

Это все к тому, что твой дополнительный однопиксельный gif на веб странице весом всего лишь 43 байта может вылиться в 130 с лишним мегабайт трафика при всего лишь 100 000 посетителях. Это еще одна причина для чего лучше сокращать число отдельных запросов к серверу.

Заметка

Вес передаваемых данных не влияет на размер заголовка.

Установка HTTP заголовков

Добраться до этих заголовков можно только с помощью настроек сервера и/или серверными скриптами.

При первом запросе браузером объекта (HTML страницы, картинки или любого другого) сервер присылает ответ, содержащий HTTP заголовки. Клиент их сохраняет вместе с адресом запроса. При повтором обращении по этому адресу браузер уже будет снабжен необходимыми заголовками.

Тело HTTP заголовка

Пока не нашел информации по этой части запроса, которая была бы полезной HTML кодеру, поэтому в этой статье рассматривать ее не буду.

По теме