PC Magazine/RE logo
©СК Пресс 1/97
e-mail: pcmagedt@aha.ru

PC Magazine, October 22, 1996, p. 245

Вы нажимаете на клавишу мыши...

Нейл Рэндл


HTTP - базовый протокол World Wide Web

Работа Internet основана на протоколах - стандартах, согласно которым компьютеры обмениваются данными. Без них Internet (как и любая другая сеть) не могла бы существовать вообще. TCP/IP (Transmission Control Protocol/Internet Protocol) - базовый протокол Internet. Однако отдельные функции управляютс протоколами более высокого уровня, которые накладываются на TCP/IP. При нормальной работе всех сетевых компонентов пользователи обычно не обращают внимания на протоколы. Но, когда вы устанавливаете в систему что-то новое или выполняете некоторые функции, эти протоколы напоминают о своем существовании. Ваш пакет электронной почты работает через почтовые протоколы Mail Transport Protocol (SMTP) и Post Office Protocol (POP), программа чтения новостей подключаетс через Network News Transfer Protocol (NNTP), а при копировании файлов вы используете протокол передачи файлов File Transfer Protocol (FTP). Волшебные возможности World-Wide Web в значительной мере обусловлены тем, что Web работает в многопротокольной среде. Именно благодаря этому с помощью своего Web-браузера вы можете обращаться к меню системы Gopher, FTP-узлам и другим услугам Internet.

Несмотря на то что в Web допускается применение нескольких протоколов, у нее есть свой собственный базовый протокол. Это HyperText Transfer Protocol (HTTP), с которым вам, возможно приходилось иметь дело много чаще, чем вам хотелось бы. HTTP управляет выборкой Web-документов (файлов в формате HTML), осуществляемой вашим Web-браузером, и, кроме того, взаимодействием в Web (используя такие инструменты, как формы). В настоящее время применяется HTTP версии 1.0, хотя версия 1.1 уже прошла несколько редактирований и вскоре будет принята в качестве стандарта группой Internet Engineering Task Force (IETF). Далее мы будем говорить о версии 1.1, поскольку многие ее элементы уже реализованы в современных браузерах.

HTTP приводится в действие каждый раз, когда вы либо щелкаете клавишей мыши на гиперсвязи, у которой адрес URL (Uniform Resource Locator) начинается с http://, либо набираете на клавиатуре сам указатель URL, начинающийся с этого префикса. На самом деле во многих современных браузерах (например, Netscape Navigator, Microsoft Internet Explorer и Attachmate Emissary) не нужно вводить этот префикс, поскольку предполагается, что все указатели URL начинаются с него (за исключением тех, у которых адресная часть начинается с ftp или gopher) и автоматически добавляют этот префикс в начало введенной строки. После активизации HTTP запускает четырехэтапный процесс: соединение, запрос, ответ и разъединение (или закрытие). И хотя с момента разработки первоначального варианта протокола в 1991 г. функции HTTP расширились, эти четыре этапа по-прежнему составляют основу процесса. В большинстве браузеров за выполнением этих этапов можно проследить с помощью строки состояния.

Поскольку HTTP - это протокол типа "запрос-ответ", ему для выполнения транзакций требуется наличие сервера и клиента. С появлением Web слово "сервер" стало обиходным, и большинство пользователей Internet знакомы с программным обеспечением Web-сервера. Серверы - это компьютеры, которые хранят информацию и предоставляют ее клиенту, направившему запрос. Термин "клиент" менее известен в Web, в основном потому, что вместо него используется термин браузер. Web-браузеры - клиенты HTTP. Эти программы посылают запросы и получают ответные сообщения. По сути транзакция HTTP означает передачу ASCII-сообщения клиентом и получение ответа на него от сервера. Различие лишь в содержании сообщения.

Соединение и разъединение

Первый и последний этапы транзакции HTTP представляют наименьший интерес, поэтому рассмотрим их вкратце. На первом этапе клиент устанавливает соединение с сервером. Для этого он анализирует им домена или IP-адрес в указателе URL, пытаясь установить контакт с соответствующей машиной. HTTP пробует использовать для соединения порт сервера, имеющий номер 80, если только в URL не указывается в явном виде другой номер порта.

Этап разъединения или закрытия выполняется в конце транзакции HTTP. Он инициируется либо сервером (по окончании передачи файла), либо клиентом (в тех случаях, если пользователь выполняет последовательность операций Stop, запускает новую транзакцию HTTP щелчком мыши на новой гиперсвязи либо использует кнопки Back и Forward в браузере либо свой список предыдущих команд). Обычно, чтобы передать информацию, требуетс устанавливать отдельное соединение для каждого элемента Web-страницы, однако в HTTP 1.1 предусмотрено длительное соединение под названием Keep Alive, при котором можно сохранить одно соединение для передачи нескольких файлов (например, графических изображений).

Запрос

После установления соединения начинается этап запроса. Клиент формирует запрос к серверу, посыла ASCII-сообщение, содержащее определенные строки и поля. В начальной части сообщения находится строка запроса, за которой следуют три строки заголовка: общий заголовок General Header, заголовок запроса Request Header и заголовок объекта Entity Header. После символа возврата каретки/перехода на новую строку следует поле, называемое "телом объекта" (Entity Body). Рассмотрим теперь каждую строку и поле в отдельности.

В строке запроса сообщения HTTP указан ряд деталей, в том числе способ запроса, унифицированный идентификатор ресурсов (Uniform Resource Identifier) и версия протокола. Прежде чем подробно рассмотреть способ запроса, остановимся кратко на унифицированном идентификаторе ресурсов и версии протокола. Обычно унифицированный идентификатор ресурсов (URI) представляет собой унифицированный указатель ресурсов (URL) или унифицированное имя ресурсов (Uniform Resource Name - URN) и просто указывает файл или иной ресурс сети. Версия протокола, как видно из названия, - это протокол HTTP, используемый в запросе. После этих описаний следует запрос, который содержит текст сообщения с различными управляющими параметрами и другой детальной информацией. Приведем простой пример.

Синтаксис запроса <METHOD> <URI> "HTTP/1.0" <crlf> {<Header>: <Value> <crlf>}* <crlf> Пример GET /Index.html HTTP/1.0 Accept: text/plain Accept: text/html Accept: */* User-Agent: Browser

Каждая строка запроса HTTP содержит способ запроса. Три общеупотребительных способа - Get, Head и Post. Кроме того, существуют еще Put и Delete. Наиболее часто используемый способ - Get - это команда серверу послать документ или объект клиенту. Обычно в запросе типа Get от Web-браузера содержится требование: "Прислать файл с таким-то указателем URL, чтобы я мог отобразить его содержание пользователю". В Get можно ввести условные операторы, определяющие даты изменений, диапазоны и соответствия. Само содержание указывается в поле Entity Body запроса. Этим Get отличается от способа Head. При использовании способа Head сервер посылает все, кроме Entity Body, т. е. информацию о файле, но не сам файл. С помощью способа Head можно проверить, является ли гиперсвязь действительной и был ли документ недавно изменен. Например, программы, отслеживающие обновление ваших закладок, направляют запрос Head.

Способ Post начинает все шире применяться в Web. Если вы строили формы HTML, то уже знакомы с ним, потому что именно он определяет, что делается с информацией, передаваемой через формы. Средство Post обращается к серверу с просьбой принять содержащуюся в нем информацию как дополнение к указанному идентификатору URI. Этот способ применяется, например, для помещения сообщений на доски объявлений World-Wide Web, добавления информации в базу данных и передачи данных из формы Web в сервер. Дальнейшая судьба этих данных зависит от самого сервера, они могут передаваться в базу данных в соответствии со сценарием общего интерфейса шлюза (Common Gateway Interface - CGI) или добавляться в заданном формате в HTML-документ для просмотра другими пользователями. Но все это уже выходит за рамки транзакции HTTP.

Средство Put аналогично Post. Из него в сервер поступает команда запомнить содержащуюся в нем информацию в виде файла (или ресурса), имя которого задается через идентификатор URI, имеющийся в запросе. Если такого файла нет, сервер создает новый, в противном случае новая версия файла записывается вместо старой. Основное различие способов Post и Put заключается в том, что в Post идентификатор URI задает имя ресурса, который принимает данные, имеющиеся в сообщении HTTP. Что с ними происходит дальше, зависит от сервера, и на самом деле может изменяться совсем не тот ресурс, который указывается в URI. В отличие от этого в способе Put идентификатор URI указывает на содержащуюся информацию, а не на ресурс сервера, и сервер может лишь сохранить эту информацию.

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

Строки заголовка запроса (Request Header) в сообщении HTTP могут содержать несколько различных полей. Заголовок Accept указывает, какой вид информации (например, аудио- и видеофайлы) может содержаться в ответном сообщении. В заголовках Accept-Charset и Accept-Encoding определяются наборы символов или методы кодирования, допустимые в ответном сообщении. Заголовок Authorization управляет санкционированием доступа дл браузера и сервера. С помощью заголовка Cache-Control можно задавать сложный набор управляющих команд дл кэширования. В HTTP 1.1 в значительной степени используется управление кэшем, которое стало за последний год важным элементом при проектировании Web и управлении ею. Остальные заголовки дают возможность указать местоположение и тип информации, текущую дату и срок хранения, подробные данные о сервере-посреднике (proxy) и даже информацию о браузере (User-Agent), который делает запрос. По мере того как повышаетс сложность Web, обусловленная растущим многообразием способов взаимодействия и все более тесной интеграцией различных новых видов информации и других возможностей, эти заголовки будут использоваться все чаще и чаще. Следует иметь в виду, что приведенный перечень далеко не полон.

Ответ

После того как браузер установил соединение с сервером и направил свой запрос, он ожидает ответного сообщения. Так же как и в запросе, в ответном сообщении содержится несколько строк информации. В начале сообщения идет строка состояния, за которой следует набор заголовков ответа, а затем требуемый документ или ресурс. Из-за наличия этого прикрепленного ресурса в большинстве случаев ответ занимает больше времени, чем запрос. Для запросов типа Post и Put ситуация может быть прямо противоположной, однако в настоящее врем большинство сообщений HTTP все еще являются простыми запросами типа Get.

В строке состояния содержатся номер версии HTTP, код состояния и комментарий. Коды состояния (status codes) - это трехразрядные указатели, описывающие способ обработки запроса, а комментарий (reason phrase) представляет собой короткое и ясное пояснение кода. Существует 5 категорий кодов состояния: 1xx - зарезервирован для детальной информации, 2xx - указывает на успешность выполнения запроса, 3xx - сообщает о перемещении идентификатора URI, 4xx - указывает на ошибку со стороны браузера, а 5xx - на наличие проблем со стороны сервера. Вы уже сталкивались с этими кодами. Например, 403 означает "запрещено", а 401 - "несанкционировано". Другие коды свидетельствуют, что указанный способ запроса недопустим (405), услуга не предоставляется (503), информация не может быть представлена в данном виде (415) и т.д. В действительности код состояния представляет непосредственный результат обработки данных запроса. Однако чаще всего формируемые коды состояния не видны: 200 означает "все нормально", и браузер не отображает этот код, а просто выводит на экран запрошенный файл. Приведем пример простого ответа.

Синтаксис ответа "HTTP/1.0" <result-code> [<message>] <crlf> {<Header>: <Value> <crlf>}* <crlf> Пример HTTP/1.0 200 OK Server: MDMA/0.1 MIME-version: 1.0 Content-type: text/html Last-Modified: Thu Jul 7 00:25:33 1994 Content-Length: 2003 <title>MDMA - Multithreaded Daemon for Multimedia Access</title> ..... [Разъединение осуществляется главным компьютером]

Так же как и запрос, ответное сообщение может иметь поля заголовков. В них содержатся сообщения программе клиента о том, какие способы допустимы (Allow), даетс информация о содержании сообщения (например, Content-Language, Content-Length и Content-Type), указываются даты изменения и т.д. С помощью этих заголовков браузер может правильно интерпретировать и отобразить на экране файл или ресурс. Вы можете увидеть некоторые из этих данных, выбрав в меню View программы Navigator команду Documents Info.

Дополнительные возможности HTTP

В HTTP постоянно добавляются новые возможности, чтобы охватить такие транзакции, как составление сценария для CGI, и решить проблемы защиты информации. Например, протокол Secure HTTP (S-HTTP) имеет дополнительные механизмы, которые обеспечивают использование цифровых подписей и других средств защиты (дополнительную информацию можно получить по адресу: www.commerce.net:8000/cgi-bin/textit?/information/ standards/drafts/shttp.txt). По мере усложнения способов взаимодействия процесс расширения базового протокола HTTP будет продолжаться. Поэтому, для того чтобы следить за функционированием сети, целесообразно просматривать содержимое Web-сервера W3Organization (www.w3.org). Полный протокол HTTP 1.0 можно получить в формате HTML по адресу: www:w3.org/pub/WWW/Protocols/HTTP/HTTP2.html, а спецификации HTTP 1.1 - по адресу: www:w3.org/pub/ WWW/Protocols/#ID1106.

Нейл Рэндл: автор и соавтор нескольких книг по Internet, в том числе: Guide to Netscape Navigator Gold (специальный выпуск), Using Microsoft FrontPage и выходящая из печати The Soul of the Internet. С ним можно связаться по адресу: nrandall@mariner.uwaterloo.ca.