Все HTTP-транзакции имеют один общий формат. Каждый запрос клиента и ответ
сервера состоит из трех частей: строки запроса (ответа), раздела заголовка и
тела. Клиент инициирует транзакцию следующим образом:
1. Клиент устанавливает связь с сервером по назначенному номеру порта (по
умолчанию - 80). Затем клиент посылает запрос документа, указав HTTP-команду,
называемую методом, адрес документа и номер версии HTTP. Например, в запросе GET /index.html HTTP/1.0
используется метод GET, которым с помощью версии 1.0 HTTP запрашивается
документ index.html. Методы HTTP более подробно рассматриваются ниже.
2. Клиент посылает информацию заголовка (необязательную), чтобы сообщить
серверу информацию о своей конфигурации и данные о форматах документов, которые
он может принимать. Вся информация заголовка указывается построчно, при этом в
каждой строке приводится имя и значение. Например, приведенный ниже заголовок,
посланный клиентом, содержит его имя и номер версии, а также информацию о
некоторых предпочтительных для клиента типах документов: User-Agent: Mozilla/4.05 (WinNT; 1)
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Завершается заголовок пустой строкой.
3. Послав запрос и заголовки, клиент может отправить и дополнительные данные.
Эти данные используются главным образом теми CGI-программами, которые применяют
метод POST. Клиенты (например, Netscape Navigator-Gold), также могут
использовать их для помещения отредактированной страницы обратно на Web-сервер.
Сервер отвечает на запрос клиента следующим образом:
1. Первая часть ответа сервера - строка состояния, содержащая три поля:
версию HTTP, код состояния и описание. Поле версии содержит номер версии HTTP,
которой данный сервер пользуется для передачи ответа.
Код состояния - это трехразрядное число, обозначающее результат обработки
сервером запроса клиента. Описание, следующее за кодом состояния, представляет
собой просто понятный для человека текст, поясняющий код состояния. Например,
строка состояния НТТР/1.0 200 OK
говорит о том, что сервер для ответа использует версию HTTP 1.0. Код
состояния 200 означает, что запрос клиента был успешным и затребованные данные
будут переданы после заголовков.
2. После строки состояния сервер передает клиенту информацию заголовка,
содержащую данные о самом сервере и затребованном документе. Ниже приведен
пример заголовка: Date: Fri, 10 Jan 1998 08:17:58 GMT
Server: Apache/1.2.6
Last-modified: Mon, 12 Jun 1997 21:53:08 GMT
Content-type: text/html
Content-length: 2482
Завершает заголовок пустая строка.
3. Если запрос клиента успешен, то посылаются затребованные данные. Это может
быть копия файла или результат выполнения CGI-программы. Если запрос клиента
удовлетворить нельзя, передаются дополнительные данные в виде понятного для
пользователя разъяснения причин, по которым сервер не смог выполнить данный
запрос.
В HTTP 1.0 за передачей сервером затребованных данных следует разъединение с
клиентом, и транзакция считается завершенной, если не передан заголовок
Connection: Keep Alive. В HTTP 1.1 сервер по умолчанию не разрывает соединение и
клиент может посылать другие запросы. Поскольку во многие документы встроены
другие документы - изображения, кадры, апплеты и т.д., это позволяет сэкономить
время и затраты клиента, которому в противном случае пришлось бы для получения
всего одной страницы многократно соединяться с одним и тем же сервером. Таким
образом, в HTTP 1.1 транзакция может циклически повторяться, пока клиент или
сервер не закроет соединение явно.
HTTP не сохраняет информацию по транзакциям, поэтому в следующей транзакции
приходится начинать все заново. Преимущество состоит в том, что HTTP сервер
может обслужить в заданный промежуток времени гораздо больше клиентов, ибо
устраняются дополнительные расходы на отслеживание сеансов от одного соединения
к другому. Есть и недостаток: для сохранения информации по транзакциям более
сложные CGI-программы должны пользоваться скрытыми полями ввода или внешними
средствами, например "ключиками" (cookies) Netscape.
|