HTTP — протокол уровня приложений

Автор оригинала: Karl Dubost
  • Перевод
Данная статья является переводом первой статьи из цикла статей о протоколе HTTP с сайта opera.com.
Пересоздал её, чтобы тип статьи стал переводом.

Введение


В Бутане, когда люди знакомятся, они обычно приветствуют друг друга словами «Твоё тело чувствует себя хорошо?». В Японии они могут кланяться, в зависимости от обстановки. В Омане мужчины обычно целуют друг друга в нос, после рукопожатия. В Камбодже и Таиланде они обычно соединяют ладони, как при молитве. Это все протоколы общения, простая последовательность кодов, которая имеется значение и готовит обе стороны к обмену информацией.

В Интернете есть очень эффективный протокол прикладного уровня, который готовит компьютеры к обмену информацией: Hypertext Transfer Protocol, или HTTP. HTTP — протокол прикладного уровня поверх коммуникационного протокола TCP/IP. HTTP часто упускается из вида при изучении веб-дизайна и веб-разработки, что является ошибкой: понимание его помогает определить лучший способ взаимодействия с пользователями, достичь лучшей производительности сайта и создает эффективный инструмент для управления информацией в сети Интернет.

Это первая статья из серии статей, целью которой является научить основам HTTP и эффективному его использованию. В этой статье мы увидим на каком этапе HTTP работает в механизме Интернет.

Что такое коммуникационный протокол?


До того, как углубиться в специфику, давайте рассмотрим базовый коммуникационный сценарий. Чтобы обмениваться информацией, обеим сторонам (которые могут быть программным обеспечением, устройством, людьми, и т.д.) необходимо установить:
  • синтакс (формат данных и программного кода)
  • семантика (управление информацией и обработка ошибок)
  • тайминг (согласование по времени и последовательности)

image
Когда два человека встречаются, они пользуются коммуникационным протоколом: например, в Японии при встрече с кем-либо человек делает специфическое действие с телом. Одно из таких действий — поклон, который является синтаксисом, используемым для взаимодействия. В японской традиции жест «поклон» (и многие другие) ассоциируется с семантикой приветствия кого-либо. В итоге, когда один человек кланяется другому, устанавливается цепочка событий между этими двумя людьми в определенном тайминге.

Онлайновый коммуникационный протокол состоит из тех же элементов. Синтаксисом будет последовательность символов, как ключевые слова, которые мы используем для написания протокола. Семантика — значение, ассоциированное с каждым из этих слов и, в заключении, тайминг — последовательность в которой две или более сущности обмениваются этими словами.

Где HTTP вклинивается в механизм?


Сам HTTP работает поверх остальных протоколов. Во время соединения к веб-сайту, например к www.example.org, пользовательский агент использует семейство протоколов TCP/IP. Модель TCP/IP, спроектированная в 1970, состоит из 4 уровней:
  • Уровень сетевого доступа, описывающий доступ к физическому устройству (т.е. использующее сетевую карту)
  • Межсетевой уровень, описывающий размещения данных в дейтаграмме и роутинг данных — как они пакуются (IP)
  • Транспортный уровень, описывающий способ, которым доставляются данные из исходной точки к финальному получателю (TCP, UDP)
  • Прикладной уровень, описывающий значение или формат передаваемых сообщений (HTTP)

HTTP — протокол прикладного уровня, который находится над коммуникационным протоколом. Это важно иметь ввиду. Разделение модели на независимые уровни помогает развивать части платформы, без необходимости переписывать всё. Например, TCP, протокол транспортного уровня, можно развивать, без необходимости модифицировать HTTP, протокол прикладного уровня. В первых статьях про HTTP мы уделим внимание разделению уровней, как это сделано в TCP/IP модели. HTTP предназначен для обмена информацией двумя частями программного обеспечения посредством HTTP сообщений. То, как мы формируем и проектируем эти сообщения, имеет значение как для клиента (браузер, например), так и для сервера (веб-сайт) и посредников (прокси-сервер).

Давайте доберемся до сервера


Порт 80 — порт по умолчанию для соединения к веб-серверам. Мы можем сами попробовать подключиться к веб-серверу, используя командную строку. Откройте командную строку и попробуйте открыть соединение к www.opera.com на порт 80 используя следующую команду:
telnet www.opera.com 80
Вы должны получить вывод наподобие:
Trying 195.189.143.147...
Connected to front.opera.com.
Escape character is '^]'.
Connection closed by foreign host.

Мы видим, что терминал пытается установить соединение с сервером, расположенным по адресу 195.189.143.147. Если мы больше ничего не будем делать, сервер сам закроет соединение. Можно использовать и другие порты и даже другой коммуникационный протокол, но эти — самые общепринятые.

Давайте поговорим немного об HTTP


Давай опять попробуем соединиться с сервером. Введите следующее сообщение в вашей командной строке:
telnet www.opera.com 80
Как только соединение установится, введите следующее HTTP сообщение быстро (до того, как соединение автоматически закроется), потом нажмите Enter дважды:
GET / HTTP/1.1
Host: www.opera.com

Это сообщение означает:
  • GET: Что мы хотим получить информацию.
  • /: Что информация, которую мы хотим получить находится в корне сайта.
  • HTTP/1.1: Что мы используем HTTP версии 1.1.
  • Host: Мы пытаемся обратиться к определенному сайту.
  • www.opera.com: имя сайта — www.opera.com.

Теперь настает очередь сервера отвечать. Вы должны увидеть в окне терминала содержимое сайта, начиная с этих строк:
 HTTP/1.1 200 OK
Date: Wed, 23 Nov 2011 19:41:37 GMT
Server: Apache
Content-Type: text/html; charset=utf-8
Set-Cookie: language=none; path=/; domain=www.opera.com; expires=Thu, 25-Aug-2011 19:41:38 GMT
Set-Cookie: language=en; path=/; domain=.opera.com; expires=Sat, 20-Nov-2021 19:41:38 GMT
Vary: Accept-Encoding
Transfer-Encoding: chunked
<!DOCTYPE html>
<html lang="en">



Тут сервер отвечает: «Я использую HTTP версии 1.1. Ваш запрос выполнен успешно, поэтому я отвечаю кодом 200». Строка Ok необязательна и присутствует для объяснения людям, что этот код означает людям — в данном случае, что всё хорошо и наш запрос был успешно обработан. Далее, серия HTTP заголовков отправляется, чтобы объяснить что это за сообщение и как его следует понимать. В итоге, содержимое страницы, расположенной в корне сайта добавляется к ответу начиная со строки <!DOCTYPE html>. Список ключевых слов HTTP и кодов ответа будут описаны в следующих статьях.
image

Резюме


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

Комментарии 19

    0
    Спасибо, а когда будет продолжение?
      +3
      Когда его напишет автор :)
      +9
      Статья для тех, кто не осилил RFC2616?
        +1
        Тут же популярно… А это, разные вещи для некоторых…
        +9
        мне кажется статья слишком поверхностная и иносказательная для ИТ-ресурса. Хотя может быть, кому-то она и будет полезной!)
          +2
          Просили в QA перевести — я перевел. Заодно аккаунт получил )
          +2
          Уберите лишние «переводы каретки» из заголовков, они играют роль ;)
          Визуально сейчас кажется что между каждым заголовоком есть пустая строка, а ее быть не должно, ибо пустая строка означает конец заголовков.
            0
            Спасибо! Действительно стало лучше.
            +3
            Ребята, в этом уроке мы научились использовать команду GET. В следующих 100500 уроках мы рассмотрим остальные HTTP-заголовки.
              0
              Неужели только мне режет глаза жесткий гугльтранзлпщхбфп?!
                0
                Сам перевод — доставляет. Пытался читать то же, но в оригинале, возникла мысль что автор мало знаком с языком…
                  0
                  Спасибо за критику, сегодня постараюсь исправить.
                    0
                    исправил пост — теперь язык стал лучше ?)
                      0
                      Не особо, если честно. Иногда при чтении хотелось плакать.

                      ПыС. Может всё-таки синтаксис, а не синтакс?
                +1
                Удивительно, я даже более-менее внимательно прочитал это. Но

                «Транспортный уровень, описывающий путь, которым доставляются данные из исходной точки с финальному получателю (TCP, UDP)»

                — транспортный уровень не описывает путь, которым доставляются пакеты. Это задача сетевого уровня. Хотя, если используется модель сети TCP/IP, то и уровни называются по-другому.
                  0
                  В TCP/IP тоже есть «транспортный» и «сетевой» уровни.
                    0
                    И «сетевой уровень» криво описан:

                    «Межсетевой уровень, описывающий размещения данных в дейтаграмме и роутинг данных — как они пакуются (IP) »

                    Как будто «роутинг данных» — это способ их упаковки. Но кажется это проблема оригинала:

                    «Internet (layer) describes the envelope and routing of data — how it is packaged (IP)».
                    0
                    Хорошее начинание, надеюсь, дальше будет подробнее и с малоизвестными деталями. Все-таки, у Opera за спиной 16 лет опыта…
                      +2
                      Хотел сначала своим студентам дать ссылку почитать, но ляпы с описанием сетевых уровней и лишние переводы строк между заголовками — только собьют с толку, будет больше вреда.

                      Лучше уже посмотреть википедию ru.wikipedia.org/wiki/HTTP или www.javaportal.ru/java/articles/java_http_web/article03.html#http (хотя вводной воды мало и криво про CGI написано).

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

                      Самое читаемое