Что такое HTTP.
Это прикладной протокол (тот, который работает на уровне приложений), использующий услуги TCP на транспортном уровне (т.е. с установлением соединения и контролем передачи данных. Одним словом всё надежно ;)). По своему типу, это клиент - серверный протокол, т.е. клиент (инет браузер или прокси сервер), запрашивает данные, а сервер (Apache, IIS и д.р.) эти данные отправляет. Стандартный порт сервера – 80, хотя можно использовать любой больший 1024 (можно и меньше, но эти порты, от 0 до 1024, зарезервированы для стандартных служб). Клиент может открывать соединение на любом порту, но это уже задачи TCP. Запросы и ответы представляют собой текстовые строки (как и другие протоколы прикладного уровня, такие как SMTP, POP и д.р.), признаком конца запроса или ответа служит пустая строка. Я остановлюсь только на HTTP – запросе. Ответ во многом похож на него и самому будет не трудно разобраться (это воспитательный элемент, нужно самому учиться искать информацию, тем более по этому вопросу его полно…).

HTTP – запрос.
Цель каждого запроса, это получение некоторых данных (локальный файл или результат CGI программы). Это может быть просто текстовой документ (просто текст или текст в формате HTML), архив и т.д. Если запрашивается скрипт, то возвращается данные, полученные в результате выполнения скрипта. Это может быть ссылка на существующий файл или динамически сгенерированные данные. Возвращаемые данные могут быть разные, в зависимости от переменных которые были переданы с запросом. Переменные – это то, что пользователь вводит в поле формы (в дальнейшим будем называть их тоже данные). В HTML:
<input type='text' name='user' value='admin'></FORM>.
Данные с такой формы будут такие: 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: wwwserver.com
Connection: Keep-Alive
[пустая строка]

Вот вроде и всё, что касается HTTP – запроса.
В завершении хочу сказать, что это небольшая часть всего того, что можно рассказать о HTTP в целом и о его запросах в частности, но этого вполне достаточно, что бы понять, что это такое и принять решение, изучать дальше или остановиться на достигнутом ;)