HTTP (Hypertext Transfer Protocol) - основной протокол используемый в Web. Несмотря на то, что протокол называется протоколом передачи гипертекста (т.е. HTML), на самом деле HTTP протокол может использоваться (и используется) для передачи практически любых данных в сети. Это передача и текста, и изображений, и файлов. Популярность HTTP связана с несколькими факторами: это использование достаточно универсальной URL адресации, способность передавать любые данные (как от клиента серверу так и наоборот), а также работа в режиме on-line (т.е. передача данных непосредственно между клиентом и сервером, без посредников). HTTP протокол можно назвать дуальным, в том смысле, что в системе клиент-сервер данные могут идти в двух направлениях, и от клиента к серверу и наоборот от сервера к клиенту. Однако сам синтаксис HTTP нацелен именно на передачу данных от клиента к серверу.
HTTP/1.0 используется также для коммуникаций между различными пользовательскими броузерами (клиентами) и шлюзами, дающими гипермедиа доступ к существующим Internet протоколам, таким как SMTP, NNTP, FTP, Gopher, WAIS. HTTP/1.0 разработан так, чтобы позволять таким шлюзам через proxy серверы, без какой-либо потери передавать данные с помощью упомянутых протоколов более ранних версий.
HTTP основывается на парадигме запросов/ответов. Запрашивающая программа (клиент) устанавливает связь с обслуживающей программой-получателем (сервер) и посылает запрос серверу в следующей форме:
метод запроса,
URL,
версия протокола,
MIME-подобное сообщение, содержащее управляющую информацию запроса (параметры), информацию о клиенте и, может быть, тело сообщения.
Все, что предшествует телу сообщения, является заголовком запроса.
Сервер отвечает сообщением, содержащим строку статуса (включая версию протокола и код статуса - успех или ошибка), за которой следует MIME-подобное сообщение, включающее в себя информацию о сервере, метаинформацию о содержании ответа, и, вероятно, само тело ответа.
В Internet коммуникации обычно основываются на TCP/IP протоколах. Для WWW номер порта по умолчанию -- TCP:80, но также могут быть использованы и другие номера портов - это не исключает возможности использовать HTTP в качестве протокола верхнего уровня.
Для большинства приложений сеанс связи открывается клиентом для каждого запроса и закрывается сервером после окончания ответа на запрос. Тем не менее, это не является особенностью протокола. И клиент, и сервер должны иметь возможность закрывать сеанс связи, например, в результате какого-нибудь действия пользователя. В любом случае, разрыв связи, инициированный любой стороной, прерывает текущий запрос, независимо от его статуса.
Рассмотрим простейший пример HTTP - запроса. Если в адресном окне браузера мы наберем адрес http://yandex.ru, то браузер определит IP адрес сервера yandex.ru и пошлет ему на 80-й порт такой HTTP запрос:
Запрос передается в незашифрованном текстовом виде. Самая главная часть запроса расположена в первой строке: Это тип запроса (GET), URL адрес запрашиваемого документа(http://yandex.ru) и версия HTTP протокола (HTTP/1.0). Далее перечисляются параметры запроса. Каждая строка соответствует одному параметру. В начале строки идет имя параметра, затем двоеточие и значение параметра.
Accept - тип данных, которые может принять браузер (в кодировке MIME).
Accept-Language - предпочтительный язык, на котором браузер хочет принять данные. User-Agent - тип программы, которая отослала запрос.
Host – DNS (или IP) имя хоста, которому адресован запрос.
Cookie - кукисы (данные, которые были сохранены сервером на локальном диске клиента, при посещении данного хоста прошлый раз).
Referer - хост, со страницы которого мы отсылаем запрос. Так, например, если мы находимся на странице http://narod.ru, и нажимаем там ссылку http://yandex.ru, то запрос будут отправлен хосту yandex.ru, а поле запроса referer будет содержать имя хоста narod.ru.
Набор параметров запроса не фиксирован. Помимо приведенных, могут присутствовать и другие параметры.
Наиболее интересны такие параметры, как referer и cookie. Эти параметры используются, в основном, для идентификации пользователя сервером.
Запрос GET может содержать данные, передаваемые клиентом серверу. Они передаются непосредственно через URL адрес по CGI протоколу. Данные отделены от URL знаком “?” и соединяются знаком “&”:
GET <URL>?<параметр 1>=<значение 1>&<параметр 2>=<значение 2>&…
Такой тип передачи данных серверу удобен, однако имеет ограничения на объем. Слишком большие массивы данных передавать через URL нельзя. Для таких целей существует другой тип зпросов: запрос POST. Запрос POST очень похож на GET, с той лишь разницей, что данные в запросе POST передаются отдельно от самого заголовка запроса:
Тело запроса должно отделяться от заголовка пустой строкой. Если сервер встречает пустую строку в POST запросе, то все что идет далее он считает телом запроса (передаваемыми данными). Отметим следующее: формат даных в теле POST запроса произволен. Несмотря на то, что чаще всего применяется CGI формат, он не обязателен. Кроме того, POST запрос не требует наличия тела запроса, и может передавать данные также и через URL.
Помимо CGI формата, иногда для передачи больших объемов информации (например файлов) применяют т.н. multipartформат (формат передаваемых данных определяется параметром Content-Type):