stringtranslate.com

HTTP

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

Разработка HTTP была инициирована Тимом Бернерсом-Ли в ЦЕРНе в 1989 году и обобщена в простом документе, описывающем поведение клиента и сервера с использованием первой версии HTTP, названной 0.9. [2] Эта версия впоследствии была доработана, в конечном итоге став общедоступной 1.0. [3]

Разработка первых HTTP- запросов на комментарии (RFC) началась несколько лет спустя в результате скоординированных усилий Инженерной группы Интернета (IETF) и Консорциума Всемирной паутины (W3C), а затем работа была передана IETF.

HTTP/1 был окончательно доработан и полностью задокументирован (как версия 1.0) в 1996 году. [4] Он развивался (как версия 1.1) в 1997 году, а затем его спецификации обновлялись в 1999, 2014 и 2022 годах. [5] Его защищенный вариант под названием HTTPS используется более чем 85% веб-сайтов. [6]

HTTP/2 , опубликованный в 2015 году, обеспечивает более эффективное выражение семантики HTTP «на проводе». По состоянию на август 2024 года его поддерживают 66,2% веб-сайтов [7] [8] (35,3% HTTP/2 + 30,9% HTTP/3 с обратной совместимостью) и поддерживают почти все веб-браузеры (более 98% пользователей). [9] Он также поддерживается основными веб-серверами по протоколу Transport Layer Security (TLS) с использованием расширения Application-Layer Protocol Negotiation (ALPN) [10] , где требуется TLS 1.2 или более новая версия. [11] [12]

HTTP/3 , преемник HTTP/2, был опубликован в 2022 году. [13] По состоянию на февраль 2024 года он теперь используется на 30,9% веб-сайтов [14] и поддерживается большинством веб-браузеров, т. е. (по крайней мере частично) поддерживается 97% пользователей. [15] HTTP/3 использует QUIC вместо TCP для базового транспортного протокола. Как и HTTP/2, он не отменяет предыдущие основные версии протокола. Поддержка HTTP/3 была добавлена ​​в Cloudflare и Google Chrome в первую очередь, [16] [17] а также включена в Firefox . [18] HTTP/3 имеет меньшую задержку для реальных веб-страниц, если включен на сервере, и загружается быстрее, чем с HTTP/2, в некоторых случаях более чем в три раза быстрее, чем HTTP/1.1 (который до сих пор обычно только включен). [19]

Технический обзор

HTTP функционирует как протокол запрос-ответ в модели клиент-сервер . Например, веб-браузер может быть клиентом , тогда как процесс , называемый веб-сервером , работающий на компьютере, на котором размещен один или несколько веб-сайтов, может быть сервером . Клиент отправляет сообщение HTTP- запроса на сервер. Сервер, который предоставляет ресурсы, такие как файлы HTML и другой контент, или выполняет другие функции от имени клиента, возвращает клиенту ответное сообщение. Ответ содержит информацию о статусе завершения запроса и может также содержать запрошенный контент в теле сообщения.

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

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

Чтобы промежуточные HTTP-узлы (прокси-серверы, веб-кэши и т. д.) могли выполнять свои функции, некоторые HTTP-заголовки (встречающиеся в HTTP-запросах/ответах) управляются пошагово, тогда как другие HTTP-заголовки управляются сквозным образом (управляются только исходным клиентом и целевым веб-сервером).

HTTP — это протокол прикладного уровня , разработанный в рамках набора протоколов Интернета . Его определение предполагает базовый и надежный протокол транспортного уровня . [20] В последней версии HTTP/3 протокол управления передачей (TCP) больше не используется, но более старые версии все еще используются чаще и чаще всего используют TCP. Они также были адаптированы для использования ненадежных протоколов, таких как протокол пользовательских датаграмм (UDP), на котором HTTP/3 также (косвенно) всегда строится, например, в HTTPU и простом протоколе обнаружения служб (SSDP).

HTTP-ресурсы идентифицируются и размещаются в сети с помощью унифицированных указателей ресурсов (URL), использующих схемы унифицированных идентификаторов ресурсов (URI) http и https . Как определено в RFC  3986, URI кодируются как гиперссылки в HTML- документах, чтобы сформировать взаимосвязанные гипертекстовые документы.

В HTTP/1.0 для каждого запроса ресурса создается отдельное TCP- соединение с тем же сервером. [21]

В HTTP/1.1 вместо этого TCP-соединение может быть повторно использовано для выполнения нескольких запросов ресурсов (например, HTML-страниц, фреймов, изображений, скриптов , таблиц стилей и т. д.). [22] [23]

Поэтому HTTP/1.1-коммуникации испытывают меньшую задержку , поскольку установление TCP-соединений сопряжено со значительными накладными расходами, особенно в условиях интенсивного трафика. [24]

HTTP/2 — это переработанный вариант предыдущего HTTP/1.1, сохраняющий ту же модель клиент-сервер и те же методы протокола, но со следующими отличиями:

Поэтому при обмене данными по протоколу HTTP/2 задержка значительно меньше, а скорость в большинстве случаев даже выше, чем при обмене данными по протоколу HTTP/1.1.

HTTP/3 — это пересмотр предыдущего HTTP/2 с целью использования транспортных протоколов QUIC + UDP вместо TCP. До этой версии использовались соединения TCP/IP; но теперь используется только уровень IP (на котором UDP, как и TCP, строится). Это немного улучшает среднюю скорость связи и позволяет избежать случайной (очень редкой) проблемы перегрузки соединения TCP , которая может временно блокировать или замедлять поток данных всех его потоков (еще одна форма « блокировки начала очереди »).

История

Тим Бернерс-Ли

Термин гипертекст был придуман Тедом Нельсоном в 1965 году в проекте Xanadu , который, в свою очередь, был вдохновлен видением Ванневара Буша 1930-х годов системы поиска и управления информацией на основе микрофильмов « memex », описанной в его эссе 1945 года « As We May Think ». Тиму Бернерсу-Ли и его команде в ЦЕРНе приписывают изобретение оригинального HTTP, а также HTML и связанной с ним технологии для веб-сервера и клиентского пользовательского интерфейса, называемого веб-браузером . Бернерс-Ли разработал HTTP, чтобы помочь с принятием его другой идеи: проекта «WorldWideWeb», который был впервые предложен в 1989 году, теперь известного как Всемирная паутина .

Первый веб-сервер был запущен в 1990 году. [26] [27] Используемый протокол имел только один метод, а именно GET, который запрашивал страницу с сервера. [28] Ответом от сервера всегда была HTML-страница. [2]

Сводка версий HTTP-этапа

HTTP/0.9

В 1991 году первая задокументированная официальная версия HTTP была написана в виде простого документа длиной менее 700 слов, и эта версия была названа HTTP/0.9, которая поддерживала только метод GET, позволяя клиентам только извлекать HTML-документы с сервера, но не поддерживая никаких других форматов файлов или загрузку информации. [2]

HTTP/1.0-черновик

С 1992 года был написан новый документ, определяющий эволюцию базового протокола в направлении его следующей полной версии. Он поддерживал как простой метод запроса версии 0.9, так и полный запрос GET, включающий клиентскую версию HTTP. Это был первый из многих неофициальных черновиков HTTP/1.0, которые предшествовали окончательной работе над HTTP/1.0. [3]

Рабочая группа W3C HTTP

После того, как было принято решение о необходимости внедрения новых функций протокола HTTP и о том, что они должны быть полностью документированы в качестве официальных документов RFC , в начале 1995 года была создана рабочая группа HTTP (HTTP WG, возглавляемая Дейвом Рэггеттом ) с целью стандартизации и расширения протокола с помощью расширенных операций, расширенного согласования, более богатой метаинформации, связанной с протоколом безопасности, который стал более эффективным за счет добавления дополнительных методов и полей заголовков . [29] [30]

Рабочая группа HTTP планировала пересмотреть и опубликовать новые версии протокола как HTTP/1.0 и HTTP/1.1 в течение 1995 года, но из-за многочисленных изменений этот график растянулся намного больше, чем на год. [31]

Рабочая группа HTTP также планировала разработать версию HTTP в далеком будущем под названием HTTP-NG (HTTP Next Generation), которая решила бы все оставшиеся проблемы предыдущих версий, связанные с производительностью, малой задержкой ответов и т. д. Однако эта работа началась лишь несколько лет спустя и так и не была завершена.

HTTP/1.0

В мае 1996 года был опубликован RFC  1945 как окончательная редакция HTTP/1.0 того, что использовалось в течение предыдущих 4 лет в качестве предстандартного проекта HTTP/1.0, который уже использовался многими веб-браузерами и веб-серверами.

В начале 1996 года разработчики начали даже включать неофициальные расширения протокола HTTP/1.0 (например, соединения keep-alive и т. д.) в свои продукты, используя проекты будущих спецификаций HTTP/1.1. [32]

HTTP/1.1

С начала 1996 года основные разработчики веб-браузеров и веб-серверов также начали внедрять новые функции, указанные в предстандартных спецификациях HTTP/1.1. Принятие новых версий браузеров и серверов конечными пользователями было быстрым. В марте 1996 года одна компания веб-хостинга сообщила, что более 40% браузеров, используемых в Интернете, использовали новый заголовок HTTP/1.1 "Host" для включения виртуального хостинга , и что к июню 1996 года 65% всех браузеров, обращающихся к их серверам, были совместимы с предстандартным HTTP/1.1. [33]

В январе 1997 года RFC  2068 был официально выпущен как спецификация HTTP/1.1.

В июне 1999 года был выпущен RFC  2616, включающий все улучшения и обновления, основанные на предыдущих (устаревших) спецификациях HTTP/1.1.

Рабочая группа W3C HTTP-NG

Продолжая старый план предыдущей рабочей группы HTTP 1995 года, в 1997 году была сформирована рабочая группа HTTP-NG для разработки нового протокола HTTP под названием HTTP-NG (HTTP New Generation). Было подготовлено несколько предложений/черновиков для нового протокола, чтобы использовать мультиплексирование транзакций HTTP внутри одного соединения TCP/IP, но в 1999 году группа прекратила свою деятельность, передав технические проблемы в IETF. [34]

Рабочая группа IETF HTTP перезапущена

В 2007 году рабочая группа IETF HTTP (HTTP WG bis или HTTPbis) была перезапущена, во-первых, для пересмотра и уточнения предыдущих спецификаций HTTP/1.1, а во-вторых, для написания и уточнения будущих спецификаций HTTP/2 (названных httpbis). [35] [36]

SPDY: неофициальный протокол HTTP, разработанный Google.

В 2009 году частная компания Google объявила, что разработала и протестировала новый двоичный протокол HTTP под названием SPDY . Неявной целью было значительное ускорение веб-трафика (особенно между будущими веб-браузерами и их серверами).

SPDY действительно оказался намного быстрее HTTP/1.1 во многих тестах, поэтому его быстро приняли в Chromium , а затем и в других основных веб-браузерах. [37]

Некоторые идеи о мультиплексировании потоков HTTP по одному соединению TCP/IP были взяты из различных источников, включая работу рабочей группы W3C HTTP-NG.

HTTP/2

В январе–марте 2012 года рабочая группа HTTP (HTTPbis) объявила о необходимости начать концентрироваться на новом протоколе HTTP/2 (завершая пересмотр спецификаций HTTP/1.1), возможно, принимая во внимание идеи и работу, проделанную для SPDY. [38] [39]

После нескольких месяцев раздумий о том, что делать с разработкой новой версии HTTP, было решено вывести ее из SPDY. [40]

В мае 2015 года HTTP/2 был опубликован как RFC  7540 и быстро принят всеми веб-браузерами, уже поддерживающими SPDY, и несколько медленнее — веб-серверами.

Обновления HTTP/1.1 за 2014 год

В июне 2014 года рабочая группа HTTP выпустила обновленную спецификацию HTTP/1.1 из шести частей, отменяющую RFC  2616:

Устаревание HTTP/0.9

В RFC  7230 Приложение-A протокол HTTP/0.9 был объявлен устаревшим для серверов, поддерживающих версию HTTP/1.1 (и выше): [41]

Поскольку HTTP/0.9 не поддерживал поля заголовков в запросе, нет механизма для поддержки виртуальных хостов на основе имен (выбор ресурса путем проверки поля заголовка Host). Любой сервер, реализующий виртуальные хосты на основе имен, должен отключить поддержку HTTP/0.9 . Большинство запросов, которые выглядят как HTTP/0.9, на самом деле являются плохо сконструированными запросами HTTP/1.x, вызванными тем, что клиент не смог правильно закодировать цель запроса.

С 2016 года многие менеджеры по продуктам и разработчики пользовательских агентов (браузеров и т. д.) и веб-серверов начали планировать постепенное прекращение поддержки протокола HTTP/0.9, в основном по следующим причинам: [42]

[примечание 2]

HTTP/3

В 2020 году были опубликованы первые черновики HTTP/3 , и основные веб-браузеры и веб-серверы начали его внедрять.

6 июня 2022 года IETF стандартизировал HTTP/3 как RFC  9114. [43]

Обновления и рефакторинг в 2022 году

В июне 2022 года был опубликован пакет RFC, объявляющий устаревшими многие из предыдущих документов и вносящий несколько незначительных изменений и рефакторинг описания семантики HTTP в отдельный документ.

HTTP-обмен данными

HTTP — это протокол уровня приложения без сохранения состояния , требующий надежного сетевого транспортного соединения для обмена данными между клиентом и сервером. [20] В реализациях HTTP соединения TCP/IP используются с использованием известных портов (обычно порт 80 , если соединение не зашифровано, или порт 443, если соединение зашифровано, см. также Список номеров портов TCP и UDP ). [44] [45] В HTTP/2 используются соединение TCP/IP и несколько каналов протоколов. В HTTP/3 используется протокол транспорта приложений QUIC через UDP.

Запросы и ответы сообщений через соединения

Данные обмениваются через последовательность сообщений типа «запрос-ответ» , которые обмениваются транспортным соединением сеансового уровня . [20] HTTP-клиент сначала пытается подключиться к серверу, устанавливая соединение (реальное или виртуальное). HTTP(S)-сервер, прослушивающий этот порт, принимает соединение, а затем ждет сообщения запроса клиента. Клиент отправляет свое сообщение HTTP-запроса. Получив запрос, сервер отправляет обратно сообщение HTTP-ответа, которое включает заголовок(и) и тело, если это требуется. Тело этого сообщения-ответа обычно является запрошенным ресурсом, хотя также может быть возвращено сообщение об ошибке или другая информация. В любое время (по многим причинам) клиент или сервер могут закрыть соединение. Закрытие соединения обычно объявляется заранее с помощью одного или нескольких заголовков HTTP в последнем сообщении запроса/ответа, отправленном серверу или клиенту. [22]

Постоянные соединения

В HTTP/0.9 соединение TCP/IP всегда закрывается после отправки ответа сервера, поэтому оно никогда не является постоянным.

В HTTP/1.0 , как указано в RFC 1945, соединение TCP/IP всегда должно быть закрыто сервером после отправки ответа. [примечание 3]

В HTTP/1.1 был официально представлен механизм keep-alive, чтобы соединение можно было повторно использовать для более чем одного запроса/ответа. Такие постоянные соединения ощутимо сокращают задержку запроса , поскольку клиенту не нужно повторно согласовывать соединение TCP 3-Way-Handshake после отправки первого запроса. Другим положительным побочным эффектом является то, что в целом соединение со временем становится быстрее из-за механизма медленного старта TCP .

HTTP/1.1 также добавил HTTP-конвейеризацию для дальнейшего сокращения времени задержки при использовании постоянных соединений, позволяя клиентам отправлять несколько запросов перед ожиданием каждого ответа. Эта оптимизация никогда не считалась действительно безопасной, поскольку несколько веб-серверов и множество прокси-серверов , особенно прозрачных прокси-серверов, размещенных в Интернете / интрасетях между клиентами и серверами, не обрабатывали конвейерные запросы должным образом (они обслуживали только первый запрос, отбрасывая другие, они закрывали соединение, потому что видели больше данных после первого запроса, или некоторые прокси даже возвращали ответы не по порядку и т. д.). Из-за этого только HEAD- и некоторые запросы GET (т. е. ограниченные реальными запросами файлов и, следовательно, URL-адресами без строки запроса, используемой в качестве команды и т. д.) могли быть конвейеризированы в безопасном и идемпотентном режиме. После многих лет борьбы с проблемами, вызванными включением конвейеризации, эта функция была сначала отключена, а затем удалена из большинства браузеров также из-за объявленного принятия HTTP/2.

HTTP/2 расширил использование постоянных соединений за счет мультиплексирования множества одновременных запросов/ответов через одно соединение TCP/IP.

HTTP/3 не использует соединения TCP/IP, а использует QUIC + UDP (см. также: технический обзор).

Оптимизация поиска контента

HTTP/0.9
Запрошенный ресурс всегда отправлялся целиком.
HTTP/1.0
HTTP/1.0 добавил заголовки для управления ресурсами, кэшированными клиентом, чтобы разрешить условные запросы GET; на практике сервер должен возвращать все содержимое запрошенного ресурса только в том случае, если время его последнего изменения неизвестно клиенту или если оно изменилось с момента последнего полного ответа на запрос GET. Один из этих заголовков, «Content-Encoding», был добавлен для указания того, было ли возвращенное содержимое ресурса сжато или нет .
Если общая длина содержимого ресурса не была известна заранее (т. е. потому что оно было динамически сгенерировано и т. д.), то заголовок "Content-Length: number"отсутствовал в заголовках HTTP, и клиент предполагал, что когда сервер закрыл соединение, содержимое было отправлено целиком. Этот механизм не мог отличить успешно завершенную передачу ресурса от прерванной (из-за ошибки сервера/сети или чего-то еще).
HTTP/1.1
Представлен HTTP/1.1:
  • новые заголовки для лучшего управления условным извлечением кэшированных ресурсов.
  • Кодирование фрагментированной передачи , позволяющее передавать контент фрагментами для надежной отправки даже в тех случаях, когда сервер заранее не знает его длину (например, поскольку он динамически генерируется и т. д.).
  • byte range serve , где клиент может запросить только одну или несколько частей (диапазонов байтов) ресурса (т. е. первую часть, часть в середине или в конце всего контента и т. д.), а сервер обычно отправляет только запрошенную часть(и). Это полезно для возобновления прерванной загрузки (когда файл очень большой), когда только часть контента должна быть показана или динамически добавлена ​​к уже видимой части браузером (т. е. только первые или следующие n комментариев веб-страницы) для экономии времени, пропускной способности и системных ресурсов и т. д.
HTTP/2, HTTP/3
Как HTTP/2, так и HTTP/3 сохранили вышеупомянутые функции HTTP/1.1.

HTTP-аутентификация

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

HTTP обеспечивает общую структуру для контроля доступа и аутентификации с помощью расширяемого набора схем аутентификации «вызов-ответ», которые могут использоваться сервером для проверки клиентского запроса, а клиентом — для предоставления информации об аутентификации. [1]

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

Области аутентификации

Спецификация HTTP Authentication также предоставляет произвольную, специфичную для реализации конструкцию для дальнейшего разделения ресурсов, общих для данного корневого URI . Строка значения области, если она присутствует, объединяется с каноническим корневым URI для формирования компонента пространства защиты вызова. Это фактически позволяет серверу определять отдельные области аутентификации под одним корневым URI. [1]

сеанс HTTP-приложения

HTTP — это протокол без сохранения состояния . Протокол без сохранения состояния не требует от веб-сервера сохранять информацию или статус о каждом пользователе на протяжении нескольких запросов.

Некоторым веб-приложениям необходимо управлять сеансами пользователей, поэтому они реализуют состояния или сеансы на стороне сервера , используя, например, файлы cookie HTTP [46] или скрытые переменные в веб-формах .

Для запуска сеанса пользователя приложения необходимо выполнить интерактивную аутентификацию через вход в веб-приложение. Для остановки сеанса пользователя необходимо запросить операцию выхода из системы пользователем. Такие операции не используют HTTP-аутентификацию, а настраиваемую аутентификацию веб-приложения.

Сообщения запроса HTTP/1.1

Сообщения-запросы отправляются клиентом на целевой сервер. [примечание 4]

Синтаксис запроса

Клиент отправляет серверу сообщения-запросы , которые состоят из: [47]

ПОЛУЧИТЬ  /images/logo.png  HTTP / 1.1
Хост: www.example.comПринять-Язык: ru

В протоколе HTTP/1.1 все поля заголовка, за исключением , Host: hostnameявляются необязательными.

Строка запроса, содержащая только имя пути, принимается серверами для поддержания совместимости с HTTP-клиентами до спецификации HTTP/1.0 в RFC  1945. [48]

Методы запроса

Запрос HTTP/1.1, сделанный с помощью telnet. Сообщение запроса , раздел заголовка ответа и тело ответа выделены.

HTTP определяет методы (иногда называемые глаголами , но нигде в спецификации не упоминается глагол ), чтобы указать желаемое действие, которое должно быть выполнено над идентифицированным ресурсом. Что представляет собой этот ресурс, будь то уже существующие данные или данные, которые генерируются динамически, зависит от реализации сервера. Часто ресурс соответствует файлу или выводу исполняемого файла, находящегося на сервере. Спецификация HTTP/1.0 [49] определила методы GET, HEAD и POST, а также перечислила методы PUT, DELETE, LINK и UNLINK в дополнительных методах. Однако спецификация HTTP/1.1 [50] формально определила и добавила пять новых методов: PUT, DELETE, CONNECT, OPTIONS и TRACE. Любой клиент может использовать любой метод, а сервер можно настроить для поддержки любой комбинации методов. Если метод неизвестен промежуточному элементу, он будет рассматриваться как небезопасный и неидемпотентный метод. Нет ограничений на количество методов, которые можно определить, что позволяет определять будущие методы без нарушения существующей инфраструктуры. Например, WebDAV определил семь новых методов, а RFC  5789 указал метод PATCH .

Имена методов чувствительны к регистру. [51] [52] Это отличается от имен полей заголовка HTTP, которые нечувствительны к регистру. [53]

ПОЛУЧАТЬ
Метод GET запрашивает, чтобы целевой ресурс передал представление своего состояния. Запросы GET должны только извлекать данные и не должны иметь другого эффекта. (Это также справедливо для некоторых других методов HTTP.) [1] Для извлечения ресурсов без внесения изменений GET предпочтительнее POST, так как к ним можно обратиться через URL . Это позволяет создавать закладки и делиться ими, а также делает ответы GET доступными для кэширования , что может сэкономить полосу пропускания. W3C опубликовал руководящие принципы по этому различию, заявив: « Проектирование веб-приложений должно основываться на вышеуказанных принципах, а также на соответствующих ограничениях». [54] См. безопасные методы ниже.

ГОЛОВА
Метод HEAD запрашивает, чтобы целевой ресурс передал представление своего состояния, как для запроса GET, но без данных представления, заключенных в теле ответа. Это полезно для извлечения метаданных представления в заголовке ответа, без необходимости передавать все представление. Использование включает проверку доступности страницы через код состояния и быстрое определение размера файла ( Content-Length).

ПОЧТА
Метод POST запрашивает, чтобы целевой ресурс обрабатывал представление, заключенное в запросе, в соответствии с семантикой целевого ресурса. Например, он используется для публикации сообщения на интернет-форуме , подписки на список рассылки или завершения транзакции онлайн-покупок . [55]

ПОМЕЩАТЬ
Метод PUT запрашивает, чтобы целевой ресурс создал или обновил свое состояние с состоянием, определенным представлением, включенным в запрос. Отличие от POST заключается в том, что клиент указывает целевое местоположение на сервере. [56]

УДАЛИТЬ
Метод DELETE запрашивает у целевого ресурса удаление его состояния.

СОЕДИНЯТЬ
Метод CONNECT требует, чтобы посредник установил туннель TCP/IP к исходному серверу, указанному целью запроса. Он часто используется для защиты соединений через один или несколько HTTP-прокси с TLS . [57] [58] См. метод HTTP CONNECT .

ПАРАМЕТРЫ
Метод OPTIONS запрашивает, чтобы целевой ресурс передал HTTP-методы, которые он поддерживает. Это можно использовать для проверки функциональности веб-сервера, запросив '*' вместо конкретного ресурса.

СЛЕД
Метод TRACE запрашивает, чтобы целевой ресурс передал полученный запрос в теле ответа. Таким образом, клиент может увидеть, какие (если таковые имеются) изменения или дополнения были сделаны посредниками.

ПЛАСТЫРЬ
Метод PATCH запрашивает, чтобы целевой ресурс изменил свое состояние в соответствии с частичным обновлением, определенным в представлении, включенном в запрос. Это может сэкономить полосу пропускания, обновляя часть файла или документа без необходимости передавать его целиком. [59]

Все веб-серверы общего назначения должны реализовывать как минимум методы GET и HEAD, а все остальные методы считаются необязательными в соответствии со спецификацией. [52]

Безопасные методы

Метод запроса безопасен , если запрос с этим методом не имеет предполагаемого эффекта на сервере. Методы GET, HEAD, OPTIONS и TRACE определены как безопасные. Другими словами, безопасные методы предназначены только для чтения . Безопасные методы могут иметь побочные эффекты, невидимые клиенту, такие как добавление информации о запросе в файл журнала или списание средств с рекламного аккаунта .

Напротив, методы POST, PUT, DELETE, CONNECT и PATCH не являются безопасными. Они могут изменить состояние сервера или иметь другие эффекты, такие как отправка электронного письма . Поэтому такие методы обычно не используются соответствующими веб-роботами или веб-сканерами; некоторые из тех, которые не соответствуют, имеют тенденцию делать запросы без учета контекста или последствий.

Несмотря на предписанную безопасность запросов GET, на практике их обработка сервером технически не ограничена каким-либо образом. Небрежное или преднамеренно нерегулярное программирование может позволить запросам GET вызывать нетривиальные изменения на сервере. Это не рекомендуется из-за проблем, которые могут возникнуть, когда веб-кэширование , поисковые системы и другие автоматизированные агенты вносят непреднамеренные изменения на сервере. Например, веб-сайт может разрешить удаление ресурса через URL, такой как https://example.com/article/1234/delete , который, если его произвольно извлечь, даже с использованием GET, просто удалит статью. [60] Правильно закодированный веб-сайт потребует метода DELETE или POST для этого действия, чего не будут делать невредоносные боты.

Одним из примеров этого на практике был период недолгой бета-версии Google Web Accelerator , которая предварительно выбирала произвольные URL-адреса на просматриваемой пользователем странице, что приводило к автоматическому изменению или массовому удалению записей . Бета-версия была приостановлена ​​всего через несколько недель после ее первого выпуска из-за широкой критики. [61] [60]

Идемпотентные методы

Метод запроса является идемпотентным, если несколько идентичных запросов с этим методом имеют тот же эффект, что и один такой запрос. Методы PUT и DELETE, а также безопасные методы определяются как идемпотентные. Безопасные методы тривиально идемпотентны, поскольку они не должны оказывать никакого влияния на сервер; методы PUT и DELETE, тем временем, являются идемпотентными, поскольку последовательные идентичные запросы будут игнорироваться. Например, веб-сайт может настроить конечную точку PUT для изменения записанного адреса электронной почты пользователя. Если эта конечная точка настроена правильно, любые запросы, которые просят изменить адрес электронной почты пользователя на тот же адрес электронной почты, который уже записан, например, дублирующие запросы после успешного запроса, не будут иметь никакого эффекта. Аналогично, запрос на УДАЛИТЬ определенного пользователя не будет иметь никакого эффекта, если этот пользователь уже был удален.

Напротив, методы POST, CONNECT и PATCH не обязательно идемпотентны, и поэтому отправка идентичного запроса POST несколько раз может дополнительно изменить состояние сервера или иметь дополнительные эффекты, такие как отправка нескольких писем . В некоторых случаях это желаемый эффект, но в других случаях это может произойти случайно. Например, пользователь может непреднамеренно отправить несколько запросов POST, нажав кнопку еще раз, если ему не дали четкого ответа о том, что первый щелчок обрабатывается. Хотя веб-браузеры могут показывать диалоговые окна с предупреждениями , чтобы предупредить пользователей в некоторых случаях, когда перезагрузка страницы может повторно отправить запрос POST, обычно веб-приложение должно обрабатывать случаи, когда запрос POST не должен быть отправлен более одного раза.

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

Кэшируемые методы

Метод запроса является кэшируемым , если ответы на запросы с этим методом могут быть сохранены для будущего повторного использования. Методы GET, HEAD и POST определены как кэшируемые.

Напротив, методы PUT, DELETE, CONNECT, OPTIONS, TRACE и PATCH не кэшируются.

Запрос полей заголовка

Поля заголовка запроса позволяют клиенту передавать дополнительную информацию за пределы строки запроса, выступая в качестве модификаторов запроса (аналогично параметрам процедуры). Они предоставляют информацию о клиенте, о целевом ресурсе или об ожидаемой обработке запроса.

Ответные сообщения HTTP/1.1

Ответное сообщение отправляется сервером клиенту в ответ на его предыдущее сообщение-запрос. [примечание 4]

Синтаксис ответа

Сервер отправляет клиенту ответные сообщения , которые состоят из: [47]

Коды статуса ответа

В HTTP/1.0 и более поздних версиях первая строка ответа HTTP называется строкой статуса и включает числовой код статуса (например, « 404 ») и текстовую фразу причины (например, «Not Found»). Код статуса ответа — это трехзначный целочисленный код, представляющий результат попытки сервера понять и удовлетворить соответствующий запрос клиента. То, как клиент обрабатывает ответ, зависит в первую очередь от кода статуса и, во вторую очередь, от других полей заголовка ответа. Клиенты могут не понимать все зарегистрированные коды статуса, но они должны понимать свой класс (заданный первой цифрой кода статуса) и рассматривать нераспознанный код статуса как эквивалент кода статуса x00 этого класса.

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

Первая цифра кода статуса определяет его класс:

1XX(информационный)
Запрос получен, процесс продолжается.
2XX(успешный)
Запрос был успешно получен, понят и принят.
3XX(перенаправление)
Для выполнения запроса необходимо предпринять дополнительные действия.
4XX(ошибка клиента)
Запрос содержит неверный синтаксис или не может быть выполнен.
5XX(ошибка сервера)
Сервер не смог выполнить, по всей видимости, допустимый запрос.

Поля заголовка ответа

Поля заголовка ответа позволяют серверу передавать дополнительную информацию за пределы строки статуса, выступая в качестве модификаторов ответа. Они предоставляют информацию о сервере или о дальнейшем доступе к целевому ресурсу или связанным ресурсам.

Каждое поле заголовка ответа имеет определенное значение, которое может быть дополнительно уточнено семантикой метода запроса или кодом статуса ответа.

Пример HTTP/1.1 транзакции запроса/ответа

Ниже приведен пример HTTP-транзакции между клиентом HTTP/1.1 и сервером HTTP/1.1, работающим на www.example.com , порт 80. [примечание 5] [примечание 6]

Запрос клиента

GET  /  HTTP / 1.1 Хост :  www.example.com User-Agent :  Mozilla/5.0 Accept :  text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language :  en-GB,en;q=0.5 Accept-Encoding :  gzip, deflate, br Connection :  keep-alive

За клиентским запросом (состоящим в данном случае из строки запроса и нескольких заголовков, которые можно сократить до одного "Host: hostname"заголовка) следует пустая строка, так что запрос заканчивается двойным концом строки, каждый в форме возврата каретки , за которым следует перевод строки . "Host: hostname"Значение заголовка различает различные имена DNS , разделяющие один IP-адрес , что позволяет организовать виртуальный хостинг на основе имени . Хотя в HTTP/1.0 это необязательно, в HTTP/1.1 это обязательно. (А "/" (косая черта) обычно извлекает файл /index.html , если он есть.)

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

HTTP / 1.1  200  OK Дата :  Пн, 23 мая 2005 г. 22:38:34 GMT Тип содержимого :  text/html; кодировка=UTF-8 Длина содержимого :  155 Последнее изменение :  Ср, 08 января 2003 г. 23:11:55 GMT Сервер :  Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag :  "3f80f-1b6-3e1cb03b" Диапазоны приема :  байты Подключение :  закрыть< html >  < head >  < title > Пример страницы </ title >  </ head >  < body >  < p > Привет, мир! Это очень простой HTML-документ. </ p >  </ body > </ html >

Поле заголовка ETag (тег сущности) используется для определения того, идентична ли кэшированная версия запрошенного ресурса текущей версии ресурса на сервере. указывает"Content-Type" тип интернет-носителя данных, передаваемых сообщением HTTP, а также "Content-Length"указывает его длину в байтах. Веб-сервер HTTP/1.1 публикует свою способность отвечать на запросы для определенных диапазонов байтов документа, устанавливая поле "Accept-Ranges: bytes". Это полезно, если клиенту необходимо иметь только определенные части [62] ресурса, отправленного сервером, что называется обслуживанием байтов . Когда "Connection: close"отправляется , это означает, что веб-сервер закроет TCP- соединение сразу после окончания передачи этого ответа. [22]

Большинство строк заголовка необязательны, но некоторые обязательны. Если заголовок "Content-Length: number"отсутствует в ответе с телом сущности, то это следует считать ошибкой в ​​HTTP/1.0, но это может не быть ошибкой в ​​HTTP/1.1, если заголовок "Transfer-Encoding: chunked"присутствует. Кодирование передачи фрагментами использует размер фрагмента 0 для обозначения конца содержимого. Некоторые старые реализации HTTP/1.0 пропускали заголовок, "Content-Length"когда длина тела сущности не была известна в начале ответа, и поэтому передача данных клиенту продолжалась до тех пор, пока сервер не закрыл сокет.

A можно использовать для информирования клиента о том, что часть тела передаваемых данных сжата алгоритмом gzip."Content-Encoding: gzip"

Зашифрованные соединения

Самый популярный способ установления зашифрованного HTTP-соединения — HTTPS . [63] Существуют также два других метода установления зашифрованного HTTP-соединения: Secure Hypertext Transfer Protocol и использование заголовка HTTP/1.1 Upgrade для указания обновления до TLS. Однако поддержка браузерами этих двух методов практически отсутствует. [64] [65] [66]

Похожие протоколы

Смотрите также

Примечания

  1. ^ На практике эти потоки используются как несколько дополнительных подключений TCP/IP для мультиплексирования одновременных запросов/ответов, что значительно сокращает количество реальных подключений TCP/IP на стороне сервера с 2..8 на клиента до 1 и позволяет обслуживать гораздо больше клиентов одновременно.
  2. ^ В 2022 году поддержка HTTP/0.9 официально не была полностью прекращена и по-прежнему присутствует во многих веб-серверах и браузерах (только для ответов сервера), даже если обычно отключена. Неясно, сколько времени займет вывод HTTP/0.9 из эксплуатации.
  3. ^ С конца 1996 года некоторые разработчики популярных браузеров и серверов HTTP/1.0 (особенно те, кто планировал поддержку HTTP/1.1) начали развертывать (в качестве неофициального расширения) своего рода механизм поддержания активности (используя новые заголовки HTTP), чтобы поддерживать соединение TCP/IP открытым более чем для пары запрос/ответ и таким образом ускорять обмен несколькими запросами/ответами. [32]
  4. ^ ab HTTP/2 и HTTP/3 имеют разное представление для методов и заголовков HTTP.
  5. ^ HTTP/1.0 имеет те же сообщения, за исключением нескольких отсутствующих заголовков.
  6. ^ HTTP/2 и HTTP/3 используют один и тот же механизм запроса/ответа, но с разным представлением заголовков HTTP.

Ссылки

  1. ^ abcd Филдинг, Р.; Ноттингем, М.; Решке, Дж. (июнь 2022 г.). Семантика HTTP. IETF. doi : 10.17487/RFC9110 . RFC 9110.
  2. ^ abcd Тим Бернер-Ли (1991-01-01). "Оригинальный HTTP, определенный в 1991 году". www.w3.org . Консорциум Всемирной паутины . Получено 24.07.2010 .
  3. ^ ab Тим Бернер-Ли (1992). "Базовый HTTP, определенный в 1992 году". www.w3.org . Консорциум Всемирной паутины . Получено 19 октября 2021 г. .
  4. ^ В RFC  1945. Эта спецификация была затем отменена HTTP/1.1.
  5. ^ RFC  2068 (1997) был заменен RFC  2616 в 1999 году, который был заменен RFC  7230 в 2014 году, который был заменен RFC  9110 в 2022 году.
  6. ^ "Статистика использования протокола по умолчанию https для веб-сайтов". w3techs.com . Получено 2024-01-05 .
  7. ^ "Статистика использования HTTP/2 для веб-сайтов". w3techs.com . Получено 2024-01-05 .
  8. ^ "Статистика использования HTTP/3 для веб-сайтов, август 2024 г.". w3techs.com . Получено 2024-08-13 .
  9. ^ "Могу ли я использовать... Таблицы поддержки для HTML5, CSS3 и т. д.". caniuse.com . Получено 2024-01-05 .
  10. ^ Фридл, С.; Попов, А.; Лэнгли, А.; Стефан, Э. (июль 2014 г.). Расширение согласования протокола прикладного уровня Transport Layer Security (TLS). IETF. doi : 10.17487/RFC7301 . RFC 7301.
  11. ^ Белше, М.; Пеон, Р.; Томсон, М. "Протокол передачи гипертекста версии 2, использование функций TLS". Архивировано из оригинала 2013-07-15 . Получено 2015-02-10 .
  12. ^ Бенджамин, Дэвид. Использование TLS 1.3 с HTTP/2. doi : 10.17487/RFC8740 . RFC 8740 . Получено 2020-06-02 . Это снижает барьер для развертывания TLS 1.3, что является значительным улучшением безопасности по сравнению с TLS 1.2.
  13. ^ HTTP/3. 6 июня 2022 г. doi : 10.17487/RFC9114 . RFC 9114. Получено 06.06.2022 .
  14. ^ "Статистика использования HTTP/3 для веб-сайтов". w3techs.com . Получено 2024-01-08 .
  15. ^ "Могу ли я использовать... Таблицы поддержки для HTML5, CSS3 и т. д.". canIuse.com . Получено 2024-01-08 .
  16. ^ Cimpanu, Catalin (26 сентября 2019 г.). «Cloudflare, Google Chrome и Firefox добавляют поддержку HTTP/3». ZDNet . Получено 27 сентября 2019 г. .
  17. ^ "HTTP/3: прошлое, настоящее и будущее". Блог Cloudflare . 2019-09-26 . Получено 2019-10-30 .
  18. ^ "Firefox Nightly поддерживает HTTP 3 – Общие – Сообщество Cloudflare". 2019-11-19 . Получено 2020-01-23 .
  19. ^ "HTTP/3 is Fast". Запросить метрики . Получено 2022-07-01 .
  20. ^ abc "Подключения, клиенты и серверы". RFC 9110, Семантика HTTP. раздел 3.3. doi : 10.17487/RFC9110 . RFC 9110.
  21. ^ "Общая операция". RFC 1945. стр. 6–8. раздел 1.3. doi : 10.17487/RFC1945 . RFC 1945.
  22. ^ abc "Управление соединением: Установление". RFC 9112, HTTP/1.1. раздел 9.1. doi : 10.17487/RFC9112 . RFC 9112.
  23. ^ "Управление соединением: сохранение". RFC 9112, HTTP/1.1. раздел 9.3. doi : 10.17487/RFC9112 . RFC 9112.
  24. ^ "Классические HTTP-документы". W3.org. 1998-05-14 . Получено 2010-08-01 .
  25. ^ "Обзор протокола HTTP/2". RFC 9113, HTTP/2). раздел 2. doi : 10.17487/RFC7540 . RFC 7540.
  26. ^ "Изобретение Интернета, История Интернета, Кто изобрел Интернет, Тим Бернерс-Ли, Роберт Кайо, ЦЕРН, Первый веб-сервер". LivingInternet . Получено 11 августа 2021 г.
  27. ^ Бернерс-Ли, Тим (1990-10-02). "daemon.c - сервер на базе TCP/IP для HyperText". www.w3.org . Получено 2021-08-11 .
  28. ^ Бернерс-Ли, Тим. "Протокол передачи гипертекста". Консорциум Всемирной паутины . Получено 31 августа 2010 г.
  29. ^ Раггетт, Дэйв. "Биография Дэйва Раггетта". World Wide Web Consortium . Получено 11 июня 2010 г.
  30. ^ Раггетт, Дэйв; Бернерс-Ли, Тим. "Hypertext Transfer Protocol Working Group". World Wide Web Consortium . Получено 29 сентября 2010 г.
  31. ^ Раггетт, Дэйв. «Планы рабочей группы HTTP». Консорциум Всемирной паутины . Получено 29 сентября 2010 г.
  32. ^ ab Дэвид Гурли; Брайан Тотти; Марджори Сэйер; Аншу Аггарвал; Сайлу Редди (2002). HTTP: Полное руководство. (отрывок из главы: «Постоянные соединения»). O'Reilly Media, inc. ISBN 9781565925090. Получено 18 октября 2021 г. .
  33. ^ "HTTP 1.1 Compliant Browsers". webcom.com . Архивировано из оригинала 1998-02-04 . Получено 2009-05-29 .
  34. ^ "Рабочая группа HTTP-NG". www.w3.org . Консорциум Всемирной паутины. 1997 . Получено 19 октября 2021 г. .
  35. ^ Веб-администратор (2007). "Рабочая группа HTTP". httpwg.org . IETF . Получено 19 октября 2021 г. .
  36. ^ ab Web Administrator (2007). "Рабочая группа HTTP: устав httpbis". datatracker.ietf.org . IETF . Получено 19 октября 2021 г. .
  37. ^ "SPDY: Экспериментальный протокол для более быстрого Интернета". dev.chromium.org . Google. 2009-11-01 . Получено 2021-10-19 .
  38. ^ "Rechartering httpbis". IETF; HTTP WG. 2012-01-24 . Получено 2021-10-19 .
  39. ^ Секретарь IESG (2012-03-19). "Действие WG: RECHARTER: Hypertext Transfer Protocol Bis (httpbis)". IETF; HTTP WG . Получено 2021-10-19 .
  40. ^ Илья Григорик; Сурма (2019-09-03). "Высокопроизводительные сетевые браузеры: Введение в HTTP/2". developers.google.com . Google Inc . Получено 2021-10-19 .
  41. ^ "Приложение-A: История версий HTTP". RFC 7230, HTTP/1.1: Синтаксис и маршрутизация сообщений. стр. 78. раздел A. doi : 10.17487/RFC7230 . RFC 7230.
  42. ^ Мэтт Менке (2016-06-30). «Намерение прекратить поддержку и удалить: поддержка HTTP/0.9». groups.google.com . Получено 2021-10-15 .
  43. ^ HTTP/3. 6 июня 2022 г. doi : 10.17487/RFC9114 . RFC 9114. Получено 06.06.2022 .
  44. ^ "http URI Scheme". RFC 9110, HTTP Semantics. раздел 4.2.1. doi : 10.17487/RFC9110 . RFC 9110.
  45. ^ "https URI Scheme". RFC 9110, HTTP Semantics. раздел 4.2.2. doi : 10.17487/RFC9110 . RFC 9110.
  46. ^ Ли, Вэй-Бин; Чэнь, Син-Бай; Чанг, Шун-Шян; Чэнь, Цунг-Хер (2019-01-25). «Безопасная и эффективная защита HTTP-cookie с самопроверкой». Международный журнал коммуникационных систем . 32 (2): e3857. doi :10.1002/dac.3857. S2CID  59524143.
  47. ^ ab "Формат сообщения". RFC 9112: HTTP/1.1. раздел 2.1. doi : 10.17487/RFC9112 . RFC 9112.
  48. ^ "Apache Week. HTTP/1.1". Архивировано из оригинала 2021-06-02 . Получено 2021-05-03 .090502 apacheweek.com
  49. ^ Бернерс-Ли, Тим; Филдинг, Рой Т.; Нильсен, Хенрик Фристик. «Определения методов». Протокол передачи гипертекста – HTTP/1.0. IETF. стр. 30–32. раздел 8. doi : 10.17487/RFC1945 . RFC 1945.
  50. ^ «Определения методов». RFC 2616. стр. 51–57. раздел 9. doi : 10.17487/RFC2616 . RFC 2616.
  51. ^ "Строка запроса". RFC 9112, HTTP/1.1. раздел 3. doi : 10.17487/RFC9112 . RFC 9112.
  52. ^ ab "Методы: Обзор". RFC 9110, Семантика HTTP. раздел 9.1. doi : 10.17487/RFC9110 . RFC 9110.
  53. ^ "Поля заголовка". RFC 9110, Семантика HTTP. раздел 6.3. doi : 10.17487/RFC9110 . RFC 9110.
  54. ^ Якобс, Ян (2004). «URI, адресуемость и использование HTTP GET и POST». Выводы Технической Архитектурной Группы . W3C . Получено 26 сентября 2010 г.
  55. ^ "POST". RFC 9110, Семантика HTTP. раздел 9.3.3. doi : 10.17487/RFC9110 . RFC 9110.
  56. ^ "PUT". RFC 9110, Семантика HTTP. раздел 9.3.4. doi : 10.17487/RFC9110 . RFC 9110.
  57. ^ "CONNECT". RFC 9110, Семантика HTTP. раздел 9.3.6. doi : 10.17487/RFC9110 . RFC 9110.
  58. ^ "Заметка об уязвимости VU#150227: конфигурации HTTP-прокси по умолчанию допускают произвольные TCP-соединения". US-CERT . 2002-05-17 . Получено 2007-05-10 .
  59. ^ Дюссо, Лиза; Снелл, Джеймс М. (март 2010 г.). Метод PATCH для HTTP. IETF. doi : 10.17487/RFC5789 . RFC 5789.
  60. ^ ab Эдигер, Брэд (2007-12-21). Advanced Rails: Создание промышленных веб-приложений в рекордные сроки. O'Reilly Media, Inc. стр. 188. ISBN 978-0596519728. Распространенной ошибкой является использование GET для действия, обновляющего ресурс. [...] Эта проблема привлекла внимание общественности Rails в 2005 году, когда был выпущен Google Web Accelerator.
  61. ^ Кантрелл, Кристиан (2005-06-01). «Чему мы научились у Google Web Accelerator?». Adobe Blogs . Adobe. Архивировано из оригинала 2017-08-19 . Получено 2018-11-19 .
  62. ^ Луотонен, Ари; Фрэнкс, Джон (22 февраля 1996 г.). Расширение поиска диапазона байтов для HTTP. IETF. ID draft-ietf-http-range-retrieval-00.
  63. ^ Канаван, Джон (2001). Основы сетевой безопасности . Норвуд, Массачусетс: Artech House. стр. 82–83. ISBN 9781580531764.
  64. ^ Залевски, Михал. "Справочник по безопасности браузера" . Получено 30 апреля 2015 г.
  65. ^ "Chromium Issue 4527: реализация RFC 2817: обновление до TLS в HTTP/1.1" . Получено 30 апреля 2015 г.
  66. ^ "Mozilla Bug 276813 – [RFE] Поддержка RFC 2817 / Обновление TLS для HTTP 1.1" . Получено 30 апреля 2015 г.
  67. ^ Ноттингем, Марк (октябрь 2010 г.). Ссылки на веб-сайты. IETF. doi : 10.17487/RFC5988 . RFC 5988.

Внешние ссылки