Каждый отдельный запрос отправляется на сервер, который обрабатывает его и выдает ответ. Между клиентом и сервером находится несколько объектов, называемых прокси. Они обеспечивают различные уровни функциональности, безопасности и конфиденциальности в зависимости от потребностей или политики компании.
HTTP (Hypertext Transfer Protocol)
Материалы из Национальной библиотеки им. Национальная библиотека имени Баумана Последнее изменение на этой странице: 19:12, 20 июля 2016 г.
Уровень (в соответствии с моделью OSI): | Прикладная |
---|---|
Семья: | Стек протоколов TCP/IP |
Порт/ID: | 80/TCP |
Технические характеристики: | RFC 1945, RFC 2616 |
Основные реализации (клиенты): | Веб-браузеры, такие как Internet Explorer, Mozilla Firefox, Opera, Google Chrome и др. |
Ключевые реализации (серверы): | HTTP-сервер Apache |
Сервер Apache Apache Server: | 1992 |
HTTP (H yper T ext T ransfer P rotocol) — это сетевой протокол прикладного уровня для передачи данных. Она основана на технологии клиент/сервер, т.е. предполагается, что есть клиенты, которые инициируют соединение и посылают запрос, и провайдеры, которые ждут поступления соединения, выполняют необходимые действия и отправляют обратно сообщение с результатом.
HTTP используется для других протоколов прикладного уровня и для передачи любого объекта от сервера к клиенту: Изображения, скрипты, файлы CSS, файлы данных. Он также работает в обратном направлении — для загрузки файлов, отправки форм и т.д. Конечно, AJAX-приложения также взаимодействуют с сервером через HTTP, хотя HTTP иногда используется для более специфических задач, например, для управления содержимым сервера через WebDAV, XML-RPC, WebDAV.
Существуют протоколы, схожие с HTTP, например, FTP и SMTP. Протокол HTTP использует глобальные URL-адреса для идентификации ресурсов. HTTP не хранит свое состояние между парами запрос-ответ. Компоненты HTTP могут хранить информацию. Например, «cookies» хранятся на стороне клиента, а «сессии» — на стороне сервера. Браузер, в свою очередь, может отслеживать задержки ответов, а сервер хранит IP-адреса клиентских запросов.
Содержание
HTTP/0.9 HTTP был предложен в марте 1991 года Тимом Бернерсом-Ли, работавшим тогда в ЦЕРНе, как механизм доступа к документам в Интернете и облегчения навигации с помощью гипертекста. Старшая версия протокола HTTP/0.9 была впервые опубликована в январе 1992 года (хотя реализация датируется 1990 годом). Спецификация протокола привела к упорядочению правил взаимодействия между клиентами и HTTP-серверами и четкому разделению функций между этими двумя компонентами. Основные синтаксис и семантика были задокументированы. HTTP/1.0 В мае 1996 года был опубликован RFC 1945 для практической реализации HTTP, который стал основой для большинства элементов HTTP/1.0. HTTP/1.1 Текущая версия протокола была принята в июне 1999 года. Спецификация HTTP/1.1 была впервые опубликована в январе 1997 года. Он также разъясняет приемлемое поведение клиента (браузера), сервера и прокси-серверов в определенных спорных ситуациях. Другими словами, версия 1.1 была окончательно опубликована в 1997 году. Новым в этой версии стала функция «постоянного соединения»: TCP-соединение может оставаться открытым после отправки ответа на запрос, так что на одно соединение может быть отправлено несколько запросов. Теперь клиент должен отправлять информацию об имени хоста, к которому он обращается, что упрощает настройку виртуального хостинга. HTTP/2 11 февраля 2015 года были опубликованы окончательные черновики следующей версии протокола. В отличие от предыдущих версий, протокол HTTP/2 является бинарным. Ключевые особенности включают мультиплексирование запросов, приоритезацию запросов, сжатие заголовков, параллельный прием нескольких элементов через одно TCP-соединение и поддержку проактивных push-уведомлений на стороне сервера.
HTTP сообщение
HTTP-сообщения включают запросы от клиентов к серверу и ответы от серверов к клиентам.
Сообщения запроса и ответа используют общий формат сообщений RFC-822 для передачи объектов (поле данных сообщения). Оба типа сообщений состоят из начальной строки, одного или нескольких полей заголовка (также называемых «заголовками»), пустой строки (т.е. строки, содержащей CRLF), отмечающей конец полей заголовка, и необязательного текста сообщения.
В целях надежности рекомендуется, чтобы серверы игнорировали все пустые строки, когда ожидается строка запроса. Другими словами: Если сервер читает поток протокола в начале сообщения и сначала получает CRLF, он должен игнорировать CRLF.
Методы
Метод HTTP — это строка, которая определяет основную функцию ресурса, исключая управляющие символы и разделители. Обычно метод — это короткое английское слово, написанное заглавными буквами. Обратите внимание, что имя метода чувствительно к регистру.
Каждый сервер должен поддерживать как минимум методы GET и HEAD. Если сервер не знает метод, указанный клиентом, он должен вернуть статус 501 (Not Implemented). Если сервер знает метод, но он не применим к конкретному ресурсу, он вернет 405 (Method Not Allowed). В обоих случаях сервер должен включить в ответное сообщение заголовок Allow со списком поддерживаемых методов.
Помимо методов GET и HEAD, также часто используется метод POST.
Семантика метода меняется на «условный GET», если сообщение запроса содержит поля заголовка If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match или If-Range. Метод условного GET запрашивает пересылку объекта только при выполнении условий, описанных в соответствующих полях заголовка. Метод условного GET предназначен для снижения ненужного использования сети, позволяя обновлять кэшированные объекты без отправки нескольких запросов или пересылки данных, которые уже есть у клиента. Семантика метода GET меняется на «частичный GET», если сообщение запроса содержит поле заголовка Range. Частичные GET-запросы для пересылки только части объекта. Методы частичного GET направлены на уменьшение ненужного сетевого трафика, разрешая только ту часть объекта, которую клиент хочет отправить, а не пересылать существующие части.
Коды состояния
Некоторые ошибочные реализации клиентов HTTP/1.0 генерируют дополнительный CRLF после POST-запроса. Клиент HTTP/1.1 не должен отправлять CRLF до или после запроса.
Диалог HTTP
Список кодов состояния HTTP#1xx|1xx Список кодов обновления состояния HTTP#1xx|1xx.
Коды, предоставляющие информацию о процессе передачи, помещаются в эту категорию. Для HTTP/1.0 сообщения с такими кодами следует игнорировать. При использовании HTTP/1.1 клиент должен быть готов принять этот класс сообщений в качестве обычного ответа, но не должен ничего отправлять серверу. Сообщения от самого сервера содержат только начальную строку ответа и, если необходимо, некоторые поля заголовков, относящиеся к ответу. Прокси-серверы должны пересылать такие сообщения от сервера к клиенту.
HTTP#2xx|2xx Список кодов состояния успеха
Сообщения этого класса указывают, был ли запрос клиента успешно принят и обработан. В зависимости от статуса, сервер может также переслать заголовки и текст сообщения.
Список кодов состояния HTTP#3xx|3xx Перенаправление
Коды класса 3xx сообщают клиенту, что для успешного завершения транзакции необходимо сделать еще один запрос (обычно на другой URI). Из этого класса пять кодов — список кодов состояния #301|301, список HTTP#302|302, список HTTP#303|303, список HTTP#305|305 и список кодов состояния #307|307 — относятся непосредственно к перенаправлению. Адрес, на который клиент должен направить запрос, указывается сервером в заголовке Location. В URI назначения разрешены сегменты.
Список кодов состояния ошибки клиента HTTP#4xx|4xx
Класс кода 4xx используется для обозначения ошибок на стороне клиента. Если используются все методы, кроме HEAD, сервер должен вернуть гипертекстовое объяснение для пользователя в теле сообщения.
Список кодов состояния ошибок сервера HTTP#5xx|5xx
Кодами 5xx отмечаются случаи, когда операция не удалась из-за ошибки сервера. Во всех случаях, кроме использования метода HEAD, сервер должен включить объяснение в тело сообщения, которое клиент отображает пользователю.
Код | Ошибка | Описание |
---|---|---|
300 | Множественный выбор | Запрашиваемый URL указывает на более чем один ресурс, и робот не смог точно определить, на какую страницу ссылается URL (получен код 300 Multiple Choices). |
301 | Ресурс перемещен на постоянное место | Документ больше не используется на сервере, и ссылка перенаправляет пользователя на другую страницу (был получен код 301 Moved Permanently). |
307 | Временное перенаправление | Запрашиваемый ресурс был временно перемещен на другой адрес, который будет указан на сайте (получен код 307 Temporary Redirection). |
400 | Неверный запрос | Запрос не может быть понят сервером из-за неправильного синтаксиса (получен код 400 Bad Request). |
403 | Доступ к ресурсу запрещен | Доступ к этому документу запрещен (получен код 403 Forbidden). Если вы хотите, чтобы страница была проиндексирована, вы должны разрешить доступ к ней. |
404 | Ресурс не найден | Документ не существует (получен код 404 Not Found). |
410 | Ресурс недоступен | Запрашиваемый ресурс был навсегда удален с вашего сайта (получен код 410 Gone). |
412 | Требование не может быть обработано | При проверке одного или нескольких полей в заголовке запроса было обнаружено несоответствие (ошибка или невозможность обработки предварительного условия). |
417 | Отказано в ожидании | Сервер отказывается обрабатывать запрос, поскольку значение поля Expect в заголовке запроса не соответствует ожиданию (получен код 417 Expectation Failed). |
423 | Заблокировано | Сервер отказывается обрабатывать запрос, потому что один из запрашиваемых ресурсов заблокирован (получен код 423). |
500 | Внутренняя ошибка сервера | Сервер столкнулся с непредвиденным условием, которое не позволяет ему обработать запрос (получен код 500 Internal Server Error). |
502 | Ошибка шлюза | Сервер, выступающий в роли шлюза или посредника, получил недопустимый ответ от следующего сервера в цепочке запросов, к которому он обращался, при попытке завершить запрос. |
505 | Версия HTTP не поддерживается | Сервер не поддерживает или отказывается поддерживать версию протокола HTTP, использованную в сообщении запроса робота (получен код 505 HTTP Version Not Supported). |
Сообщения запроса и ответа используют общий формат сообщений RFC-822 для передачи объектов (поле данных сообщения). Оба типа сообщений состоят из начальной строки, одного или нескольких полей заголовка (также называемых «заголовками»), пустой строки (т.е. строки, содержащей CRLF), отмечающей конец полей заголовка, и необязательного текста сообщения.
Для чего нужен HTTP
Протокол HTTP используется для обмена информацией в модели клиент-сервер. Клиент делает запрос и отправляет его на сервер, сервер обрабатывает и разбирает его, а затем генерируется ответ и отправляется пользователю. В конце этого процесса клиент отдает новую команду, и все повторяется.
Таким образом, протокол HTTP обеспечивает обмен информацией между различными пользовательскими приложениями и определенными веб-серверами, а также подключение к веб-ресурсам (обычно браузерам). Сегодня описанный протокол обеспечивает работу всей сети. Протокол HTTP также используется для передачи информации через другие, подчиненные протоколы, такие как WebDAV или SOAP. Таким образом, протокол является транспортной средой. Многие проекты также полагаются на использование HTTP в качестве основного средства обмена информацией. Данные представлены в различных форматах, например, JSON или XML.
HTTP — это протокол для обмена информацией через IP/TCP-соединение. Обычно сервер использует для этого TCP-порт 80. Если порт не указан, клиентское программное обеспечение по умолчанию использует TCP-порт 80. В некоторых случаях могут использоваться и другие порты.
Протокол HTTP использует симметричную схему шифрования и использует симметричные криптосистемы. В симметричных криптосистемах для шифрования и расшифровки информации используется один и тот же ключ.
Чем отличается HTTP от HTTPS
Das Jahr 2002 gilt gemeinhin als das Jahr, in dem der HDMI-Ausgang eingeführt wurde. Dank vieler bekannter Unternehmen wie Philips, Sony, Hitachi und Toshiba gibt es nun eine neue HDMI-Schnittstelle. Es unterschied sich von den anderen dadurch, dass es vollständig digital war und unkomprimierte Video- und Audioströme übertragen konnte. Die HDMI-Schnittstelle begann, neben dem Videosignal des DVI-Anschlusses auch Audio zu übertragen. Außerdem wurde es möglich, ein einziges Kabel zu verwenden, das auch digitale Videosignale mit höherer Auflösung überträgt. Dies erleichterte das Leben des Durchschnittsnutzers, denn nun kann die Qualität von Audio und Video mit einem einzigen Kabel von einem Gerät zum anderen übertragen werden.
Diese Schnittstelle hat eine höhere Bandbreite als die vorherigen. Das Kabel kann Video in hoher Auflösung (1080p) übertragen, was eines der beliebtesten Formate ist und häufig verwendet wird.
Über die HDMI-Schnittstelle können Sie auch eine gute Audioqualität genießen, denn sie überträgt bis zu acht Kanäle mit 24 Bit und 192kHz. Das Produkt kann Audio und Video gleichzeitig übertragen. DVI verfügte nicht über eine solche Möglichkeit. Darüber hinaus ist die moderne Schnittstelle viel kleiner. Die Vorgängermodelle konnten nur analoge Daten übertragen, während HDMI problemlos digitale Daten verarbeiten kann.
Дополнительный функционал
Ein HDMI-Kabel besteht aus mehreren Teilen. Es besteht aus einem Außenmantel, einem Abschirmungsgeflecht, einer Folienabschirmung (Aluminium), einem Polypropylenmantel, einem geschirmten verdrillten Paar, einem ungeschirmten verdrillten Paar, den für die Stromversorgung und die Steuersignale erforderlichen Leitern.
HDMI-Kabel werden in 5 Typen unterteilt, die jeweils einen eigenen Buchstaben haben:
Typ A (Vollformat) ist zum Beispiel der beliebteste und begehrteste. Es ist in Grafikkarten, Laptops, Fernsehern, Set-Top-Boxen und anderen Geräten zu finden.
Typ B ist für große Auflösungen (z. B. 3830×2400 Pixel) reserviert, wird aber dennoch fast nirgends verwendet.
Typ C (Mini Size) gilt als kleinere Version von Typ A. Er wird in der Regel in kleineren Geräten wie Smartphones, Tablets und anderen verwendet.
Typ D (Micro Size) ist der kleinste Typ von HDMI. Sie ist für kleine Geräte konzipiert.
Der Typ mit dem Buchstaben E kann erforderlich sein, wenn das Gerät an Fahrzeuggeräte angeschlossen ist.
Die gängigsten sind Vollformat (A), Miniformat (C) und Mikroformat (D).
HDMI-Kabel werden ebenfalls in verschiedene Typen unterteilt. Sie kommen in:
Структура HTTP-запроса
Standard-HDMI-Kabel — ermöglicht die Übertragung eines Signals mit 720p-Auflösung.
протокол
Standard-HDMI-Kabel mit Ethernet — Dieses Kabel ähnelt der vorherigen Version, verfügt jedoch über ein zusätzliches verdrilltes Kabelpaar, das für die Netzwerkverbindung erforderlich ist.
High-Speed-HDMI-Kabel — entwickelt für die Übertragung von 4K-Auflösungen und bekannt für seine hervorragende Bandbreite.
метод
High-Speed-HDMI-Kabel mit Ethernet — garantiert hohe Bandbreite. Es wird mit einer zusätzlichen verdrillten Zweidrahtleitung geliefert, die es ermöglicht, Geräte an das Netzwerk anzuschließen.
- Auto-HDMI-Kabel — nützlich in schwierigen Situationen. Es kann hohen Temperaturen und anderen anspruchsvollen Faktoren standhalten.
- HDMI 1.0 — die erste Version konnte acht Kanäle für Video (1080p) und Audio unterstützen. Herausgegeben im Jahr 2002
- HDMI 1.1 — Damit wurde die Unterstützung für den Audioschutz hinzugefügt, um die Wiedergabe von DVDs zu ermöglichen.
- HDMI 1.2 — Diese Version war in der Lage, erfolgreich mit Computern und anderen Geräten zu arbeiten und viele Formate zu unterstützen. Es führte den beliebten A-Stecker ein.
- В отличие от GET, метод POST не считается идемпотентным4, т.е. повторение одного и того же запроса POST несколько раз может привести к различным результатам (например, после каждого отправленного комментария отображается его копия).
- Каждый запрос имеет одинаковый формат:
- Указывает, какую конкретную версию протокола HTTP следует использовать. Наиболее распространенными являются версии 1.0 и 1.1, но также может отображаться устаревшая версия 0.9 или более новая версия 2.0. Однако веб-сервер может не поддерживать указанную версию и выдать ошибку. На практике подавляющее большинство веб-серверов поддерживают версии 1.0 и 1.1.
- Релевантный путь (не доменное имя) к документу. В нашем примере указан корень /, но путь может быть любым: /index.php, /catalog/food/milk. Документ — это не только файл с расширением .html, но и любой другой файл, например, изображения, .css, .js.
Он определяет, что веб-сервер должен сделать с документом в указанном «/path».
Заголовки
GET — возврат документа — GET /messages/1.
HEAD — возвращает только заголовки без самой страницы. Это полезно, если мы хотим проверить, действительна ли ссылка на документ. Пример: HEAD /messages/1
- POST — отправка данных для создания документа — POST /messages (и детали нового сообщения).
- PUT — изменение документа
- PATCH — частичное обновление документа
- УДАЛИТЬ — удалить документ
- TRACE, CONNECT — технические методы, без которых можно обойтись.
- OPTIONS — запрос к веб-серверу на возврат разрешенных параметров для запросов в указанном документе. Ответ содержит список разрешенных методов.
- На практике около 80% запросов — это GET, 15% — POST и 5% — все остальные методы.
- Они необязательны (в нашем примере их вообще не было) и указывают веб-серверу, как именно обрабатывать запрос. Например, клиент отправляет текстовый запрос в формате utf-8 и ожидает получить закодированный json с cp1251.
Наиболее распространенные заголовки:
Accept — формат ответа: простой текст, html, xml, json, что угодно.
Структура HTTP-ответа на основе примера выше
Accept charset — кодировка тела запроса: utf8, cp1251, koi8.
протокол
Авторизация — данные для авторизации между запросами. Здесь обычно передаются API-токены. Авторизация между запросами описана ниже.
статус и пояснение
Accept-Language — Список языков, с которыми мы согласны. Например: «Accept-Language: ru».
Cache-Control — настройки для кэша страницы.
Cookies — известные браузеру файлы cookie, которые хранят идентификаторы сеансов и предпочтения пользователя.
- Referrer — страница, с которой был сделан текущий запрос. Полезен для анализа сайта и, например, для возврата пользователя на главную страницу после регистрации.
- User agent — тип клиента (обычно тип браузера). Пример: «Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36». Это поле часто используется на сервере для отслеживания количества запросов от устройства и блокировки их при превышении лимита. Однако это не панацея, поскольку после блокировки злоумышленник может изменить пользовательский агент на любой другой.
- Для GET-запросов тело не имеет смысла, поскольку необходимы только путь к начальной строке и заголовки. Но что происходит, когда мы хотим отправить информацию на сервер? Подпись для входа, форма обратной связи, форма создания поста? Для этого используется POST-запрос.
- Каждый элемент формы имеет атрибут name. В нашем примере страница http://http.maxkuznetsov.ru содержит форму с единственным тегом input, который имеет name=»name». Это имя и введенное пользователем значение отправляются на сервер. В консоли такой запрос браузера будет выглядеть следующим образом:
- Вы заметите, что структура ответа аналогична структуре запроса. Однако есть несколько тонких деталей. Первая строка ответа выглядит иначе:
Значение поля такое же, как в запросе. Однако он может отличаться от версии, запрашиваемой браузером, если веб-сервер его не понимает.
заголовки
Статус HTTP — это трехзначное значение и короткая поясняющая фраза. Все фразы стандартизированы и четко указывают на состояние.
- Существует более сотни состояний, но не все они используются браузерами. Некоторые из них относятся к далекому будущему, другие очень конкретны.
- Первая цифра государства указывает на категорию:
- 1xx — информативный — технические состояния, которые вы вряд ли увидите в реальной жизни.
2xx — запросы с деталями, которые были успешно обработаны. Наиболее распространенные: 200 — все в порядке, 201 — документ создан, 204 — запрос успешно завершен, но ответ содержит заголовки и пустое тело. На практике текущие API не утруждают себя и возвращают 200 в 95% случаев, а детали успешной операции отправляются в теле.
Про аутентификацию и авторизацию
3xx — перенаправление — запрос должен быть перенаправлен на другой адрес, указанный в заголовке location. Общие: 301 — документ постоянно перемещен, 302 — документ временно перемещен. Они очень важны для того, чтобы поисковые боты индексировали ваш сайт. 301 указывает боту запомнить новый адрес страницы и забыть предыдущий.
4xx — Ошибка клиента — запрос не содержит всех данных или недействителен (400), требует аутентификации (401) или недостаточно прав для выполнения операции (403), запрашиваемая страница не существует (404) или метод запроса http запрещен для этой страницы (405).
- 5xx — Ошибка сервера или непредвиденная ошибка (500), запрос обрабатывается вышестоящим сервером, например, php-fpm не отвечает на nginx (502), сервер временно недоступен по техническим причинам (503), сервер ожидает ответа и запрос не выполняется из-за таймаута (504). например, типичный таймаут для выполнения php-скрипта составляет 30 секунд. Если скрипт запрашивает сторонний ресурс, который находится под нагрузкой, nginx выдаст ошибку 504.
- Даже сбой не мешает серверу вернуть веб-страницу, которую браузер затем отображает как ни в чем не бывало. Попробуйте открыть несуществующую страницу в моем блоге: https://maxkuznetsov.ru/non-existed-page. Тогда сервер возвращает 404 вместо 200, но мы все равно можем показать пользователю что-то полезное.
Заголовки сервера имеют ту же функцию, что и заголовки запроса. Есть несколько общих заголовков, таких как Cache-Control, но есть и уникальные заголовки.
Allow — дает список разрешенных http-методов для запросов.
Протокол HTTP
Местонахождение — адрес для пересылки.
WWW-Authenticate — информация о методе аутентификации; запрос должен отправить соответствующую информацию в заголовок Authorisation.
- Тело ответа также отделяется от заголовка буквенно-цифровым пробелом. В тело можно ввести все что угодно — текст, html, json, xml, изображения и другие файлы. Все они передаются браузеру в одном и том же формате, но с различным заголовком Content-Type, который указывает браузеру, как отобразить содержимое пользователю: как HTML-страницу, как изображение, отобразить встроенный в браузер просмотрщик PDF или начать загрузку файла.
- Если посмотреть на структуру HTTP-запросов и ответов, то становится ясно, что каждый запрос к веб-серверу является единственным запросом и не хранит никакого состояния. Это означает, что если вы сделаете два одинаковых запроса из одного и того же браузера, веб-сервер будет рассматривать их так, как будто они поступили от разных пользователей.
- Существует два способа обойти это ограничение:
Хранение уникального идентификатора сессии в cookies, который браузер сохраняет локально при запросе сервера, а затем присоединяет к каждому запросу в виде заголовка «cookie». Сервер анализирует заголовок cookie для каждого запроса и «узнает» пользователя по сохраненному идентификатору.
Через заголовок авторизации браузер отправляет серверу маркер (который может принимать различные формы) для каждого запроса, который сервер использует для идентификации пользователя, подобно сессии. Это наиболее распространенный метод, используемый в API.
Поскольку протокол http передает все данные в незащищенном формате, ни один из этих методов не является безопасным, и идентификатор сессии или маркер может быть легко перехвачен злоумышленником. В качестве решения этой проблемы следует использовать более безопасный брат HTTP — HTTPS.
Запросы HEAD работают так же, как и запросы, отправленные методом GET, но клиент получает от сервера не все данные, а только информацию заголовка.
HTTP был разработан как протокол для обмена данными между веб-сервером и веб-браузером. Это протокол прикладного уровня модели OSI, который используется для передачи HTML, CSS, JS, API, изображений, аудио, видео, пользовательского ввода и других данных между клиентом и сервером. Клиент (веб-браузер) посылает запросы и получает ответы от сервера (веб-сервера). Сервер почти всегда занимает пассивную позицию в протоколе HTTP.
- Существует три основных объекта, которые обмениваются сообщениями:
- Клиент (агент пользователя) — программа, которая отправляет запросы, получает ответы и обрабатывает ответы от имени пользователя на устройстве пользователя, например, в браузере.
- Сервер (веб-сервер) — программа, которая работает на сервере, принимает и обрабатывает запросы от клиента, а затем отправляет ответы клиенту. Эта программа является веб-сервером.
- Прокси — программа, которая работает на сервере, пересылает запросы и ответы и действует как посредник между клиентом и сервером.
- Подробнее о веб-серверах читайте в статье «Веб-сервер».
- На первом этапе клиент подключается к серверу через протокол транспортного уровня TCP. Клиент может повторно использовать одно и то же соединение для работы с сервером или создать новое. Это зависит от задачи, конфигурации сети и конкретных настроек оборудования. После установления соединения клиент отправляет HTTP-сообщение с телом и параметрами запроса. Сервер получает это сообщение, генерирует и отправляет ответное сообщение HTTP, основываясь на логике бэкенда.
Протокол HTTP не хранит состояние, поэтому количество соединений существенно не усложняет взаимодействие между объектами системы. Однако существует понятие сессии, которая может быть использована для передачи и хранения необходимых данных, относящихся к определенному сеансу связи. Данные сессии хранятся на клиенте и на сервере. Например, существует идентификатор сессии, который позволяет клиенту быть неавторизованным при каждом обращении к серверу.
Формат сообщения
Cookies часто используются для хранения данных о сеансе работы.
- Прокси-серверы берут на себя функции обслуживания:
- Временное хранение данных запроса или ответа для повышения производительности и снижения сетевого трафика.
- Фильтрация данных. Например, вы можете проверить данные с помощью антивирусной программы или использовать средства родительского контроля.
Выполните балансировку нагрузки, распределяя запросы по разным серверам.
Стартовая строка
Аутентификация клиентов для контроля доступа к ресурсам.
Храните информацию о запросах клиента и ответах сервера для ведения журнала.
Обнаружение определенных типов атак на сетевой узел (например, обнаружение подозрительного трафика или DDoS-атак).
Подробнее о различных атаках читайте в статье Безопасность веб-приложений.
- Сообщение HTTP — это чистый текст. Структура сообщения точно определена:
- Стартовая линия,
- Заголовки, содержащие информацию о службе,
- Основная часть сообщения содержит данные в текстовом формате.
- Тело сообщения — это необязательная часть сообщения, которая может существовать или не существовать. Это происходит, например, с некоторыми GET-запросами (т.е. клиентскими запросами с GET в качестве метода получения) или со всеми HEAD-запросами. Если текст сообщения существует, он указывается заголовками Content — Length или Transport — Encoding.
- Начальная строка запроса содержит метод запроса, связанный адрес и версию протокола в формате HTTP Method / Version URI. Заголовок ответа содержит версию протокола, код и статус ответа сервера в формате HTTP / Версия Код Статус .
- Когда браузер посылает запрос на открытие главной страницы сайта, начальная строка запроса имеет следующий формат:
- Если страница существует и доступна, начальная строка ответа выглядит следующим образом:
- Методы запросов описывают тип обработки данных, которую хочет выполнить клиент. Доступны следующие методы:
OPTIONS — используется для указания возможностей сервера по преобразованию данных.
- GET — используется для получения данных с сервера.
- HEAD — то же самое, что и GET, но не включает тело в ответное сообщение.
- POST — используется для отправки данных на сервер.
- PUT — используется для добавления новых данных или изменения существующих данных на сервере.
- PATCH — То же самое, что и PUT, но используется для обновления данных.
DELETE — используется для удаления данных с сервера.
- TRACE — Возвращает запрос от клиента таким образом, что ответ содержит информацию о преобразованиях запроса на промежуточных серверах.
- CONNECT — преобразование текущего соединения в туннель TCP/IP. Обычно этот метод используется для установления защищенного SSL-соединения.
- Код состояния в ответе сервера содержит информацию о результате обработки данных. Существует пять категорий кодов состояния:
- 1xx — обработка данных на сервере продолжается,
- 2xx — успешная обработка данных,
- 3xx — перенаправление запроса,
- 4xx — ошибка клиента,
5xx — ошибка на стороне сервера.
Использование заголовков
Наиболее распространенные ответы сервера (коды состояния и состояния):
- 200 OK, если запрос был успешно обработан.
- 301 Moved Permanently, если переадресация используется постоянно.
- 307 Temporarily Redirected, если перенаправление используется временно.
- 400 Bad Request, если запрос содержит синтаксическую ошибку.
403 Forbidden, если запрос успешен, но сервер не может его завершить, так как пользователь не имеет достаточных прав.
Плюсы и минусы HTTP
404 Not Found, если запрашиваемый ресурс не существует.
Преимущества
500 Internal Server Error, если во время выполнения программы на сервере произошла ошибка.
Все возможные ситуации описаны в регистрационном коде, а также во вспомогательных ресурсах.
Недостатки
Заголовки делятся на четыре группы:
Основные заголовки, которые могут быть включены в любое сообщение клиента и сервера.
Заголовки запросов, которые используются только в сообщениях клиента.
Заголовки ответа, которые используются только в сообщениях сервера.
Заголовки сущностей для описания данных в сообщении.
Код состояния информирует клиента о результате запроса и определяет его дальнейшее поведение. Набор кодов состояния является стандартным, и все они описаны в соответствующих документах RFC.
Хотя этот протокол используется повсеместно, годы его применения выявили как преимущества, так и недостатки HTTP.
Протокол был разработан с учетом масштабируемости. В процессе разработки HTTP «обогащался» новыми методами, кодами ответов, заголовками и функциями. HTTP/3, последняя версия, использует, например, QUIC от Google вместо TCP.
Как реализована защита данных в HTTPS
HTTP хорошо документирован — есть документация на многих языках — поэтому его может использовать широкий круг разработчиков.
HTTP не имеет очевидных средств навигации по ресурсам сервера. Простой пример: Если вы используете FTP, вы можете запросить полный список доступных файлов, но HTTP не позволяет вам этого сделать. К счастью, это уже исправлено в WebDAV, который расширяет HTTP с помощью метода PROPFIND. Вы можете использовать его для получения дерева каталогов и параметров для каждого доступного ресурса.
Как вы помните из истории HTTP, изначально протокол был создан для решения простой задачи, поэтому время обработки HTTP-запросов не учитывалось. Однако впоследствии его популярность и распространенность возросли, и стало ясно, что HTTP не подходит для ситуаций, когда сервер сильно загружен. Решением этой проблемы стал HTTP-NG (Next Generation) в 1998 году, но этот экспериментальный протокол так и не был использован.
- HTTPS: да здравствует безопасность
- Несмотря на очевидные преимущества HTTP, есть еще один недостаток, который мы обошли стороной ранее.
- Протокол HTTP не обеспечивает защиту данных в пути.
- Помните, мы говорили ранее, что между клиентом и сервером (или наоборот) существует множество посредников? Если хотя бы один из этих посредников скомпрометирован, данные могут быть перехвачены. Решением этой проблемы сегодня является HTTPS.
- HTTPS — это расширение протокола HTTP с поддержкой шифрования.
- Всего 5-10 лет назад в интернете было много сайтов и сервисов, которые работали по протоколу HTTP, тогда как сегодня все современные браузеры требуют HTTPS.
Когда информация передается по протоколу HTTPS, все данные шифруются с помощью протокола шифрования SSL/TLS. Она защищает все, от сервера до клиента, от посторонних глаз и предотвращает подслушивание трафика данных.
На простом примере посмотрим, как работает такая «обертка».
Предположим, вы хотите передать посылку знакомому.
Структура протокола¶
Для этого вы кладете его в специальную коробку, запечатываете и отправляете по почте.
- Почтальон приносит коробку получателю, но не может открыть замок — нет ключа.
- Затем получатель снова запирает ящик и снова отправляет его вам.
- Вы открываете свой собственный замок и снова отправляете коробку своему другу.
Никто не сможет снова открыть коробку по пути от отправителя к получателю — она остается запертой на второй замок.
Но получатель может. Он получает посылку на почте или у почтальона и открывает ее своим ключом.
Примерно так работает протокол SSL/TLS. Клиент и сервер совместно используют секретный ключ и обмениваются только данными, зашифрованными с помощью этого ключа. Перехватить или угадать ключ невозможно. Но как убедиться, что человек, с которым вы разговариваете, действительно тот, за кого себя выдает? Для этого и существуют цифровые сертификаты.
Цифровой сертификат — это документ, который идентифицирует сервер. Любой веб-сайт (сервер), к которому вы хотите подключиться безопасно, должен иметь защищенное соединение. Он проверяет, что лицо, которому выдан сертификат, действительно существует и управляет сервером, указанным в сертификате. Если в левой части адресной строки вы видите значок замка, это означает, что сайт имеет сертификат SSL и данные при передаче шифруются.
Однако спецификация HTTP/1.1, опубликованная в 1999 году, может считаться самой долгоживущей — она оставалась неизменной в течение 16 лет. Кстати, на его основе были разработаны и другие протоколы.
Структура протокола такова, что каждое сообщение HTTP состоит из трех частей (Рисунок 1), которые передаются в следующем порядке:
- Начальная строка — определяет тип сообщения,
- Заголовок — описывает текст сообщения, параметры передачи и другую информацию,
- Текст сообщения — содержит фактические данные сообщения. Он должен быть отделен от строк заголовка пустой строкой.
- Рисунок 1. Структура протокола HTTP (потеря пакетов, получено с помощью сниффера Wireshark).
Заголовок HTTP занимает одну строку в сообщении HTTP и содержит пару, разделенную двоеточием, например, «параметр-значение». Формат заголовка соответствует обычному формату текстовых сообщений сети ARPA (RFC 822). Как правило, браузер и веб-сервер включают в сообщения более одного заголовка. Заголовки должны быть отправлены перед телом сообщения и отделены от него как минимум одной пустой строкой (CRLF).
Имя параметра должно состоять как минимум из одного печатного символа (код ASCII от 33 до 126), за которым сразу следует двоеточие. Значение может содержать все символы ASCII, кроме перевода строки (CR, код 10) и возврата переноса (LF, код 13).
Пробелы в начале и конце значения усекаются. Последовательность из нескольких пробелов в значении может рассматриваться как один пробел. Регистр символов в имени и значении не имеет значения (если иное не указано в формате поля).
Пример заголовков ответа сервера:
Все заголовки HTTP делятся на четыре основные группы: | Общие заголовки — должны быть включены в каждое сообщение клиента и сервера. | Заголовки запроса — используются только в клиентских запросах. |
---|---|---|
Заголовки ответа — включаются только в ответы сервера. | Заголовки сущностей — сопровождают каждую сущность сообщения. | Сущность (часто переводится как «объект») представляет собой полезную информацию, переданную ей в запросе или ответе. Сущность состоит из метаинформации (заголовки) и содержимого (тело сообщения). |
Заголовки сущностей выделены в отдельный класс, чтобы избежать путаницы с заголовками запроса и ответа при передаче multipart/*. Заголовки запроса и ответа, как и основные заголовки, описывают сообщение в целом и размещаются только в блоке заголовков, в то время как заголовки сущностей описывают содержимое каждой части отдельно и размещаются непосредственно перед телом сообщения. | Заголовки сущностей — сопровождают каждую сущность сообщения. | Таблица 3: HTTP-заголовки |
Заголовок | Заголовки сущностей — сопровождают каждую сущность сообщения. | Краткое описание |
Разрешить | Заголовки сущностей — сопровождают каждую сущность сообщения. | Список методов, применяемых к запрашиваемому ресурсу. |
Кодирование содержимого | Заголовки сущностей — сопровождают каждую сущность сообщения. | Используется, когда содержимое необходимо перекодировать (например, gzip/deflated). |
Язык содержания | Заголовки сущностей — сопровождают каждую сущность сообщения. | Поиск контента (язык(и)) |
Длина содержания | Заголовки сущностей — сопровождают каждую сущность сообщения. | Размер тела сообщения (в октетах) |
Область содержания | Заголовки сущностей — сопровождают каждую сущность сообщения. | Диапазон (для поддержки многопоточной загрузки или предварительной загрузки) |
Тип содержимого | Сущность | Определяет тип содержимого (mime-type, например, text/html); часто содержит ссылку на локальную таблицу символов (charset). |
Окончание: | Сущность | Дата/время, после которого истекает срок действия ресурса. Используется прокси-серверами. |
Последнее изменение | Сущность | Дата/время последнего изменения сущности. |
Контроль кэша | Сущность | Определяет инструкции для управления механизмами кэша. Для прокси-серверов. |
Вход в систему | Сущность | Указывает параметры, необходимые для конкретного соединения. |
Дата | Сущность | Дата и время создания сообщения. |
Pragma | Сущность | Используется для специальных инструкций, которые (по желанию) могут быть применены к любой цели в цепочке запрос/ответ (например, pragma: no-cache). |
Кодирование передачи | Общие сведения | Определяет тип преобразования, которое применяется к телу сообщения. В отличие от Content-Encoding, этот заголовок применяется ко всему сообщению, а не только к сущности. |
О сайте | Общие сведения | Используется шлюзами и прокси-серверами для указания промежуточных протоколов и хостов между клиентом и веб-сервером. |
Предупреждение | Общие сведения | Дополнительная информация о текущем состоянии, которая не может быть представлена в сообщении. |
Принять | Общие сведения | Указывает применимые типы данных, ожидаемые в ответе. |
Accept-Charset | Общие сведения | Указывает кодировку символов (charset) для данных, ожидаемых в ответе. |
Принятие-кодирование | Общие сведения | Укажите применимые форматы кодирования/декодирования содержимого (например, gzip). |
Accept-Language | Общие сведения | Применяемые языки. Используется для согласования передач. |
Авторизация | Общие сведения | Учетные данные клиента, запрашивающего ресурс. |
С сайта | Общие сведения | Адрес электронной почты отправителя |
Хозяин | Общие сведения | Имя сервера/сетевой адрес и порт. Если порт не указан, используется порт 80. |
If-changed-from | Общие сведения | Используется для выполнения условных методов (If-Modified. ). Если запрашиваемый ресурс был изменен, ресурс передается с сервера, в противном случае он передается из кэша. |
Max-Forwards | Общие сведения | Представляет собой механизм для ограничения количества гейтов и прокси при использовании методов TRACE и OPTIONS. |
Прокси | Запрос | Используется для запросов, передаваемых прокси-серверами, которые требуют аутентификации. |
Ссылка | Запрос | Адрес, с которого подается запрос. Этот заголовок отсутствует, если запрос отправляется из адресной строки или по ссылке из js-скрипта, например. |
Пользовательский агент | Запрос | Информация об агенте пользователя (клиенте) |
Тело сообщения¶
Местонахождение
Ответ
Адрес перенаправления
Прокси-аутентификация