HTTP (от англ.
HyperText Transfer Protocol — «протокол передачи гипертекста») — сетевой протокол прикладного уровня для передачи файлов. В стеке TCP/IP для HTTP зарезервированы[1] порты 80 и 8080 транспортных протоколов TCP и UDP (на практике используется только первый).
Основным назначением протокола HTTP является передача веб-страниц (текстовых файлов с разметкой HTML),
хотя с помощью него с успехом передаются и другие файлы, как связанные
с веб-страницами (изображения и приложения), так и не связанные с ними
(в этом HTTP конкурирует с более сложным FTP).
HTTP предполагает, что клиентская программа — веб-браузер — способна отображать гипертекстовые веб-страницы и файлы других типов в удобной для пользователя форме.
Для правильного отображения HTTP позволяет клиенту узнать язык и кодировку веб-страницы и/или запросить версию страницы в нужных языке/кодировке, используя обозначения из стандарта MIME.
История развития
HTTP/0.9
HTTP был предложен в марте 1990 года Тимом Бернерсом-Ли, работавшим тогда в CERN, как механизм для доступа к документам в Интернете и облегчения навигации посредством использования гипертекста. Самая ранняя версия протокола HTTP/0.9 была впервые опубликована в январе 1992 г. (хотя реализация датируется 1990 годом). Спецификация протокола привела к упорядочению правил взаимодействия между клиентами и серверами HTTP, а также чёткому разделению функций между этими двумя компонентами. Были задокументированы основные синтаксические и семантические положения.
HTTP/1.0
В мае 1996 года для практической реализации HTTP был выпущен информационный документ
RFC 1945, что послужило основой для реализации большинства компонентов HTTP/1.0.
HTTP/1.1
Последняя версия протокола. Стандарт был принят в июне 1999 года. Новым в этой версии был режим «постоянного соединения»: TCP-соединение
может оставаться открытым после отправки ответа на запрос, что
позволяет посылать несколько запросов за одно соединение. Клиент теперь
обязан посылать информацию о имени хоста, к которому он обращается, что
сделало возможным более простую организацию виртуального хостинга.
Структура протокола
HTTP — протокол прикладного уровня, аналогичными ему явлются FTP и SMTP. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI.
В отличие от многих других протоколов, HTTP не сохраняет своего
состояния. Это означает отсутствие сохранения промежуточного состояния
между парами «запрос-ответ». Компоненты, использующие HTTP, могут
самостоятельно осуществлять сохранение информации о состоянии,
связанной с последними запросами и ответами. Браузер, посылающий запросы, может отслеживать задержки ответов. Сервер может хранить IP-адреса
и заголовки запросов последних клиентов. Однако сам протокол не
осведомлён о предыдущих запросах и ответах, в нём не предусмотрена
внутренняя поддержка состояния, к нему не предъявляются такие
требования.
Каждый запрос/ответ состоит из трёх частей:
-
стартовая строка;
-
заголовки;
-
тело сообщения, содержащее данные запроса, запрашиваемый ресурс или описание проблемы, если запрос не был выполнен.
Стартовые строки различаются для запроса и ответа. Строка запроса выглядит так:
‹Метод› ‹URI› HTTP/‹Версия›
где ‹Метод› может быть:
-
OPTIONS
-
Возвращает методы HTTP, которые поддерживаются сервером. Этот метод может служить для определения возможностей веб-сервера.
-
GET
-
Запрашивает содержимое указанного ресурса. Запрашиваемый ресурс
может принимать параметры (например, поисковая система может принимать
в качестве параметра искомую строку). Они передаются в строке URI
(например:
http://www.example.net/resource?param1=value1¶m2=value2). Согласно стандарту HTTP, запросы типа GET считаются
идемпотентными[2]
— многократное повторение одного и того же запроса GET должно приводить
к одинаковым результатам (при условии, что сам ресурс не изменился за
время между запросами). Это позволяет кэшировать ответы на запросы GET.
-
HEAD
-
Аналогичен методу GET, за исключением того, что в ответе сервера
отсутствует тело. Это полезно для извлечения мета-информации, заданной
в заголовках ответа, без пересылки всего содержимого.
-
POST
-
Передаёт пользовательские данные (например, из HTML-формы) заданному ресурсу. Например, в блогах
посетители обычно могут вводить свои комментарии к записям в
HTML-форму, после чего они передаются серверу методом POST и он
помещает их на страницу. При этом передаваемые данные (в примере с
блогами — текст комментария) включаются в тело запроса. В отличие от
метода GET, метод POST не считается идемпотентным[2],
то есть многократное повторение одних и тех же запросов POST может
возвращать разные результаты (например, после каждой отправки
комментария будет появляться одна копия этого комментария).
-
PUT
-
Загружает указанный ресурс на сервер.
-
DELETE
-
Удаляет указанный ресурс.
-
TRACE
-
Возвращает полученный запрос так, что клиент может увидеть, что промежуточные сервера добавляют или изменяют в запросе.
-
CONNECT
-
Для использования вместе с прокси-серверами, которые могут динамически переключаться в туннельный режим SSL.
В основном используются методы GET и POST.
Первая строка ответа выглядит так:
HTTP/‹Версия› ‹Код статуса› ‹Описание статуса›
Наиболее типичные статусы:
-
200 OK — запрос выполнен успешно;
-
403 Forbidden — доступ к запрошенному ресурсу запрещён;
-
404 Not Found — запрошенный ресурс не найден.
Заголовки HTTP — это строки, каждая из которых состоит из имени
параметра, за которым следует двоеточие и его значение. Они несут
информацию для браузера или для серверных программ (таких, как CGI-приложения). Между заголовками и телом обязательно должна быть пустая строка.
Примеры HTTP
Запрос:
GET /wiki/HTTP HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Connection: close
Ответ:
HTTP/1.0 200 OK
Server: Apache
Content-Language: ru
Content-Type: text/html; charset=utf-8
Content-Length: 1234
(далее следует текст запрошенной страницы)
источник: wikipedia.org
|