Понятие "HTTP". http
(англ. сокр. HyperText Transfer Protocol) - это методика передачи
веб-страниц по сети Интернет. Изначально протокол HTTP использовался
исключительно для передачи HTML -документов, но в настоящее время
посредством HTTP можно передавать любую информацию, в том числе
картинки, звук, видео, а также просто абстрактные файлы. Это
прикладной протокол (тот, который работает на уровне приложений),
использующий услуги TCP на транспортном уровне (т.е. с установлением
соединения и контролем передачи данных). По своему типу, это клиент -
серверный протокол, т.е. клиент (Интернет браузер или прокси сервер),
запрашивает данные, а сервер (Apache, IIS и д.р.) эти данные
отправляет. Стандартный порт сервера – 80, хотя можно использовать
любой другой порт, но порты с номером меньше 1024 зарезервированы для
стандартных служб. Клиент может открывать соединение на любом порту, но
это уже задачи TCP. Запросы и ответы представляют собой текстовые
строки (как и другие протоколы прикладного уровня, такие как SMTP, POP
и д.р.), признаком конца запроса или ответа служит пустая строка. Я
остановлюсь только на HTTP – запросе. Ответ во многом похож на него и
самому будет не трудно разобраться. HTTP – запрос. Любой
запрос предназначен, для получения некоторых данных (локальный файл или
результат работы программы). Это может быть просто текстовой документ
(просто текст или текст в формате HTML), архив и т.д. Если
запрашивается скрипт, то возвращаются данные, полученные в результате
выполнения скрипта. Это может быть ссылка на существующий файл или
динамически сгенерированные данные. Возвращаемые данные могут быть
разные, в зависимости от переменных которые были переданы с запросом.
Переменные – это то, что пользователь вводит в поле формы (в
дальнейшим, будем тоже называть их данные). В HTML: <FORM
…><input type='text' name='user' value='admin'></FORM>.
Данные с такой формы будут такие: user=admin. Сами данные должны быть
кодированы перед отправкой (кодируются русские буквы и специальные
символы…). Теперь о самом запросе. Вот схематическое его представление:
- 3апрос. - Заголовки запроса. - Пустая строка. - Данные согласно запросу.
1. Запрос. Сначала
идет «Запрос». На него отводится одна строка (первая). Схематически он
выглядит так: Метод запроса [пробел] путь к файлу [пробел]
протокол/версия протокола [конец строки] На практике выглядит как: GET /index.php HTTP/1.1 Путь к файлу может быть полным (http://www.ironhorse.ru/index.php) или относительным (/index.php). В нашем примере этот путь относительный (относительно корневой папки) - «/index.php». «…Протокол/версия
протокола…» - протокол HTTP, а версии три (0.8, 1.0, 1.1). На практике
используется только две 1.0 и 1.1(расширенная первая версия). Поэтому и
получается – «HTTP/1.1». Разберемся с методами. Метод - это
параметр запроса, «говорящий» серверу, что именно хочет клиент. Методов
много, в рамках статьи я остановлюсь на трех самым используемых
(точнее, разрешенных сервером, например, метод PUT, для создания
документа на удаленном сервере, запрещен почти везде). Это методы GET,
POST, HEAD. Теперь немного о каждом. Метод GET «говорит» серверу,
что клиент передает ему данные как часть URL и что, клиент в ответ ждет
запрашиваемый файл. Сам запрос: GET
/index.php?name1=value1&name2=value2 HTTP/1.1 После имени
файла ставится «?» и затем следуют данные формата: имя=значение.
Параметры имя=значения разделяются знаком «&» -
имя1=значение1&имя2=значение2. Данные могут и отсутствовать. Метод
POST «говорит» серверу, что клиент передает ему данные как часть
запроса и что, клиент в ответ ждет запрашиваемый файл. Сам запрос: POST
/index.php HTTP/1.1 … # тут заголовки запроса, о них ниже. [Пустая строка] name1=value1&name2=value2 Точно
так же, как и в случаи с GET формат данных
name1=value1&name2=value2. Данные могут и отсутствовать. Метод HEAD
«говорит» серверу, что клиент передает ему данные как часть URL и что,
клиент в ответ НЕ ЖДЕТ запрашиваемый файл. Сам запрос: HEAD
/index.php?name1=value1&name2=value2 HTTP/1.1 Сервер
возвращает только заголовок ответа, сам документ не передается. Точно
так же, как и в случаи с GET формат данных
name1=value1&name2=value2. Данные могут и отсутствовать.
2. Заголовки запроса. Это
опции, влияющие на решение сервера, какой именно документ возвращать
(язык документа, кодировка, кэшированный или нет, и т.д.). Я перечислю
самые основные и нужные опции. Полный список можно взять в специальной
литературе или RFC. На каждый заголовок отводится по одной строке.
Сначала пишется имя заголовка потом «:» и потом его значение. Например,
«Accept: */*». Accept – Тип данных, которые согласен принять
клиент. Значения перечисляются через запятую (например, text/html,
image/gif, image/jpeg и т.п. Строка «*/*» обозначает, что клиент может
принять любые данные). Referer – URL документа, на котором находилась ссылка на запрашиваемый документ (например, открыв http://www.ironhorse.ru/ и нажав ссылку на http://www.ironhorse.ru/ironforum/index.php значение Referer будет «http://www.ironhorse.ru/»). Accept-Charset – Кодировка, которую предпочитает клиент (например, «Accept-Charset: coi8-r, win - 1251»). Accept-Language – Язык документа, который может принять клиент (например, «Accept-Language: ru, en»). Accept-Encoding
– Представление данных (например, «Accept-Encoding: compres, gzip» –
означает передать сжатые данные, если сервер поддерживает сжатие
данных, то они будут переданы сжатыми, если нет, то, как есть). User-Agent
– Название клиента, от которого поступил запрос (например, «Mozilla/4.0
(compatible; MSIE 5.5; Windows NT 5.0)»). Он придуман для того, что бы
одну и туже информацию по-разному отображать на разных браузерах. Хотя
редко где используется. Host – Имя виртуального хоста.
Единственное, обязательный заголовок в HTTP 1.1 . Это понятно, т.к. в
настоящее время большинство сайтов хостится на серверах с множеством
клиентов. IP один, а сайтов много. Для этого и создан это заголовок.
Совпадает с доменным именем сайта. Connection – Имеет два
значения: «Close» и «Keep-Alive». В первом случае после передачи данных
клиенту сервер разрывает соединение сразу, во втором ждет несколько
секунд следующего запроса (). Cookie – Заголовок, в котором
помещаются «куки». Пары имя=значения разделяются запятыми (например,
Cookie: name=admin, password=psswd). Вот пример типичного HTTP – запроса. GET /text/doc.html HTTP/1.1 Accept: */* Accept-Language: ru User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) Host: http://www.ironhorse.ru/ Connection: Keep-Alive |пустая строка| Вот
вроде и всё, что касается HTTP – запроса. В завершении хочу сказать,
что это не-большая часть всего того, что можно рассказать о HTTP в
целом и о его запросах в частности, но этого вполне достаточно, что бы
понять, что это такое и принять решение, изучать дальше или
остановиться на достигнутом. Проследить за своими
запросами, например, можно с помощью программы Odysseus FreeWare. О
настройке и работе с данной или подобной программой я расскажу в одной
из следующих частей.