Протокол http.
Hyper Text Transport Protocol появился в 1990 году. Это позволило очень широко распространяться интернету. Первой версией http появился в 1992 году стала версия 0.9. В нем был один запрос GET и стандарт не подразумевал заголовков, в это же время был реализован обозреватель NCSA Mosaic(22 апреля 1993 года). Следующая версия hhtp 1.0 появилась в 1996 году, появилось несколько новых запросов (HEAD,POST) и сам протокол был приведен в соответствие с другими протоколами,существовавшими тогда. В 1999 году вышла версия 1.1. Отличия были в поддержке виртуального хостинга, то есть стала существовать возможность запуска нескольких серверов на одном IP-адресе. Http по умолчанию использует порт 80.
$telnet 172.21.240.250 80
Trying 172.21.240.250...
Connected to 172.21.240.250.
Escape character is '^]
Мы видим, что хотя соединение произошло, он не выдает приглашения. Это сделано, чтобы не сообщать пользователю версию сервера, чтобы его было тяжелее сломать. Дальше мы должны составить запрос, к примеру, используя следующие запросы:
GET – получить файл
POST – отправить файл
$GET /index.html
<html>
<head>
<title>Yo!</title>
<!--<meta http-equiv="refresh" content="3;URL=http://inse.ru/" /> -->
</head>
<body>
<h1>It works!</h1>
<p>
You will be transferred to the head site in three seconds.
Please, be patient ;))
</body>
</html>
Connection closed by foreign host.
Мы указали,какой файл хотим получить. На самом деле, этот файл лежит не в корне диска,а в папке DocumentRoot. Таким образом с помощью http сервера нельзя получить произвольный файл на диске (речь о том, что такой возможности быть не должно, и если она есть, это огромная дыра в безопасности). Если в GET будет указано два параметра, второй параметр — это версия протокола, поддерживаемая программой клиентом.
Если потом просто послать пустую строку, клиент ответит, какая версия протокола используется и код возврата.
GET /index.html HTTP/1.0 ← вот так мы вызывали это всё
HTTP/1.1 200 OK // 200 – код возврата, OK - расшифровка
Date: Wed, 28 Mar 2012 11:02:56 GMT
Server: Apache
X-Powered-By: PHP/5.2.11
Content-Length: 240
Connection: close
Content-Type: text/html
<html>
<head>
<title>Yo!</title>
<!--<meta http-equiv="refresh" content="3;URL=http://inse.ru/" /> -->
</head>
<body>
<h1>It works!</h1>
<p>
You will be transferred to the head site in three seconds.
Please, be patient ;))
</body>
</html>
Попробуем указать неверное имя файла:
GET /index.htmt HTTP/1.0
результат будет
HTTP/1.1 404 Not Found
Если указываем HTTP/1.1 в следующей строке нужно обязательно указать заголовок:
GET /index.htmt HTTP/1.1
Теперь вместо заголовка пишем
Host: users.inse.ru ← так указали, какой сервер мы хотим использовать
Вместо этого можно было бы указать кодировку, спросить, обновился ли файл с какого-то времени. В данном случае мы использовали только одну строчку.
Если используется 1.1, то соединение используется не сразу, существует некоторый таймаут.
В ответе тоже идет заголовок, потом пустая строка, потом файл. В заголовке указано время, имя сервера, тип сервера. Все протоколы устроены примерно таким же образом. Если надо передать двоичные данные или картинку, используется кодирование, два их вида: base64, MIME.