SVN TortoiseSVN по-русски
Jun 25

Анатомия HTTP запроса

HTTP, аффтар: Родион Быков Add comments

Занимаясь веб-разработкой профессионально, нельзя не знать как все работает до последней шестеренки. Поэтому я считаю будет уместно рассказать о том как происходит взаимодействие сервера и клиента и для этого препарировать HTTP протокол как основу такого взаимодействия.

Когда вы пробовали создавать первые HTML страницы, вы либо открывали их через двойное нажатие мышкой браузером прямо с диска (файловой системы), либо выкладывали на локальный или удаленный web-сервер и открывали браузером URL. В обоих случаях, результать один и тот-же - вы видете HTML страницу в браузере. Однако, когда вы открываете страницу расположенную на web-сервере через HTTP протокол, неявно передается достаточно много дополнительной информации, а именно заголовки HTTP. Протокол передачи - это договор между сервером и клиентом о допустимых вопросах и ответах. Протокол задокументирован в виде стандарта RFC2616.

Общение между сервером и клиентом может быть описано как разговор человека в магазине:

Клиент: Привет! Я Мозилла-Файрфокс, можно-ли мне файлик products.html с хоста shop.com ?
Сервер: Да, есть у меня такой файлик, он имеет тип text|/html и вот его содержимое.
(Клиент получает целиком файл, смотрит на него и натыкается на тег <img>)
Клиент: Привет! Я Мозилла-Файрфокс, можно ли мне файлик product.jpg с хоста shop.com ?
Сервер: Да, есть у меня такой файлик, он имеет тип image/jpg и вот его содержимое.
(Клиент получает файл и отображает на экране)

И так далее. Что кстати сразу замечу - сервер понятия не имеет что оба раза это был один и тот же клиент. HTTP-протокол называется “stateless” - он не хранит состояние соединения и передачи. Вопрос - ответ - “вiльна каса”.

Вернемся к заголовкам. Они бывают двух типов - заголовки запроса (request) и заголовки ответа (response). Например, вы набираете URL нашего сайта и он открывается. На языке современного протокола HTTP версии 1.1 это выглядит так:

Запрос:

GET / HTTP/1.1
Host: iwannabedeveloper.com
User-Agent: Mozilla/5.0

Ответ сервера:

HTTP/1.1 200 OK
Date: Mon, 25 Jun 2007 13:50:37 GMT
Server: Apache/2.0.46 (CentOS)
Accept-Ranges: bytes
X-Powered-By: PHP/4.3.2
X-Pingback: http://iwannabedeveloper.com/xmlrpc.php
Content-Encoding: gzip
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

После заголовков следует содержимое страницы в виде HTML:


< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Выглядит довольно просто. В запросе клиент указывает какой файл он просит сервер вернуть и опознает себя (хоть и не обязан) как Mozilla. Запрос посылается методом GET, и есть еще метод POST, но о нем в следующий раз. В ответ клиент получает информацию о запрашиваемом файле и сам файл. Наиболее значимые заголовки ответа - это Content-Type и Status. Content-Type сообщает клиенту какого типа файл будет передаваться, а в случае HTML, какая кодировка будет использоваться. Список типов файлов (MIME-types) стандартизована и с ней можно ознакомится здесь. Status - (200 ОК) - это стандартизованный код выполнения запроса. Код 200 означает что запрошенный файл был найден и успешно передан клиенту. Например код 404 означает что файл не найден, код 301 - что файл перемещен в другое место, а код 500 - что во время выполнения запроса произошла непоправимая ошибка на сервере. Список кодов описан в упомянутом стандарте RFC2616.

Вот в кратце как работает HTTP протокол. Есть еще много вопросов которые мы разберем позже - например, как передаются формы и файлы других типов или как можно управлять передаваемыми заголовками с помощью PHP.



3 Responses to “Анатомия HTTP запроса”

  1. И тут Скакунов Александр говорит:
    comment_image

    Хорошо объяснил :)

  2. И тут Murrena говорит:
    comment_image

    Мне понравился диалог клиента с сервером :-)

  3. И тут Michael de`OZ говорит:
    comment_image

    красиво расписаны элементарные вещи

Ну-ка вякни!

Нужно сначала залогиниться, чтобы постить комменты.