Как видно на рисунке все транзакции между клиентом и сервером происходят на верхнем уровне сетевой иерархии. Все HTTP-транзакции имеют один общий формат. Каждый запрос клиента и ответ сервера состоит из трех частей: строки запроса (ответа), раздела заголовка и тела.
Клиент инициирует транзакцию следующим образом:
- Клиент устанавливает связь с сервером по назначенному номеру порта (по умолчанию - 80). Затем посылается запрос документа с указанием HTTP комманды (называемой методом), адреса документа и номера версии HTTP. Например:
GET /index.html HTTP/1.0
- Клиент посылает необязательную информацию заголовка, чтобы сообщить серверу информацию о своей конфигурации и данные о форматах документов, которые он может принимать. Вся информация заголовка указывается построчно и каждая строка содержит пару имя-значение. Заголовок завершается пустой строкой. Например:
User-Agent: Mozilla/2.02Gold (WinNT; I)
Accept: image/gif, image/jpeg, */* - Послав запрос и заголовки, клиент может отправить дополнительные данные (тело запроса). Эти данные используются, например, CGI-программами, применяющими метод POST.
Сервер отвечает на запрос клиента следующим образом:
- Первая часть ответа - строка состояния, содержащая версию протокола HTTP, код состояния и описание, которое представляет собой просто понятный для человека текст, поясняющий код состояния. Например:
HTTP/1.0 200 OK
- После строки состояния сервер передает клиенту информацию заголовка ответа, содержащую данные о самом сервере и затребованном документе. Завершает заголовок пустая строка. Например:
Date: Fri, 20 Sep 1996 08:17:58 GMT
Server: NCSA/1.5.2
Last-modified: Mon, 17 Jun 1996 21:53:08 GMT
Content-type: text/html
Content-length: 2482 - Если запрос клиента успешен, то сервер посылает затребованные данные. Это может быть копия файла или документ сформированный "на лету". Если запрос клиента удовлетворить нельзя, то сервер передает дополнительные данные в виде удобного для человека разъяснения причин, по которым сервер не смог выполнить запрос.
В HTTP 1.0 после передачи сервером затребованных данных следует разъединение с клиентом и транзакция завершается, если не был передан заголовок Connection: Keep Alive. В HTTP 1.1 сервер по умолчанию не разрывает соединение и клиент может посылать другие запросы. Это позволяет сэкономить время и затраты клиента, которому не приходится заново соединяться с тем же сервером. Таким образом, в HTTP 1.1 транзакция может циклически повторяться, пока клиент или сервер не закроет соединение явно.
Методы
Метод - это HTTP-комманда, с которой начинается первая строка запроса клиента. Метод сообщает серверу о цели запроса. Чаще всего используются методы GET, HEAD и POST (регистр имеет значение).
- GET
- Этим методом запрашивается информация, расположенная на сервере в указанном в запросе месте. Методом GET web браузеры обычно получают документы для визуализации. Результатом такого запроса может быть, например, файл, лежащий на сервере или же сформированный специально для этого запроса. Например:
GET / HTTP/1.0
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */* - HEAD
- Метод HEAD аналогичен методу GET, за исключением того, что сервер не посылает тело ответа, а только информацию заголовка о запрошенном файле или ресурсе. Обычно этот метод используется для получения информации о документе не получая документ. Можно, например, затребовать следующую информацию:
- время изменения документа;
- размер документа;
- тип документа;
- тип сервера.
Следует отметить, что большая часть посылаемой сервером информации заголовка, не является обязательной и может представляться не всеми web серверами. Например:
HEAD / HTTP/1.0
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */* - POST
- Этот метод позволяет посылать на сервер данные в запросе клиента. Эти данные могут быть использованы сервером для динамической генерации запрашиваемого документа, например для передачи входных данных для:
- сетевых служб (например телеконференций)
- программ с интерфейсом типа "коммандная строка"
- выполнения операций в базах данных
Например:
POST / HTTP/1.0
Обратите внимание на атрибуты Content-type и Content-length они используются для того, чтобы указать серверу на тип кодирования тела запроса и дать информацию о длине тела. Подробнее вы можете почитать в соответствующем RFC (HTTP 1.0 - rfc1945 или HTTP 1.1 - rfc2068).
User-Agent: Simple Web client by Eugen Kuleshov
Accept: */*
Content-type: application/x-www-form-urlencoded
Content-length: 16
test=20&test2=22