Работа с протоколом HTTP | PC vlog

Работа с протоколом HTTP

Работа с протоколом HTTP

Привет! Сегодня поговорим о протоколе HTTP. Протокол HTTP - это наши основные правила в создании сайтов. Расшифровывается этот протокол, как Hypertext Transfer Protocol. Знать его нужно, поскольку мы должны понимать, какие процессы начинают происходить, когда мы вбиваем что-то в браузере в адресную строку и нажимает кнопочку Enter.


Так вот, когда мы что-то вбиваем в браузер, у нас устанавливается соединение между нашим браузером и сервером, а браузер у нас часто выступает в роли клиента, поэтому мы будем называть браузер клиентом. Соответственно клиент (браузер) в это соединение посылает запрос, а сервер в это же соединение высылает ответ. Мы этого видеть не можем, но это есть. Все вроде просто. Но поскольку клиентов (браузеров) много и серверов тоже много, то они естественно обязаны общаться на каком-то одном языке. Для этого и был придуман такой протокол как HTTP, в котором как раз и описывается весь синтаксис, все правила и команды взаимодействия клиента с сервером.

И так, что же на самом деле происходит, когда мы вводим адрес в адресную строку браузера и нажимаем Enter? Как я уже сказал, браузер-клиент посылает запрос. Запрос состоит из двух частей.

Первая часть этого запроса это сама строка запроса:

GET[пробел] /main/index.html[пробел]HTTP/1.1

Строка запроса состоит из трех частей, разделенных пробелами. В начале этой строки, т.е. в первой части указывается метод запроса (GET или POST). Во второй части указывается некий ресурс или страница, в нашем случае это страница index.html, которая находится в папочке main, а та в свою очередь находится в корне нашего сайта. А вот в третьей части нашей строки указывается версия протокола HTTP, в которой ориентируется браузер-клиент, в нашем случае версия 1.1.

Теперь, смотрите, что происходит дальше. Все эти данные идут байтик за байтиком, символ за символом, как единая бегущая строка. Так вот, когда мы читаем бегущую строку, нам нужно понимать где заканчивается предложение и начинается новое. У нас в русском языке признаком конца строки является точка. Информация серверу тоже передается строками. И сервер должен понимать где строка закончилась, а где началась. И таким признаком конца строки для сервера являются два служебных символа возврат каретки и перевод на новую строку. Пишутся они вот так: \r\n.

Вторая часть запроса это метаинформация.

Официально она называется HTTP заголовки запроса. Например:

GET[пробел] /main/index.html[пробел]HTTP/1.1
Host: www.pcvlog.ru
Accept: */*
Accept-Language: ru
Referer: http://yandex.ru/yandsearcher?text=Reh
User-Agent: Mozilla 4.043  (compatible; MSIE 6.1, ...)

Заголовок это строка, которая имеет вид имя заголовка, затем двоеточие, затем пробел и уже потом значение этого заголовка. И в конце каждого заголовка должны идти служебные символы \r\n.

Большая часть заголовков предназначена для сервера. Другая часть заголовков, серверу по-барабану. И эта часть предназначена нам, серверным разработчикам.

Надо сказать о том, что всех этих заголовков очень и очень много. Мало того, протокол HTTP расширяемый, т.е ни кому не возбраняется придумать свой заголовок и его посылать. Конечно же большинство этих заголовков необязательные, кроме заголовка HOST. Если мы посылаем запрос серверу, то минимум, что мы должны послать это сам запрос:

GET[пробел] /main/index.html[пробел]HTTP/1.1

и ниже заголовок HOST:

Host: www.pcvlog.ru

В этом заголовке передается доменное имя. Если этот заголовок не передать, то сервер вправе отклонить ваш запрос, что он с удовольствием и сделает, вернув статус 400 Bad Request.

Многие заголовки являются стандартными. Если браузер не будет их передавать, то этим браузером ни кто не будет пользоваться. Один из таких стандартных заголовков является заголовок User-Agent, где браузер передает сам себя (свое имя, свою версию и т.д.). Второй стандартный заголовок это заголовок Referer. Что передается в этот заголовок? Если пользователь набрал адрес не с рук, так называемый директ запрос, когда с рук вводится адрес, а перешел по ссылке, то тот адрес откуда человек пришел по ссылке, оказывается в заголовке referer.

Всех этих заголовком может быть разное количество. Каждый браузер посылает свое количество заголовков. Вообще количество заголовков на тот или иной запрос и их качество (значения, которые там лежат) полностью зависят от самих разработчиков браузеров. Например разработчики IE сказали, что при запросе страницы HTML методом GET их браузер будет передавать такие-то заголовки, а разработчики FireFox сказали, что наш браузер при том же запросе будет передавать другие заголовки.


Сервер, принимая заголовки, он перед тем как бежать искать ту страницу, которую от него потребовали, под каждый заголовок создает свою переменную (серверную переменную). Эти переменные начинаются с префикса HTTP и нижнего подчеркивания и далее название заголовка. Например: $_SERVER['HTTP_HOST'], $_SERVER['HTTP_ACCEPT'] и т.д.

Очень важно отметить, как браузер определяет конец запроса заголовков браузера. Все очень просто браузер должен передать серверу признак конца запроса. Таким признаком является пустая строка.

Так вот, мы говорили, что все заголовки записываются сервером в переменные. Естественно мы к ним имеем доступ. И таким образом мы можем собирать статистику для нашего сайта, например, мы можем узнать с каких браузеров к нам ходят пользователи.

Обратите внимание, что практически все браузеры в заголовке передают название Mozilla. Это не означает, что это все браузеры FireFox или они имеют одинаковый движок. Ничего подобного. Так исторически сложилось. В свое время очень давно был браузер и он был один и назывался он Мозайк. А потом появился браузер Нетскейп Навигатор. А до этого он назывался Мозайк Киллер. В отделе маркетинга люди были более умными и сказали, что так не надо называть браузер. Название переделали на Нетскейп Навигатор, однако слово Мозайк Киллер сократили и получилась Мозилла и это сокращение запихнули в заголовок под названием User-Agent.

А фишка вот в чем. Браузер Мозайк был на тот момент примитивным и не поддерживал новую передовую технологию, которая только появилась под названием фреймы. А Нетскейп Навигатор поддерживал. Что сделали серверные разработчики? Они стали отслеживать с каких браузер приходят пользователи. С помощью специального кода они заглядывали в заголовок User-Agent и если там стояло слово Мозилла, то это был Нетскейп Навигатор отдавалась страница с фреймами, если не было слова Мозилла, то это был Мозайк соответственно страница отдавалась без фреймов.

Дальше развитие происходило еще интересней. На рынке появилась компания Майкрософт со свои браузером Интернет Эксплорер. Проблема была в том, что ему ни кто эти фреймы не отдавал, так как у него в заголовке не было прописано слово Мозилла, хотя он их поддерживал. Так вот, чтобы разрулить эту ситуацию, разработчики IE запихнули в заголовок User-Agent слово Мозилла. Ну вот так вот собственно все исторически и тянется.

Хорошо. Получил наш сервер запрос от браузера, получил конец этого запроса в виде пустой строки и побежал искать нашу страничку. Нашел он нашу страничку и посылает в наше соединение (соединение браузера с сервером) ответ. Ответ точно также состоит из двух частей. Вначале идет сама строка ответа. Она тоже разделена двумя пробелами:

HTTP/1.1[пробел]200[пробел]OK

Сервер точно также говорит: Я отвечаю тебе (клиент-браузер), основываясь на протоколе HTTP/1.1, потом передаю код состояния 200 ОK. В конце идет признак окончания строки пустая строка. Если бы браузер не нашел нашу страничку, он бы выдал код состояния 404 NOT FOUND. Далее сервер передает мета информацию, то есть заголовки ответа:

HTTP/1.1 200 OK
Server: Microsoft IIS 6
Content-Type: text/html
Content-Length: 16345
Last-Modified: Sun, 04 Jul 2006 19:00:00 GMT

Опять после всех заголовков идет признак конца строки пустая строка, говорящая о том, что все заголовки переданы и после этого идет уже наш контент (страничка html).

Однако это не все. В том плане, что общение браузера с сервером на этом не заканчивается. Что же происходит дальше? Сервер отдал страницу. Однако он не знает, что находится внутри этой страницы. А внутри может находится картинка (тэг ). Браузер, увидев тэг картинки опять посылает запрос на сервер на получение этой самой картинке. Сервер получив запрос, анализирует его и высылает ответ, то есть отдает картинку. Если у нас например есть три картинки и еще файл стилей css, то будет четыре обращение браузера к серверу. Вот таким образом происходит постоянное взаимодействие браузера с сервером.

Мы говорили с вами о том, что может влиять на количество и качество заголовков запроса браузера это разработчики самих браузеров. А вот на количество и качество заголовков ответа сервера влияют аж три фактора: первый это то, что вложили внутрь сами разработчики сервера; второй фактор это администратор сервера, который может до послать какие-то заголовки или отменить уже посылаемые или переназначить эти заголовки; третий фактор это мы, серверные разработчики, которые также можем до послать, отменить или переназначить заголовки.


Вам будет это интересно:

Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий