Протокол HTTP

Протокол HTTP

HTTP — это простой текстовый протокол, который используется службой WWW для предоставления доступа практически к любому типу данных, которые в совокупности называются ресурсами. В протоколе HTTP есть такие понятия, как клиент (обычно это веб-браузеры) и сервер (это веб-серверы). Как правило, протокол HTTP работает через стандартный сокет TCP, открытый клиентом для сервера. Порт по умолчанию для протокола HTTP — 80, но можно использовать любой другой порт TCP. Связь HTTP состоит из запроса — сообщения от клиента к серверу и ответа — ответа сервера на сообщение от клиента.

В своем развитии протокол HTTP прошел версии 0.9, 1.0 и 1.1, которая является наиболее распространенной. На практике, когда мы говорим о HTTP, мы обычно имеем в виду HTTP 1.1.

HTTP-запросы

HTTP-запрос в версии 1.1 протокола имеет следующий формат:

Код:


  HTTP/1.1

HTTP-запросы состоят из трех основных элементов: метода, Request-URI и полей заголовка.
Метод описывает тип HTTP-запроса, отправляемого клиентом. Наиболее часто используемые методы — GET и POST. Через GET клиент запрашивает некоторый ресурс у веб-сервера. POST служит для передачи данных на сервер и извлечения ресурса. Имена методов в HTTP-запросах всегда пишутся с заглавной буквы.

Request-URI указывает ресурс, на котором будет работать запрос. В части Request-URI можно использовать два типа идентификаторов:
– идентификатор URI (унифицированный идентификатор ресурса)
– относительный путь к основному каталогу Web-сервера

URI может быть либо URL-адресом (Uniform Resource Location, например, http://www.nakov.com/inetjava/index.html), т.е. быть идентификатором ресурса, определяемым его уникальным местоположением или URN (унифицированным именем ресурса, например, urn:isbn:954-8905-06-X), т.е. быть идентификатором ресурса, определяемым его уникальным именем в заданном идентификаторе пространства имен URN (в нашем примере это идентификатор isbn). На практике схема идентификации ресурса URN почти никогда не используется в HTTP-запросах.

Путь относительно домашнего каталога веб-сервера указывает расположение ресурса на текущем веб-сервере. Это часть URL-адреса, которая следует за именем хоста (сервера) в идентификаторе URL-адреса. Например, одним из таких относительных путей может быть идентификатор /inetjava/index.html.

Фрагмент HTTP/1.1, которым заканчивается первая строка HTTP-запроса, указывает версию используемого протокола HTTP.

Поля заголовка из заголовка задают дополнительные параметры запроса и определяют различные требования в отношении ресурса, который, как ожидается, будет возвращен с веб-сервера.

Пустая строка определяет конец запроса.

Пример HTTP-запроса

Приведем пример HTTP-запроса, возвращающего домашнюю страницу с сайта http://www.dir.bg/:

Код:


GET / HTTP/1.1
Host: www.dir.bg
[празен ред]

Чем отличаются виртуальные хосты на веб-сервере

На одном веб-сервере может размещаться несколько разных сайтов, которые могут начинаться с разных интернет-имен. Такие сайты называются виртуальными хостами внутри веб-сервера. Например, сайты с URL-адресами http://www.nakov.com/ и могут размещаться на веб-сервере той же машины, скажем, машины с IP-адресом 194.12.244.90. Возникает вопрос, как браузер сообщает, какой из двух адресов ему нужен, поскольку они обслуживаются одним и тем же веб-сервером на одной и той же машине.

Понятно, что в интернет-сервисе DNS имена www.nakov.com и bgcon.org должны быть прописаны, чтобы соответствовать IP-адресу 194.12.244.90. Когда один из приведенных выше двух URL-адресов вводится в поле адреса стандартного веб-браузера, например http://www.nakov.com/, браузер делает следующее: во-первых, через службу DNS он получает IP-адрес машина, на которой размещен сайт поиска (www.nakov.com). Затем он открывает TCP-соединение с этой машиной через порт 80 и отправляет запрос на получение ресурса «/». В заголовке этого запроса браузер указывает значение www.nakov.com в поле Хост. Именно через это поле Host в заголовке HTTP-запроса веб-сервер понимает, к какому из всех виртуальных хостов относится этот запрос.

Другой способ указать виртуальный хост на веб-сервере в HTTP-запросе — использовать идентификатор URI запрошенного ресурса (URL-адрес). В этом случае имя хоста включается в этот идентификатор.

Методы HTTP-запроса

Протокол HTTP версии 1.1 поддерживает в общей сложности 8 различных методов: GET, POST, HEAD, PUT, DELETE, OPTIONS, TRACE, CONNECT. Наиболее часто используемые методы — это GET и POST, и они имеют наибольшее значение для веб-программирования.

HTTPGET-запросы

Метод GET — это команда для получения ресурса, указанного указанным URI или относительным путем на веб-сервере. Все, что веб-сервер делает для извлечения статического ресурса с помощью запроса GET, — это считывает его из файловой системы и возвращает клиенту в соответствующем ответе HTTP. При получении динамического ресурса сервер выполняет программный код, создающий ресурс, и возвращает результат в ответе HTTP. Вот реальный пример HTTP-запроса с использованием метода GET:

Код:


GET /InetJava-2002-program.html HTTP/1.1
Host: inetjava.sourceforge.net	
Accept: */*
Accept-Language: bg
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0(compatible;MSIE 6.0; Windows NT 5.0)
Connection: Keep-Alive
Cache-Control: no-cache
[празен ред]

Отправка этого запроса веб-серверу, прослушивающему порт 80 на компьютере с интернет-адресом inetjava.sourceforge.net, вернет файл InetJava-2002-program.html из каталога виртуального хоста inetjava.sourceforge.net.

Эта просьба вполне искренняя. Он был сгенерирован веб-браузером Internet Explorer 6.0 при попытке перейти по URL-адресу http://inetjava.sourceforge.net/Ine…02-program.html и был перехвачен программным обеспечением для анализа сетевого трафика.

В запросе HTTP GET, если параметры должны быть установлены для запрошенного ресурса, это делается путем добавления вопросительного знака к URI, за которым следуют пары типа =, и пары этого типа отделяются друг от друга символом &. Чтобы избежать некоторых недопустимых символов, используется так называемое URL-кодирование, о котором речь пойдет позже.

POST-запросы HTTP

Метод POST служит для отправки данных от клиента на веб-сервер. Обычно сервер передает данные, полученные из POST-запроса, какому-нибудь CGI-скрипту или встроенному модулю генерации динамического HTML, который их обрабатывает и возвращает какие-то результаты. Эти результаты возвращаются клиенту в ответ на его запрос. Вот реальный пример HTTP-запроса с методом POST, отправленного Internet Explorer 6.0 при попытке входа в систему электронной почты на веб-сайте http://www.abv.bg:

Код:


POST /webmail/login.phtml HTTP/1.1
Host: www.abv.bg
Accept: */*
Accept-Language: bg
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0(compatible;MSIE 6.0; Windows NT 5.0)
Connection: Keep-Alive
Cache-Control: no-cache
Content-Length: 59
[празен ред]
LOGIN_USER=boris
DOMAIN_NAME=abv.bg
LOGIN_PASS=tajnamajna
[празен ред]

Как видите, параметры передаются после самого запроса, а в полях заголовка указывается общая длина в символах всех параметров и их значений (вместе с символами конца строки). Пустая строка используется как разделитель между полями заголовка и параметрами. Пустая строка также используется для завершения запроса. Если параметры содержат недопустимые символы, они кодируются особым образом. Кодирование параметров и их значений производится автоматически веб-браузером, а их декодирование, соответственно, скриптом, обрабатывающим запрос на веб-сервере.

Ответы на HTTP-запросы

На каждый HTTP-запрос, действительный он или нет, веб-сервер возвращает некоторый ответ. Если для существующего ресурса сделан действительный запрос, веб-сервер возвращает этот ресурс, в противном случае он возвращает код ошибки вместе с текстовым описанием причины ее возникновения. Ответ на HTTP-запрос имеет следующий формат:

Код:


HTTP/1.1  

Первая строка называется строкой состояния и содержит версию протокола HTTP, по которому отправляется ответ, трехзначный код результата или код ошибки и краткое текстовое описание этого кода.

Далее идут поля заголовка. Они содержат различные параметры возвращаемого ресурса, а также информацию о веб-сервере.

Далее следует пустая строка, за которой следует ресурс, закодированный в порядке, описанном в полях заголовка. В зависимости от типа ресурса сервер может возвращать его в разной кодировке и по-разному указывать клиенту, сколько байтов составляет HTTP-ответ.

Значения полей заголовка и формат ресурса в основном интересуют Web-браузер, поэтому подробно их рассматривать не будем.

Главное, что нам нужно знать, это то, что на каждый HTTP-запрос сервер отвечает HTTP-ответом, содержащим запрошенный ресурс или ошибку. Коды ошибок начинаются с цифры 4 или 5. Коды успеха начинаются с 2, а коды, несущие специальную информацию, начинаются с 3. Наиболее распространенные коды ответа HTTP: 200 – успех; 304 — документ не изменялся с момента, указанного в шапке (используется браузерами при кешировании документов); 404 – ресурс не найден; 500 — ошибка сервера. Вот полный пример отправки HTTP-запроса для получения главной страницы с локально запущенного веб-сервера и ответа на этот запрос:

Код:


C:> telnet localhost 80
GET / HTTP/1.1
Host: localhost
[празен ред]
HTTP/1.1 200 OK
Date: Sat, 10 Aug 2002 16:09:18 GMT
Server: Apache/1.3.9 (Win32)
Accept-Ranges: bytes
Content-Length: 73
Content-Type: text/html
[празен ред]

  Test 
    Test HTML page.

Как видите, сервер вернул ответ на HTTP-запрос с кодом 200 (успех) и вернул запрошенный ресурс. Вот пример неудачного запроса:

Код:


C:> telnet localhost 80
GET /img/nakov.gif HTTP/1.0
[празен ред]
HTTP/1.1 404 Not Found
Date: Sat, 10 Aug 2002 16:20:17 GMT
Server: Apache/1.3.9 (Win32)
Connection: close
Content-Type: text/html
[празен ред]

404 Not Found
The requested URL /img/nakov.gif
was not found on this server.
Apache/1.3.9 Server at test Port 80

Видно, что сервер, помимо возврата кода ошибки 404 в ответ на запрос, также отправляет дополнительную информацию, поясняющую смысл этого кода. Эта информация представлена ​​в виде HTML-документа, поскольку предназначена для отображения в браузере клиента, запросившего отсутствующий ресурс.

Вы могли заметить, что в последнем примере мы используем запрос протокола HTTP/1.0, а в предыдущем — HTTP/1.1. Наиболее существенная разница между двумя версиями протокола заключается в том, что в HTTP/1.0 после возврата ответа на HTTP-запрос сервер сразу же закрывает сокет с клиентом, а в HTTP/1.1 возможно последовательное выполнение нескольких HTTP-запросов. с одним гнездовым отверстием. Это делает протокол HTTP/1.1 быстрее, поэтому большинство HTTP-клиентов предпочитают его.

Автор: Светлин Наков, Болгарская ассоциация разработчиков программного обеспечения

Команда kaldata.com благодарит BGDevelopment за предоставленную статью

Поделиться в соцсетях