Это прикладной протокол (тот, который работает на уровне приложений), использующий услуги TCP на транспортном уровне (т.е. с установлением соединения и контролем передачи данных. По своему типу, это клиент — серверный протокол, т.е. клиент (инет браузер или прокси сервер), запрашивает данные, а сервер (Apache, IIS и д.р.) эти данные отправляет. Стандартный порт сервера – 80, хотя можно использовать любой больший 1024 (можно и меньше, но эти порты, от 0 до 1024, зарезервированы для стандартных служб). Клиент может открывать соединение на любом порту, но это уже задачи TCP. Запросы и ответы представляют собой текстовые строки (как и другие протоколы прикладного уровня, такие как SMTP, POP и д.р.), признаком конца запроса или ответа служит пустая строка.
Рассмотрим HTTP – запрос. Ответ во многом похож на него и самому будет не трудно разобраться (это воспитательный элемент, нужно самому учиться искать информацию, тем более по этому вопросу его полно…).
HTTP – запрос.
Цель каждого запроса, это получение некоторых данных (локальный файл или результат CGI программы). Это может быть просто текстовой документ (просто текст или текст в формате HTML), архив и т.д. Если запрашивается скрипт, то возвращается данные, полученные в результате выполнения скрипта. Это может быть ссылка на существующий файл или динамически сгенерированные данные. Возвращаемые данные могут быть разные, в зависимости от переменных которые были переданы с запросом. Переменные – это то, что пользователь вводит в поле формы (в дальнейшим будем называть их тоже данные). В HTML:
Данные с такой формы будут такие: user=admin. Сами данные должны быть кодированы перед отправкой (кодируются русские буквы и специальные символы…).Теперь о самом запросе. Вот схематическое его представление:
Запрос.
Заголовки запроса.
Пустая строка.
Данные согласно запросу.
1. Запрос
Сначала идет «Запрос». На него отводится одна строка (первая). Схематически он выглядит так:
Метод запроса [пробел] путь к файлу [пробел] протокол/версия протокола [конец строки]
На практике выглядит как:
GET /index.php HTTP/1.1
Путь к файл может быть полным (http://www.server.com/file.html) или относительным (/file.html). В нашем примере этот путь относительный (относительно корневой папки) — «/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.gipshack.ru/index.php и нажав ссылку на http://www.gipshack.ru/bug.php значение Referer будет «http://www.gipshack.ru/index.php»).
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=lolo).
Вот пример типичного 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: www.server.com
Connection: Keep-Alive
[пустая строка]