Что такое протокол http/2 и чем он полезен для сайтов?

Цель создания HTTP/2

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


Эти тенденции требуют значительных изменений HTTP/2 для улучшения работы в Интернете.

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

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

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

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

Например, возможность Server Push с HTTP/2 позволяет серверам отвечать полным содержимым страницы, кроме информации, уже доступной в кэше браузера.

Эффективное сжатие заголовочных файлов HTTP минимизирует издержки протокола для повышения производительности при каждом запросе браузера и ответе сервера.

Изменения HTTP/2 предназначены для обеспечения взаимодействия и совместимости с HTTP1.1. Ожидается, что преимущества HTTP/2 со временем возрастут на основе реальных экспериментов, и его способность решать проблемы, связанные с производительностью, в реальном сравнении с HTTP1.1 значительно повлияет на его развитие в долгосрочной перспективе.

Важно отметить, что новая версия HTTP является расширением своего предшественника и в ближайшее время не заменит HTTP1.1. Реализация HTTP/2 не обеспечит автоматическую поддержку для всех типов шифрования, доступных с HTTP1.1, но определенно откроет путь к лучшим альтернативам или дополнительным обновлениям совместимости шифрования в ближайшем будущем. Однако при сравнении функций, таких как HTTP/2 против HTTP1 и SPDY против HTTP/2, только новейший протокол приложения является победителем с точки зрения производительности, безопасности и надежности

Однако при сравнении функций, таких как HTTP/2 против HTTP1 и SPDY против HTTP/2, только новейший протокол приложения является победителем с точки зрения производительности, безопасности и надежности.

HTTP/2 шифрование безопасности

Redirected Input

The universal method for passing request data is through redirected (standard input)—piping. Such data is buffered and then with no further processing used as the request body. There are multiple useful ways to use piping:

Redirect from a file:

$ http PUT httpbin.org/put X-API-Token:123 < files/data.json

Or the output of another program:

$ grep '401 Unauthorized' /var/log/httpd/error_log | http POST httpbin.org/post

You can use for simple data:

$ echo '{"name": "John"}' | http PATCH httpbin.org/patch X-API-Token:123

You can also use a Bash here string:

$ http httpbin.org/post <<<'{"name": "John"}'

You can even pipe web services together using HTTPie:

$ http GET https://api.github.com/repos/jakubroztocil/httpie | http POST httpbin.org/post

You can use to enter multiline data on the terminal:

$ cat | http POST httpbin.org/post
<paste>
^D
$ cat | http POST httpbin.org/post Content-Type:text/plain
- buy milk
- call parents
^D

On OS X, you can send the contents of the clipboard with :

$ pbpaste | http PUT httpbin.org/put

Passing data through cannot be combined with data fields specified on the command line:

$ echo 'data' | http POST example.org more=data   # This is invalid

To prevent HTTPie from reading data you can use the option.

Implementation Questions

Why the rules around Continuation on HEADERS frames?

Continuation exists since a single value (e.g. Set-Cookie) could exceed 16KiB — 1, which means it couldn’t fit into a single frame. It was decided that the least error-prone way to deal with this was to require that all of the headers data come in back-to-back frames, which made decoding and buffer management easier.

What is the minimum or maximum HPACK state size?

The receiver always controls the amount of memory used in HPACK, and can set it to zero at a minimum, with a maximum related to the maximum representable integer in a SETTINGS frame, currently 2^32 — 1.

How can I avoid keeping HPACK state?

Send a SETTINGS frame setting state size (SETTINGS_HEADER_TABLE_SIZE) to zero, then RST all streams until a SETTINGS frame with the ACK bit set has been received.

Why is there a single compression/flow-control context?

Simplicity.

The original proposals had stream groups, which would share context, flow control, etc. While that would benefit proxies (and the experience of users going through them), doing so added a fair bit of complexity. It was decided that we’d go with the simple thing to begin with, see how painful it was, and address the pain (if any) in a future protocol revision.

Why is there an EOS symbol in HPACK?

HPACK’s huffman encoding, for reasons of CPU efficiency and security, pads out huffman-encoded strings to the next byte boundary; there may be between 0-7 bits of padding needed for any particular string.

If one considers huffman decoding in isolation, any symbol that is longer than the required padding would work; however, HPACK’s design allows for bytewise comparison of huffman-encoded strings. By requiring that the bits of the EOS symbol are used for padding, we ensure that users can do bytewise comparison of huffman-encoded strings to determine equality. This in turn means that many headers can be interpreted without being huffman decoded.

Can I implement HTTP/2 without implementing HTTP/1.1?

Yes, mostly.

For HTTP/2 over TLS (), if you do not implement the ALPN identifier, then you will not need to support any HTTP/1.1 features.

For HTTP/2 over TCP (), you need to implement the initial upgrade request.

-only clients will need to generate an OPTIONS request for “*” or a HEAD request for “/”, which are fairly safe and easy to construct. Clients looking to implement HTTP/2 only will need to treat HTTP/1.1 responses without a 101 status code as errors.

-only servers can accept a request containing the Upgrade header field with a fixed 101 response. Requests without the upgrade token can be rejected with a 505 (HTTP Version Not Supported) status code that contains the Upgrade header field. Servers that don’t wish to process the HTTP/1.1 response should reject stream 1 with a REFUSED_STREAM error code immediately after sending the connection preface to encourage the client to retry the request over the upgraded HTTP/2 connection.

Is the priority example in Section 5.3.2 incorrect?

No. Stream B has weight 4, stream C has weight 12. To determine the proportion of the available resources that each of these streams receive, sum all the weights (16) and divide each stream weight by the total weight. Stream B therefore receives one-quarter of the available resources and stream C receives three-quarters. Consequently, as the specification states: .

Will I need TCP_NODELAY for my HTTP/2 connections?

Yes, probably. Even for a client-side implementation that only downloads a lot of data using a single stream, some packets will still be necessary to send back in the opposite direction to achieve maximum transfer speeds. Without TCP_NODELAY set (still allowing the Nagle algorithm), the outgoing packets may be held for a while in order to allow them to merge with a subsequent one.

In cases where such a packet, for example, is a packet telling the peer that there is more window available to send data, delaying its sending for multiple milliseconds (or more) can have a severe impact on high speed connections.

Разработка

Разработкой новой версии протокола занималась рабочая группа HTTPbis из Internet Engineering Task Force (Инженерного совета интернета, который разрабатывает стандарты интернета). Она была сформирована в 2007 году специально для работой над этим проектом. Однако активные действия начали происходить лишь через пять лет, в 2012 году.

Основой для HTTP/2 стал протокол SPDY (можно расшифровать как “speedy” – быстрый). Разработчик этого прокола – компания Google – создавала его для того, чтобы снизить время загрузки веб-страниц. В частности, протокол SPDY позволяет расставлять приоритеты и использовать мультиплексирование передачи нескольких файлов так, чтобы для каждого клиента нужно лишь одно соединение.

Один из участников рабочей группы Даниэль Штенберг весной 2014 года опубликовал документ, в котором рассказано о том, зачем вообще начали работу над этим проектом, и как она происходит. Документ доступен и на русском языке: https://bagder.gitbooks.io/http2-explained/ru/

Вот кратко перечисленные в описании концепции пункты:

  • должны поддерживаться парадигмы HTTP;
  • должны остаться ссылки http:// и https://, не нужно добавлять новую схему;
  • серверы и клиенты, использующие HTTP/1, должны быть проксированы к HTTP/2-серверам;
  • возможности HTTP/2 должны быть конвертированы в HTTP/1.1 при помощи прокси;
  • сокращение числа опциональных частей в протоколе;
  • отсутствие минорных версий в HTTP/2; при необходимости будет разработан протокол HTTP/3.

Шаг 3. Создание сертификата


Поддержка HTTP/2 со стороны браузера осуществляется только по протоколу https, поэтому для работы ресурса необходим сертификат.

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

Создаем каталог, в котором будем хранить cert-файлы:

mkdir /etc/nginx/ssl

Создаем сертификаты:

openssl req -new -x509 -days 1461 -nodes -out /etc/nginx/ssl/cert.pem -keyout /etc/nginx/ssl/cert.key —subj «/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=test.dmosk.local/CN=test»

* данная команда создаст сертификат на 4 года для URL test.dmosk.local или test

Принцип работы

HTTPS не является отдельным протоколом. Это обычный HTTP, работающий через шифрованные транспортные механизмы SSL и TLS. Он обеспечивает защиту от атак, основанных на прослушивании сетевого соединения — от снифферских атак и атак типа man-in-the-middle, при условии, что будут использоваться шифрующие средства и сертификат сервера проверен и ему доверяют.

По умолчанию HTTPS URL использует 443 TCP-порт (для незащищённого HTTP — 80). Чтобы подготовить веб-сервер для обработки https-соединений, администратор должен получить и установить в систему сертификат открытого и закрытого ключа для этого веб-сервера. В TLS используется как асимметричная схема шифрования (для выработки общего секретного ключа), так и симметричная (для обмена данными, зашифрованными общим ключом). Сертификат открытого ключа подтверждает принадлежность данного открытого ключа владельцу сайта. Сертификат открытого ключа и сам открытый ключ посылаются клиенту при установлении соединения; закрытый ключ используется для расшифровки сообщений от клиента.

Существует возможность создать такой сертификат, не обращаясь в ЦС. Подписываются такие сертификаты этим же сертификатом и называются самоподписанными (self-signed). Без проверки сертификата каким-то другим способом (например, звонок владельцу и проверка контрольной суммы сертификата) такое использование HTTPS подвержено атаке man-in-the-middle.

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

В HTTPS для шифрования используется длина ключа 40, 56, 128 или 256 бит. Некоторые старые версии браузеров используют длину ключа 40 бит (пример тому — IE версий до 4.0), что связано с экспортными ограничениями в США. Длина ключа 40 бит не является сколько-нибудь надёжной. Многие современные сайты требуют использования новых версий браузеров, поддерживающих шифрование с длиной ключа 128 бит, с целью обеспечить достаточный уровень безопасности. Такое шифрование значительно затрудняет злоумышленнику поиск паролей и другой личной информации.

Традиционно на одном IP-адресе может работать только один HTTPS-сайт. Для работы нескольких HTTPS-сайтов с различными сертификатами применяется расширение TLS под названием Server Name Indication (SNI).

На 17 июля 2017 года, 22,67 % сайтов из списка «Alexa top 1,000,000» используют протокол HTTPS по умолчанию. HTTPS используется на 4,04 % от общего числа зарегистрированных российских доменов.

Дом 2 свежие серии смотреть бесплатно

Дом 2 свежие серии (новые, последние, за сегодня) это популярный поисковый запрос поклонников телепроекта. Люди которые регулярно смотрят Дом 2, ежедневно задают этот вопрос поисковикам Google и Yandex десятки тысяч раз.

Зрители начинают смотреть реалити-шоу по телеканалу ТНТ. Когда просмотр Дома-2 становится ежедневной привычкой, поклонники начинают искать сайт, где можно смотреть Дом 2 онлайн.

Смотреть Дом 2 в интернете однозначно удобней чем по телевизору. Нет привязки по времени, не боитесь пропустить свежие выпуски, минимум рекламы, доступна пауза и перемотка. Ну и конечно просмотр доступен на компьютере, ноутбуке, планшете или телефоне. С таким разнообразием смотреть Дом 2 онлайн можно не только дома, а там, где на это есть время, например в машине по пути на работу или в пробке, в общественном транспорте или в кровати перед сном. Перечислять можно бесконечно, для просмотра нужно устройство с выходом в интернет.

Если пропустили 1-2 дня или даже неделю это тоже не беда. Доступен архив за последние 3 месяца в разделе Серии, вы найдете не только сегодняшние и вчерашние выпуски. Календарь, где на каждой странице, размещены серии которые в этот день транслировались по ТНТ. Нужно только найти свободное время и наслаждаться просмотром.

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

Дает ли что-то HTTP/2 веб-разработчикам?

Да! HTTP/2 позволяет избавиться от целого вагона старых трюков, призванных ускорить загрузку страниц без HTTP/2. Перечислим их:

домен-шардинг или использование множественных родственных доменов для скачивания файлов, чтобы позволить установить большее число TCP-соединений;

спрайты из картинок — объединение картинок в один файл для снижения числа запросов. Однако такой файл должен сначала загрузиться целиком, прежде, чем будет показана хоть одна картинка. К тому же, обработка больших файлов съедает больше памяти;

объединение файлов CSS и Javascript, что также делается для снижения количества запросов, и также увеличивает занимаемую память;

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

домены без cookie: загрузка картинок, CSS и Javascript с другого домена, где не используются cookie.

Уязвимости HTTPS

Совместное использование HTTP и HTTPS

Когда сайты используют смешанную функциональность HTTP и HTTPS, это потенциально приводит к информационной угрозе для пользователя. Например, если основные страницы некоторого сайта загружаются, используя HTTPS, а CSS и JavaScript загружаются по HTTP, то злоумышленник в момент загрузки последних может подгрузить свой код и получить данные HTML-страницы. Многие сайты, несмотря на такие уязвимости, загружают контент через сторонние сервисы, которые не поддерживают HTTPS. Механизм HSTS позволяет предотвратить подобные уязвимости, заставляя принудительно использовать HTTPS соединение даже там, где по умолчанию используется HTTP.

Атаки с использованием анализа трафика

В HTTPS были обнаружены уязвимости, связанные с анализом трафика. Атака с анализом трафика — это тип атаки, при которой выводятся свойства защищённых данных канала путём измерения размера трафика и времени передачи сообщений в нём. Анализ трафика возможен, поскольку шифрование SSL/TLS изменяет содержимое трафика, но оказывает минимальное влияние на размер и время прохождения трафика. В мае 2010 года исследователи из Microsoft Research и Университета Индианы обнаружили, что подробные конфиденциальные пользовательские данные могут быть получены из второстепенных данных, таких например, как размеры пакетов. Анализатор трафика смог заполучить историю болезней, данные об использовавшихся медикаментах и проведённых операциях пользователя, данные о семейном доходе и пр. Всё это было произведено несмотря на использование HTTPS в нескольких современных веб-приложениях в сфере здравоохранения, налогообложения и других.

Человек посередине. HTTPS

Рис.1 Стандартная конфигурация сети. Пользователь на хосте клиента (CH) хочет осуществить безопасную транзакцию, но уязвим для атаки «человек в середине».

Основная статья: Человек посередине

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

На рис. 1 представлена ситуация, когда злоумышленник является шлюзом между клиентом, осуществляющим безопасную транзакцию, и сервером. Таким образом через злоумышленника проходит весь трафик клиента и он может перенаправить его по своему усмотрению. Здесь делаются следующие шаги:

  1. Злоумышленник встраивается между клиентом и сервером
  2. Пересылает все сообщения от клиента серверу без изменений
  3. Перехват сообщений от сервера, посланных по шлюзу по умолчанию
  4. Создание самозаверенного сертификата и подмена им сертификата сервера
  5. Отправление ложного сертификата клиенту
  6. Когда клиент подтвердит сертификат, будут установлены защищённые соединения: между злоумышленником и сервером и другое — между злоумышленником и клиентом.

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

Особенности онлайн-сервиса 2ip.ru

Главное достоинство сервиса заключается в точности полученной пользователем информации. Но плюсы сайта не ограниваются только тонной проверкой, поэтому посетители положительно оценят:

  • скорость тестирования на 2ip, позволяющую получить нужные сведения спустя несколько секунд после запуска проверки;
  • доступность портала, позволяющую проводить бесплатное тестирование каждому желающему;
  • большое количество дополнительных данных о тестируемой сети (например, данные о регионе и провайдере), для получения которых иногда не требуется даже запускать сервис;
  • простоту проведения проверки, позволяющую ограничиться несколькими кликами.

Недостатки

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

Если посетитель нуждается в глубокой проверке и использовании всех предусмотренных разработчиками портала функций и инструментов, потребуется регистрация. Собственно, необходимость создавать аккаунт – второй недостаток системы.

Как подключить HTTP/2

Эпоха HTTP/2 не за горами, многие браузеры уже поддерживают этот протокол. Его внедрение не требует никаких изменений в самом сайте: не нужно менять URL страниц, не нужно менять ссылки, ставить редиректы, добавлять или менять какую-то разметку или указывать дополнительные данные для Google Search Console или «Яндекс.Вебмастер».

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

Если вы используете собственный виртуальный или выделенный сервер, то поддержка HTTP/2 добавляется на уровне модуля к nginx (дополнительно потребуется установить SSL-сертификат и ключ на сервер): здесь неплохая инструкция.

Проверить поддержку HTTP/2 можно либо через браузерные расширения для Firefox или Chrome, либо через проверку скорости на сайте Айри.рф: в случае поддержки HTTP/2 в результатах проверки будет зеленая плашка [HTTP/2.0].

Переделка 3. Блокировки

  • для некоторых фреймов в стандарте HTTP 2 существует ограничение по порядку. Но другие фреймы по спецификации можно отправить раньше. Тот же WindowUpdate я могу отослать раньше других. И это хотелось бы сделать, потому что сервер-то стоит — он же ждет (у него flow-control window = 0). Однако реализация не позволяет это сделать;
  • вторая проблема заключается в том, что когда у нас очередь пуста, отсылающий поток засыпает и долго просыпается.
  • ByteBuffer[] — атомарная последовательность буферов;
  • WindowUpdateFrame — мы можем положить в начало очереди и вынести его вообще из-под блокировки (у него нет ни кодирования протоколов, ни нумерации);
  • DataFrame — тоже можно вынести из-под блокировки и положить в конец очереди. В итоге блокировка становится все меньше и меньше.
  • меньше блокировок;
  • ранняя отправка Window Update позволяет серверу раньше отсылать данные.

Блокировки — зло!

Output options

By default, HTTPie only outputs the final response and the whole response message is printed (headers as well as the body). You can control what should be printed via several options:

Only the response headers are printed.
Only the response body is printed.
Print the whole HTTP exchange (request and response). This option also enables (see below).
Selects parts of the HTTP exchange.

can often be useful for debugging the request and generating documentation examples:

$ http --verbose PUT httpbin.org/put hello=world
PUT /put HTTP/1.1
Accept: application/json, */*;q=.5
Accept-Encoding: gzip, deflate
Content-Type: application/json
Host: httpbin.org
User-Agent: HTTPie/0.2.7dev

{
    "hello": "world"
}


HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 477
Content-Type: application/json
Date: Sun, 05 Aug 2012 00:25:23 GMT
Server: gunicorn/0.13.4

{
    …
}

Идентификация в HTTPS

Идентификация сервера

HTTP/TLS запросы генерируются путём разыменования URI, вследствие чего имя хоста становится известно клиенту. В начале общения, сервер посылает клиенту свой сертификат, чтобы клиент идентифицировал его. Это позволяет предотвратить атаку человек посередине. В сертификате указывается URI сервера. Согласование имени хоста и данных, указанных в сертификате, происходит в соответствии с протоколом RFC2459.

Если имя сервера не совпадает с указанным в сертификате, то пользовательские программы, например браузеры, сообщают об этом пользователю. В основном, браузеры предоставляют пользователю выбор: продолжить незащищённое соединение или прервать его.

Идентификация клиента

Обычно, сервер не располагает достаточной информацией о клиенте, для его идентификации. Однако, для обеспечения повышенной защищённости соединения используется так называемая two-way authentication. При этом сервер, после подтверждения его сертификата клиентом, также запрашивает сертификат. Таким образом, схема подтверждения клиента аналогична идентификации сервера.

HTTP/1.0 — 1996

В отличие от HTTP/0.9, спроектированного только для HTML-ответов, HTTP/1.0 справляется и с другими форматами: изображения, видео, текст и другие типы контента. В него добавлены новые методы (такие, как POST и HEAD). Изменился формат запросов/ответов. К запросам и ответам добавились HTTP-заголовки. Добавлены коды состояний, чтобы различать разные ответы сервера. Введена поддержка кодировок. Добавлены составные типы данных (multi-part types), авторизация, кэширование, различные кодировки контента и ещё многое другое.

Вот так выглядели простые запрос и ответ по протоколу HTTP/1.0:

Помимо запроса клиент посылал персональную информацию, требуемый тип ответа и т.д. В HTTP/0.9 клиент не послал бы такую информацию, поскольку заголовков попросту не существовало.

Пример ответа на подобный запрос:

В начале ответа стоит HTTP/1.0 (HTTP и номер версии), затем код состояния — 200, затем — описание кода состояния.

В новой версии заголовки запросов и ответов были закодированы в ASCII (HTTP/0.9 весь был закодирован в ASCII), а вот тело ответа могло быть любого контентного типа — изображением, видео, HTML, обычным текстом и т. п. Теперь сервер мог послать любой тип контента клиенту, поэтому словосочетание «Hyper Text» в аббревиатуре HTTP стало искажением. HMTP, или Hypermedia Transfer Protocol, пожалуй, стало бы более уместным названием, но все к тому времени уже привыкли к HTTP.

Один из главных недостатков HTTP/1.0 — то, что вы не можете послать несколько запросов во время одного соединения. Если клиенту надо что-либо получить от сервера, ему нужно открыть новое TCP-соединение, и, как только запрос будет выполнен, это соединение закроется. Для каждого следующего запроса нужно создавать новое соединение.

Почему это плохо? Давайте предположим, что вы открываете страницу, содержащую 10 изображений, 5 файлов стилей и 5 JavaScript файлов. В общей сложности при запросе к этой странице вам нужно получить 20 ресурсов — а это значит, что серверу придётся создать 20 отдельных соединений. Такое число соединений значительно сказывается на производительности, поскольку каждое новое TCP-соединение требует «тройного рукопожатия», за которым следует медленный старт.

Тройное рукопожатие

«Тройное рукопожатие» — это обмен последовательностью пакетов между клиентом и сервером, позволяющий установить TCP-соединение для начала передачи данных.

  • SYN — Клиент генерирует случайное число, например, x, и отправляет его на сервер.
  • SYN ACK — Сервер подтверждает этот запрос, посылая обратно пакет ACK, состоящий из случайного числа, выбранного сервером (допустим, y), и числа x + 1, где x — число, пришедшее от клиента.
  • ACK — клиент увеличивает число y, полученное от сервера и посылает y + 1 на сервер.

Примечание переводчика: SYN — синхронизация номеров последовательности, (англ. Synchronize sequence numbers). ACK — поле «Номер подтверждения» задействовано (англ. Acknowledgement field is significant).

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

Тем не менее, некоторые реализации HTTP/1.0 старались преодолеть эту проблему, добавив новый заголовок Connection: keep-alive, который говорил бы серверу «Эй, дружище, не закрывай это соединение, оно нам ещё пригодится». Однако эта возможность не была широко распространена, поэтому проблема оставалась актуальна.

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

Deployment Questions

How do I debug HTTP/2 if it’s encrypted?

There are many ways to get access to the application data, but the easiest is to use NSS keylogging in combination with the Wireshark plugin (included in recent development releases). This works with both Firefox and Chrome.

How can I use HTTP/2 server push?

HTTP/2 server push allows a server to provide content to clients without waiting for a request. This can improve the time to retrieve a resource, particularly for connections with a large bandwidth-delay product where the network round trip time comprises most of the time spent on a resource.

Pushing resources that vary based on the contents of a request could be unwise. Currently, browsers only use pushed requests if they would otherwise make a matching request (see ).

Some caches don’t respect variations in all request header fields, even if they are listed in the header field. To maximize the likelihood that a pushed resource will be accepted, content negotiation is best avoided. Content negotiation based on the header field is widely respected by caches, but other header fields might not be as well supported.


С этим читают