Что такое HTTP. Это прикладной протокол (тот, который работает на уровне приложений), использующий услуги 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 [пустая строка] Вот вроде и всё, что касается HTTP – запроса. В завершении хочу сказать, что это небольшая часть всего того, что можно рассказать о HTTP в целом и о его запросах в частности, но этого вполне достаточно, что бы понять, что это такое и принять решение, изучать дальше или остановиться на достигнутом ;)
|