В HTTP/1.1 была одна большая проблема - Head of Line Block. Одно подключение обрабатывает всего 1 запрос за раз.
Можно несколько запросов подряд отправить, вот прям одним пакетом. HTTP pipelining называется, но браузеры эту фичу по-дефолту (т.е. всегда) отключают, потому что слишком много серверов багованные были и нормально не умели их разруливать. Криворукие дегенераты, кстати, индиго-то прекрасно умеет. Но исходную проблему это не решает - у нас всё ещё одновременно обрабатывается всего 1 запрос на подключение.
Например, мы сначала запрашиваем index.html, из которого потом сразу делаем несколько запросов, чтобы подтянуть стили, жс и три шакала.жпег. И нам нужно либо открыть несколько подключений, чтобы по ним параллельно запросы гонять, либо по одному дрочиться и по очереди каждый ресурс и каждого шакала.жпег запрашивать. Даже если у нас широкий канал, и спокойно с тем же успехом пролезут три шакала.жпег одновременно.
Вот на тему нескольких подключений - хром (фуррилиса, скорее всего, тоже) имеют лимит в 6 параллельных подключений на домен. Некоторым было и этого недостаточно, и они упирались в HoL. Отсюда пошёл приём domain sharding, когда у нас несколько субдоменов а-ля api.example.com, static.example.com, чтобы "увеличить" лимит и иметь ещё больше параллельных потоков (подключений).
Это одно из двух главных новшеств HTTP/2: добавили наконец мультиплексирование. Это когда несколько потоков данных склеивают в один. Сам по себе термин из телекома пошёл, там провода вместе скручивали. Аналогично и здесь: теперь запросы разбиты на кусочки (фреймы), и у каждого кусочка свой стрим (медная/оптическая фибра). И вся эта радость летит по одному-единственному подключению. Всё ещё присутствует лимит на одновременно активные стримы, конечно, но в стандарте рекомендуют его выставлять на не менее 100, а в дикой природе обычно и вовсе 128 шуруют (степень двойки неспроста, кстати). А 128 одновременно выполняющихся запросов - это на два порядка больше чем 6, ёпта.
Нет, можно и подключений 128 вхоботить, но проблема во-первых в блэкбоксах (файрволлах), которые часто любят пропускать не больше 30 штук с одного адреса. А во-вторых, это в целом не очень приятная штука - и ядро много памяти под буфер для подключения выделяет, и больше их поллить надо (условный еполл масштабируется в логарифм, но всё равно — меньше = лучше), так ещё и холодный старт для каждого из них. Правда, теперь демультиплексировать фреймы из подключения в соответствующие горутины нужно мне самостоятельно ручками вместо ядра, да и за окнами следить теперь самому надо (когда-нибудь возможно и про них пост напетляю). Такова цена успеха. Ощущение присутствия инородного тела в прямой кишке.
Post #606
288
- 👍 4