HTTP протокол
HTTP (англ. HyperText Transfer Protocol — «протокол передачи гипертекста») — протокол прикладного уровня передачи данных.
В Википедии все об этом протоколе подробно расписано. Тут я коротко опишу основные моменты, чтобы время от времени обращаться как к шпаргалке.
HTTP запрос.
Если ввести в адресную строку адрес какого-то ресурса и нажать на "Enter", то браузер отправит HTTP запрос на этот ресурс.
Правила HTTP запроса выглядят следующим образом:
1. Самая первая строка состоит из трех частей разделенных пробелом. В конце перевод на новую строку. Эта строка самая основная часть запроса.
2. Формат первой строки:
<Метод запроса><пробел><запрашиваемый ресурс><пробел><версия HTTP протокола, какую использует браузер><перевод на новую строку>
Например:
GET /dir/index.html HTTP/1.1
3. После основной части запроса идут HTTP заголовки. Каждый заголовок начинается с новой строки и в конце обязательно перевод на новую строку(\r\n).
4. Все заголовки кроме Host необязательны.
5. Формат заголовков выглядит следующим образом:
<Имя заголовка>:<пробел><Значение заголовка><перевод на новую строку>
Например:
Host: www.test.com
Accept: */*
Accept-Language: ru
Referer: http://yandex.ru/index.html
User-Agent: Mozilla 4.1
6. Концом запроса считается пустая строка
HTTP ответ.
Формат ответа такой же самый.
Первая строка будет выглядеть так:
<версия HTTP><пробел><код состояния><пробел><описание состояния><перевод на новую строку>
Заголовки имеют точно такой же формат как у запроса.
А после заголовков идет пустая строка и контент.
Пример:
HTTP/1.1 200 OK
Server: Microsoft IIS 6
Content-Type: text/html
Content-Length: 15345
Last-Modified: Sun, 3 Jul 2005 18:00:00 GMT
<html>
.......
</html>
HTTP POST запрос.
Формат POST запроса немножко отличается от GET:
1. В первой строке вместо GET ставим POST.
2. Добавляется заголовок "Content-Length", которая указывает длину строки запроса.
3. После заголовков идет одна пустая строка.
4. Дальше на новой строке идет строка запроса - query string в формате key1=value1&key2=value2
5. И пустая строка
Пример:
POST /action.php HTTP/1.1
Host: www.test.com
Content-Length: 20
Accept: */*
Accept-Language: ru
Referer: http://yandex.ru/index.html
User-Agent: Mozilla 4.1
login=vasya$pswd=parol
COOKIE
Если на сервере устанавливается куки, то у нас будет такая последовательность работы.
Когда клиент обращается на сервер впервые:
GET /index.php?name=Vasya HTTP/1.1
Host: www.test.com
Accept: */*
Accept-Language: ru
User-Agent: Mozilla 4.1
Ответ сервера, который взял значение $_GET['name'] и установил куки setcookie('username', 'Vasya') :
HTTP/1.1 200 OK
Server: Microsoft IIS 6
Content-Type: text/html
Content-Length: 15345
Last-Modified: Sun, 3 Jul 2005 18:00:00 GMT
Set-Cookie: username=Vasya
Конечно, на самом деле куки устанавливается на стороне клиента, т.е сервер говорит браузеру установить куки и передавать её при каждом обращении. И при следующем обращении у нас уже будет такой запрос:
GET /index.php HTTP/1.1
Host: www.test.com
Accept: */*
Accept-Language: ru
User-Agent: Mozilla 4.1
Cookie: username=Vasya
Можно так работать в командной строке с HTTP протоколом:
>telnet
>open www.test.com 80
GET / HTTP/1.1
Host: www.test.com
Запускаем утилиту telnet. Открываем соединение - open <HostName> <port>
Дальше обычный HTTP запрос. Не забываем переносы (Enter) в конце строк.