HTTP. Часть 3. Что такое транзакция HTTP.

Http заголовки

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

Вот что при этом происходит:

  1. Пользователь набирает в браузере URL-адрес:
    • http://feedster.com/status.php
  2.  Браузер разбирает URL-адрес и решает следующее:
    • Использовать протокол HTTP.
    • Извлечь запрошенный URL-адрес с компьютера, находящегося на feedster. com.
    • Получить информационный ресурс, известный, как /status .php. Это называется путем.
  3. Данная порция информации транслируется в транзакцию HTTP, выглядящую следующим образом:
    GET /status.php
    HTTP/1.1

    Accept: image/gif, image/png, image/jpeg, */*
    Accept-Language: en-us
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; .NET CLR 1.1.4322)
    Host: feedster.com Connection: Keep-Alive

Хотя некоторые из пунктов приведенной транзакции и необязательны, эти несколько строк ASCII-текста сопровождают почти каждую HTTP-транзакцию в Web. Вот что они значат:

  • GET — что нужно сделать. Это называется методом HTTP и звучит приблизительно так: «Дай мне информацию, находящуюся в /status.php, и вышли ее, используя протокол HTTP 1.1».
  • Accept — «я могу понимать информацию в следующих форматах».
  • Accept-Language — «язык, который я понимаю — английский, американский диалект». Это позволяет серверу отправлять в ответ разное содержимое в соответствии с указанным языком.
  • Accept-Encoding — «мне можно отправлять данные в сжатом виде, поскольку я понимаю типы сжатия gzip и deflate».
  • Вы должны понимать, что хотя браузер воспринимает сжатие, сервер не будет использовать его автоматически. Большинство серверов в Internet не сжимают передаваемую информацию, если только администратор специально не включит сжатие.
  • User-Agent — «тип моего браузера — Microsoft Explorer 6, выполняющийся под управлением Windows 98».
  • Host — «доставь мне информацию /status.php с компьютера, находящегося на feedster.com».
  • Connection — «держи подключение HTTP открытым, пока браузер не закроет его». Это повышает производительность, поскольку соединение не нужно закрывать (и впоследствии снова открывать) для каждого подключения. Без Keep-Alive Web-страница с тремя изображениями на ней технически будет иметь четыре подключения (по одному для каждой картинки и одно — для самой страницы).

Из всех этих строк кода, составляющих запрос HTTP, только первая является методом HTTP — командой, которая что-то делает. Другие строки называются заголовками и представляют различные метаданные обо всей транзакции.
Теперь, когда Web-сервер получает запрос вроде этого, он должен ответить, и его ответ выглядит следующим образом:

  1. Просмотр информации на сервере, которая представлена /status .php.
  2. Если информация на сервере существует, оправка ее клиенту (браузеру) в следующем виде:
    НТТР/1.1 200 0К
    Date: Mon, 08 Dec 2003 16:46:40 GMT

    Server: Apache/1.3.27 (Unix) mod_throttle/3.1.2 PHP/4.3.2

    X-Powered-By: PHP/4.3.2

    X-Accelerated-By: PHPA/1.3.3r2
    Connection: close
    Content-Type: text/html;
    charset=utf-8
    <html lang=»en-US» xml:lang=»en-US» xmlns=»http://www.w3.org/1999/xhtml»> <head> <script>
    [Остаток Web-страницы не показан]

HTTP ответ

Если вы посмотрите на этот HTTP-ответ, то увидите, что он состоит из двух частей. В начале идет порция сведений о самой запрошенной информации. Это называется заголовком ответа (response header). Затем идет пустая строка и далее — сама запрошенная информация. Эта вторая часть называется телом (body), сущностью (entity) или телом сущности (entity-body).

Вот что означают части заголовка:

  • НТТР/1.1 — первая строка сообщает клиенту (браузеру), как информация будет отправлена (по протоколу HTTP версии 1.1), и что запрошенная информация успешно найдена. Код 200 состояния HTTP означает: «Все хорошо, документ найден и сейчас будет отправлен».
  • Date — сообщает клиенту дату, установленную на сервере, с которого поступает информация. Стандартный часовой пояс — GMT, то есть время по Гринвичу.
  • Server — каков тип сервера, предоставляющего информацию.
  • X-Powered-By — каким инструментом поддерживается сервер (конечно, РНР).
  • X-Accelerated-By — какой инструмент повышает производительность сервера (эти два Х-заголовка не обязательны и специфичный для конкретной конфигурации сервера).
  • Connection — сообщает клиенту, что соединение будет закрыто после того, как сервер завершит отправку информации.
  • Content-Type — сообщает клиенту, какой тип содержимого будет отправлен. В дополнение также указывается набор символов.

НА ЗАМЕТКУ
Очень полезное средство для понимания запросов HTTP — это HTTP Headers bookmarklet, который показывает заголовки HTTP для любой Web-страницы. Вы можете загрузить его с http://tantek.com/favelets/.