Постоянные соединения делятся на два класса: с конвейеризацией и без конвейеризации. В соединениях без конвейеризации клиент посылает серверу новый запрос после того, как завершается прием текущего объекта. Это позволяет сократить время выполнения запроса на величину времени оборота по сравнению с непостоянными соединениями. Тем не менее даже такой заметный прогресс не является пределом; соединения с конвейеризацией имеют еще меньшее время выполнения запроса. Обратите внимание на еще один недостаток соединений без конвейеризации: после окончания передачи ответа сервер простаивает, ожидая нового запроса. Это приводит к неэкономному расходованию серверных ресурсов.
По умолчанию протокол HTTP 1.1 настроен на использование постоянных соединений с конвейеризацией. В этом режиме клиент формирует запрос сразу после обнаружения ссылки на объект. Это позволяет новому запросу направляться к серверу, не дожидаясь окончания обслуживания других запросов. Аналогично, сервер, получая новые запросы, начинает их немедленное обслуживание. Очевидны достоинства конвейерного механизма: временные расходы на установление соединения сводятся к одной задержке на время оборота для всей web-страницы, а время простоя сервера значительно сокращается.
9.4 Формат HTTP-сообщения
Описания протокола HTTP, содержащиеся в документах RFC 1945 и RFC 2616, определяют формат сообщений, предназначенных для обмена между клиентом и сервером. В HTTP существуют два типа сообщений: запросы и ответы, которые будут рассмотрены ниже.
Сообщение-запрос
Типичное сообщение-запрос протокола HTTP выглядит следующим образом:
GET /somediг/page. html HTTP/1.1
Host: www. someschool. edu
Connection: close
User-agent: Mozilla/4.0
Accept-language:fr
Это сообщение, несмотря на свою простоту, весьма наглядно демонстрирует формат, используемый в HTTP. Как можно видеть, сообщение представляет собой совокупность вполне понятных человеку текстовых символов в кодировке ASCII. Сообщение состоит из пяти строк, каждая из которых оканчивается парой символов для перехода на новую строку (возврат каретки и перевод строки), а последняя строка — дополнительной парой указанных символов. В общем случае число строк сообщения может быть как больше, так и меньше пяти (вплоть до одной строки).
Первая строка называется строкой запроса, а следующие строки — строками заголовка. Строка запроса содержит три поля: поле метода, поле URL и поле версии HTTP. Поле метода может принимать различные значения, например GET, POST и HEAD. Метод GET является наиболее часто используемым методом протокола HTTP и применяется в случаях, когда требуемый объект идентифицируется URL-адресом. Приведенное сообщение содержит URL-адрес /somedir/page. html. Поле версии HTTP не требует дополнительных комментариев и в нашем примере содержит запись НТТР/1.1.
Теперь рассмотрим строки заголовка. Строка Host: www. someschool. edu содержит адрес хоста, на котором находится объект. С помощью строки Connection: close браузер сообщает серверу о том, что не следует использовать постоянное соединение, и установленное ТСР-соединение должно быть закрыто сразу после передачи требуемого объекта. Обратите внимание, что при этом браузер поддерживает версию 1.1 протокола HTTP. В строке The User-agent: указан агент пользователя, то есть тип браузера, сгенерировавшего запрос. В данном случае это браузер Mozilla 4.0 фирмы Netscape. Строка User-agent: является весьма полезной, поскольку на сервере могут храниться несколько версий одного документа, предназначенных для разных браузеров и адресуемых одним URL-адресом. Наконец, строка Accept-language: указывает на то, что пользователю по возможности должна быть выслана версия документа на французском языке (в случае ее наличия на сервере); в противном случае будет выслана версия документа на языке, заданном по умолчанию. Строка Accept-language: является одной из множества заголовочных строк согласования данных, предусмотренных протоколом HTTP.

Рис.3.6 Общий формат сообщения-запроса
Рассмотрев конкретный пример, обратимся теперь к общему формату запроса, представленному на рис. 3.6. Как можно видеть, пример вполне соответствует этому формату; тем не менее после строк заголовка и пустой строки формат сообщения предусматривает наличие тела сообщения. Тело сообщения остается пустым при использовании метода GET и заполняется при использовании метода POST. Метод POST применяется в случаях, когда пользователь заполняет формы, например вводит слово для поиска в поисковой системе. Заполнение форм приводит к генерации запроса, а содержимое web-страницы зависит от данных, введенных в формы. Итак, если поле метода содержит значение POST, то в теле сообщения находятся данные, введенные в формы.
Необходимо отметить, что в запросах, создаваемых с помощью форм, не всегда применяется метод POST. Напротив, HTML-формы часто используют метод GET и подставляют введенные значения в URL-адрес требуемой страницы. К примеру, если пользователь ввел в формы два значения, monkeys и bananas, то запрашиваемый с помощью метода GET URL-адрес будет иметь вид www. /ani-malsearch? monkeys&bananas. Вполне вероятно, что вы нередко встречали подобные конструкции, путешествуя в web.
Метод HEAD схож с методом GET. При получении запроса с методом HEAD сервер формирует ответ, однако не осуществляет пересылку объекта. Разработчики приложений часто используют метод HEAD для отладки ошибок.
В спецификации НТТР/1.0 указаны лишь три метода: GET, POST и HEAD. Спецификация НТТР/1.1 располагает более широким набором методов, в который, кроме перечисленных выше, входят PUT и DELETE. Метод PUT часто применяется в средствах web-публикаций и позволяет поместить объект с заданным URL-адресом на web-сервер, а метод DELETE — удалить объект, расположенный на web-сервере.
Сообщение-ответ
Ниже приведен пример типичного ответа, генерируемого HTTP-сервером.
НТТР/1.1 200 ОК Connection: close
Date: Thu. 06 Aug 1998 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Mon. 22 Jun 1998 09:23:24 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data …)
Рассмотрим структуру этого сообщения. Оно состоит из трех частей: строки состояния, шести строк заголовка и тела сообщения. Тело сообщения содержит требуемый объект. Строка состояния образована из трех полей: поля версии протокола, поля кода состояния и поля соответствующей коду информации, описывающей это состояние. В данном примере строка состояния говорит о том, что сервер использует спецификацию НТТР/1.1, требуемый объект найден и осуществляется его пересылка.
Теперь обратимся к строкам заголовка. Сервер использует строку Connection: close для уведомления клиента о том, что ТСР-соединение будет закрыто после того, как окончится пересылка объекта. Строка The Date: содержит дату и время создания ответа. Обратите внимание, что эта дата не относится к созданию или последнему изменению объекта, а указывает момент извлечения объекта из места его хранения и включения в тело сообщения. Строка Server: говорит о том, что сообщение было создано сервером Apache, и она аналогична строке User-agent: в сообщении-запросе. Строка Last-Modified: содержит дату и время создания или последнего изменения объекта. Как мы увидим немного позже, содержимое строки Last-Modified: крайне важно для кэширования объектов как на локальных клиентах, так и на сетевых кэш-серверах (часто называемых прокси-серверами). Строка Content-Length: содержит размер пересылаемого объекта в байтах, а строка Content-Type: указывает на то, что объект является текстом в формате HTML (обратите внимание, что тип объекта определяется содержимым строки Content-Type: и не зависит от расширения файла).
Если сервер получает запрос, в котором указана версия НТТР/1.0, постоянное соединение не будет использоваться, даже при поддержке сервером протокола НТТР/1.1. Это необходимо потому, что спецификация HTTP 1.0 не предусматривает постоянных соединений.
Рассмотрев частный случай, обратимся к общему формату ответного сообщения, представленному на рис. 3.7.

Рис.3.7 Общий формат сообщения-ответа
Как можно убедиться, наш пример также полностью соответствует приведенному формату. Теперь скажем несколько слов о том, что означают поля кода состояния и информации о состоянии. Эти два поля взаимосвязаны и фактически отражают результат обработки запроса. Ниже приведены несколько наиболее часто встречающихся пар, содержащих код состояния и информацию об этом состоянии.
200 OK:
Запрос успешно обработан, объект получен и включен в ответ.
301 Moved Permanently:
Объект был перемещен; новый URL-адрес указан в строке ответа Location:.
Программа клиента автоматически выполнит запрос по новому адресу.
400 Bad Request:
Общая ошибка, вызванная невозможностью интерпретации запроса сервером.
404 Not Found:
Запрашиваемый документ не найден на сервере.
505 HTTP Version Not Supported:
Указанная в запросе версия HTTP не поддерживается сервером.
Мы рекомендуем вам на практике ознакомиться с ответными HTTP-сообщениями. Для этого организуйте удаленный доступ к какому-либо серверу с помощью программы Telnet, а затем введите однострочный запрос объекта, находящегося на этом сервере. Например, для UNIX-машины это может выглядеть следующим образом:
telnet www. eurecom. fr 80
GET /-ross/index. htnilHTTP/1.0
После ввода второй строки следует дважды нажать клавишу ввода. В результате будет установлено ТСР-соединение с портом 80 хоста www. eurecom. fr и отправлен запрос в виде команды GET. На вашем экране появится базовый HTML-файл домашней web-страницы профессора Росса. Если вам не нужно содержимое файла, достаточно заменить во второй строке слово GET словом HEAD. Теперь замените путь /-ross/index. html на/-ross/banana. html и посмотрите, какой ответ вы получите в этом случае.
В этом разделе мы изучили несколько типичных строк заголовка, которые могут использоваться в запросах и ответах протокола HTTP. В спецификациях HTTP (особенно 1.1) содержатся описания гораздо большего количества строк заголовка, используемых браузерами, web-серверами и сетевыми кэш-серверами. Мы столкнемся с несколькими новыми строками в процессе изучения web-кэширования в конце этой главы; тем не менее за подробной информацией о НТТР/1.1 следует обратиться к. Замечательным введением в проблематику web является.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |


