Чем меньше веб-сайт, тем быстрее он грузится, и это неудивительно.

Удивительно то, что страница на 14 КБ может грузиться гораздо быстрее, чем страница на 15 КБ, даже на 612 мс быстрее, хотя разница между страницами на 15 КБ и 16 КБ минимальна.

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

Что такое TCP?


Transmission Control Protocol (TCP) — это способ использования Internet Protocol (IP) для надёжной передачи пакетов данных; иногда его также называют TCP/IP.

Когда браузер запрашивает ваш веб-сайт (или изображение, или таблицу стилей), он выполняет запрос при помощи HTTP.

HTTP построен поверх TCP, один HTTP-запрос обычно состоит из множества пакетов TCP.

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

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

TCP — это расширение IP, позволяющее браузеру и серверу веб-сайта сказать друг другу, какие пакеты успешно получены.

Сервер отправляет несколько пакетов, затем ожидает ответа от браузера, сообщающего, что он получил пакеты (это называется подтверждением приёма, acknowledgement, или ACK), затем отправляет ещё несколько пакетов, а если он не получил ACK, то может отправить пакеты повторно.

Что такое медленный старт TCP?


Медленный старт TCP (TCP slow start) — это алгоритм, используемый серверами для определения того, сколько пакетов можно отправить за раз.

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

Ширина канала (bandwidth) — это объём данных, который можно передать по сети за единицу времени. Обычно она измеряется в битах в секунду (бит/с). В качестве аналогии можно привести задачу про воду и трубы: ширина канала — это количество воды, которое может выливаться из трубы в секунду.

Ваш сервер не знает, с каким объёмом данных может справиться соединение, поэтому сначала он отправляет небольшое надёжное количество данных, обычно 10 пакетов TCP.

Если эти пакеты успешно добираются до посетителя сайта, то его компьютер передаёт подтверждение приёма (ACK), сообщающее об успешном получении пакетов.

Затем сервер отправляет новые данные, на этот раз удваивая количество пакетов.

Этот процесс повторяется до утери пакетов, когда сервер не получит ACK. (После этого сервер продолжает отправлять пакеты, но с меньшей частотой.)

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

Откуда же взялась величина 14 КБ?


Медленный старт TCP большинства веб-серверов начинает с отправки 10 пакетов TCP.

Максимальный размер пакета TCP составляет 1500 байтов.

Этот максимум определяется не спецификацией TCP, а стандартом Ethernet.

В каждом пакете TCP 40 байтов используются под заголовок — 16 байтов для IP и дополнительные 24 байта для TCP.

То есть на каждый пакет TCP остаётся 1460 байтов. 10 x 1460 = 14600 байтов, или приблизительно 14 КБ!

То есть если вы сможете уместить свой веб-сайт (или хотя бы его критически важные части) в 14 КБ, то сэкономите посетителям кучу времени, необходимого для передачи данных туда и обратно между ними и сервером веб-сайта.

Насколько долгим может быть путь туда и обратно?


Люди очень нетерпеливы, а один путь туда и обратно на удивление длителен. Его длительность зависит от задержки…

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

Вот любопытный пример того, насколько плохой может быть задержка:

Спутниковый Интернет


Спутниковый Интернет предоставляется спутником на орбите Земли. Он используется в местах с очень низкой плотностью населения, на нефтяных платформах, круизных судах и для WiFi в самолётах на время полёта.

Чтобы проиллюстрировать этот пример ужасной задержки, представим, что компания нефтяников забыла свои кубики дома и хочет использовать замечательный сайт missingdice.com (меньше 14 КБ), чтобы сыграть в Dungeons & Dragons.

Сначала один из нефтяников через свой телефон выполняет запрос к веб-странице…

Телефон отправляет запрос WiFi-маршрутизатору платформы, передающему эти данные на спутниковую тарелку буровой платформы. Давайте будем щедрыми, пусть это занимает 1 мс.

Затем спутниковая тарелка должна отправить эти данные на спутник, летающий по орбите вокруг Земли.

Обычно для этого спутник выводят на геостационарную орбиту в 35786 км над поверхностью Земли. Радиоволны (и свет) движутся со скоростью 299792458 м/с, поэтому отправленное с Земли на спутник сообщение будет передано за 120 мс. Затем спутник отправляет сообщение на земную станцию, для чего требуется ещё 120 мс.

Затем земная станция должна отправить запрос в ту точку Земли, где находится сервер (перемещаясь по оптоволоконному кабелю, свет замедляется до двухсот миллионов м/с). Если расстояние между земной станцией и сервером такое же, как расстояние между Нью-Йорком и Лондоном, то он будет передан примерно за 28 мс, но если оно ближе к расстоянию между Нью-Йорком и Сиднеем, то это займёт 80 мс, так что остановимся на 60 мс (удобное для наших расчётов значение).

Затем сервер должен обработать запрос, что может занять, наверное, около 10 мс, после чего сервер отправляет его обратно.

Снова на земную станцию, в космос, обратно на спутниковую тарелку, затем на WiFi-маршрутизатор, и, наконец, в телефон нефтяника.

телефон -> WiFi-маршрутизатор -> спутниковая тарелка -> спутник -> земная станция -> сервер -> земная станция -> спутник -> спутниковая тарелка -> WiFi-маршрутизатор -> телефон

Если мы выполним расчёт, то получим 10 + ( 1 + 120 + 120 + 60 ) x 2 = 612 мс.

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

Кроме того, до выполнения первого пути протоколу HTTPS требуется две дополнительных передачи, что даёт нам 1836 мс!

А какой задержка будет для людей, живущих на суше?


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

  • Мобильная связь 2G обычно имеет задержку от 300 мс до 1000 мс
  • Сети 3G могут иметь задержку от 100 мс до 500 мс
  • «Шумные» мобильные сети, допустим, в необычно переполненном месте наподобие музыкального фестиваля
  • Серверы, которым приходится справляться с большими объёмами трафика
  • Различные неприятности

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

Что вы можете сделать, узнав о правиле 14 КБ?


Разумеется, вы можете сделать ваш веб-сайт как можно меньше — вы же любите своих посетителей и хотите, чтобы они были довольны. Стремление к тому, чтобы каждая страница умещалась менее чем в 14 КБ — хорошая цель.

Эти 14 КБ включают в себя сжатие, то есть на самом деле распакованных данных может быть примерно 50 КБ, что довольно щедро. Напомню, что управляющие ЭВМ «Аполлона-11» имели всего 72 КБ памяти.

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

И даже если вы изо всех сил пытались уместить всё в 14 КБ, но не смогли, правило 14 КБ всё равно остаётся полезным.

Постарайтесь сделать так, чтобы первые 14 КБ передаваемых посетителям данных можно было использовать для рендеринга чего-то полезного, например, это могут быть какие-то критически важные CSS, JS и первые несколько параграфов текста, объясняющие, как пользоваться вашим приложением.

Примечание: в правило 14 КБ включаются и HTTP-заголовки, которые не упаковываются (даже с использованием HTTP/2 в первом ответе), а также изображения, поэтому загружайте только то, что находится наверху, и делайте их очень маленькими, или используйте заглушки, чтобы посетители знали, что их ждёт что-то хорошее.

Некоторые особенности этого правила


Правило 14 КБ — это эмпирическое правило, а не фундаментальный закон:

  • Некоторые серверы увеличили окно медленного старта TCP с 10 до 30 пакетов
  • Иногда сервер знает, что он может начать с большего количества пакетов, потому что использовал TLS handshake для определения того, что можно использовать большее окно.
  • Серверы могут кэшировать количество пакетов, которое может выдержать соединение, и отправлять в следующий раз большее количество.
  • Есть и другие особенности: вот более глубокая статья о том, что правило 14 КБ применимо не всегда

HTTP/2 и правило 14 КБ


Кто-то считает, что правило 14 КБ неактуально при использовании HTTP/2. Я прочитал по этой теме всё возможное, пока мне это не наскучило, но не встретил никаких свидетельств того, что серверы, использующие HTTP/2, больше не применяют в начале медленный старт TCP с 10 пакетами.

HTTP/3 и QUIC


Аналогично существует мнение, что HTTP/3 и QUIC отменяют правило 14 КБ, но на самом деле это не так. QUIC рекомендует использовать то же правило 14 КБ.

Дополнительные источники


Основная часть содержимого этого поста взята из следующих ресурсов:

Комментарии (178)


  1. TsarS
    26.08.2022 16:28
    +76

    Я сейчас сделал ng new project с Angular — мне больно от вашей статьи


    1. Rive
      26.08.2022 17:42
      +2

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

      Всё содержимое папки node_modules на клиент не пойдёт.


      1. gmtd
        26.08.2022 17:49
        -6

        Дело совсем в другом
        Современные JavaScript фреймворки позволяют сделать SPA и даже PWA
        А значит на повторных заходах на сайт первый запрос будет за только json-ом нужных данных - всё остальное будет уже в браузере

        Так что тут автор немного сел в лужу с советом не пользоваться клиентскими фреймворками.


        1. 0xd34df00d
          26.08.2022 17:56
          +17

          Я в веб-разработке ничего не понимаю, но разве «обычный сайт» не осядет в кеше, с аналогичным избеганием скачивания при последующих заходах на сайт?


          Короче, личный блог мне на фреймворках переписывать или не надо?


          1. gmtd
            26.08.2022 18:04

            1. Зависит от настроек кэширования ресурсов на сервере.

            2. Для ресурсов типа html обычно всё равно идет запрос - изменился ли файл

              Данная страница. например, запускает 80 запросов


            1. 0xd34df00d
              26.08.2022 18:08
              +1

              Зависит от настроек ресурсов кэширования на сервере.

              Предположим, что мы всё настроили оптимально (что бы это ни значило). Что тогда получается?


              1. gmtd
                26.08.2022 18:13

                Аскетичный сайт-визитку можно засунуть в 14кб index.html, остальные ресурсы закешировать. Тогда подход автора сработает
                Блог - вряд ли
                От такого минимализма даже олдскульщики уже отошли


                1. 0xd34df00d
                  26.08.2022 18:28
                  +3

                  От такого минимализма даже олдскульщики уже отошли

                  Ну хз, я свой блог генерю статически из кучи маркдауна, и JS там, считайте, нет.


                  Но за 14 килобайтами, конечно, не гонюсь, но и без этого — главный html 10 килобайт, главный css 3 килобайта. Потом, правда, ещё немного css на 5 кило, картинок на 4 кило, ну и Fira Code на сотыч.


                  1. TimsTims
                    26.08.2022 20:30
                    -9

                    Можно все разнести на разные dns имена. Тогда браузер будет к ним подключаться в параллели.


                    1. vanxant
                      26.08.2022 22:44
                      +11

                      не советуйте, если не разбираетесь, пожалуйста.

                      К этим разным dns именам браузер будет делать хэндшейки https, а в случае одного домена - переиспользовать существующее http2/3 соединение


                      1. TimsTims
                        28.08.2022 02:31
                        -4

                        а в случае одного домена — переиспользовать существующее http2/3 соединение
                        Однако если файлов будет сотни, то это одно соединение, даже по QUIC, будет закачивать файлы по одному. В таком случае, параллельные соединения на разные (штук 5) доменов даже с учётом хэндшейков выигрывают. Не так ли?
                        не советуйте, если не разбираетесь, пожалуйста.
                        Как-то грубовато прозвучало. Давайте уважать друг друга.


                      1. vesper-bot
                        28.08.2022 03:05
                        +3

                        Не так. В http/2 есть возможность серверу передавать данные в одном соединении как несколько потоков, при этом ни один поток не обязан ждать других. Проблема, какую вы описали, существует в http/1.1.


                      1. TimsTims
                        28.08.2022 13:27

                        Спасибо. В изначальном посте не было речи про используемый протокол, значит мои слова всё же были верны для http 1.1.


                    1. 0xd34df00d
                      26.08.2022 23:19
                      +5

                      Ну, с одной стороны, если судить по вкладке Network в хромовских «Инструментах разработчика», то там и так всё достаточно параллельно:


                      С другой — для меня nginx настроить уже проблема, какие там разные dns-имена.


                  1. urvanov
                    27.08.2022 12:10
                    +4

                    Можно внутрь html запихнуть и css, а заодно избавиться от кастомного шрифта. Тогда ещё лучше будет


                    1. 0xd34df00d
                      27.08.2022 19:06
                      +1

                      Можно внутрь html запихнуть и css

                      А это интересный вопрос. Тогда ведь целых лишних 3-7 килобайт с каждой страницей будут приходить, которые могли бы быть закешированы. Целая лишняя секунда на диалапе!


                      Люди в веб-разработке на это всё равно забивают и инлайнят мелкие вещи?


                      заодно избавиться от кастомного шрифта

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


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


                      1. vanxant
                        27.08.2022 21:22
                        +1

                        Люди в веб-разработке на это всё равно забивают и инлайнят мелкие вещи?

                        Каждый лишний запрос это дополнительные байты (в http2 от нескольких сотен байт до нескольких килобайт, если страница обвешана куками как новогодняя ёлка), и, что хуже, это дополнительный раундтрип. Поэтому например всякие иконки размером до пары кб выгоднее инлайнить в css. А также инлайнить в html самый базовый css, необходимый для отображения самого первого экрана сайта, ну хотя бы чтобы текст не прыгал по экрану в процессе загрузки.


                      1. 0xd34df00d
                        27.08.2022 23:29
                        +1

                        Хм, разумно. Повод запилить инлайнинг ресурсов в hakyll.


                      1. alexnozer
                        28.08.2022 10:07

                        В любой системе, будь то Windows, macos, и тд есть набор стандартных шрифтов, причём с щасечками, без засечек и моноширинный (как раз для кода).

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


                      1. gmtd
                        28.08.2022 10:43

                        Есть варианты как грузятся шрифты
                        HTML и CSS этим управляют


                      1. alexnozer
                        28.08.2022 11:50

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

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

                        Шрифты, конечно, можно загрузить асинхронно, но это уже требует js. Но так не делают, асинхронная загрузка шрифта приводит к перерисовкам (FOUT), а с этим как раз и пытаются бороться вышеуказанными способами в HTML/CSS.


                      1. 0xd34df00d
                        28.08.2022 17:16
                        +1

                        Но так не делают, асинхронная загрузка шрифта приводит к перерисовкам (FOUT)

                        Ну и что? В худшем случае у вас будет одна перерисовка [примеров кода] при первом заходе на сайт (или после выкидывания шрифта из кэша). Не вижу в этом особой проблемы.


                      1. vanxant
                        28.08.2022 18:21
                        -1

                        Единственный способ избежать перерисовки - инлайнить шрифт в CSS.

                        Да-да, через

                        @font-face {
                          font-family: 'Open Sans';
                          font-style : normal;
                          font-weight: 400;
                          src        : url("data:application/font-woff2;charset=utf-8;base64,d09GMgA......
                         }

                        Все остальные способы приведут к перерисовке и, хуже всего, "прыганию" макета.


                      1. alexnozer
                        28.08.2022 21:21

                        Бесспорно можно инлайнить. Только вот base64 от файла со шрифтом будет весить в среднем на 20-30% больше, чем просто файл со шрифтом. 2-3 таких инлайна и размер файла CSS увеличивается, следовательно он дольше загружается и дополнительные (пусть и небольшие) накладные расходы на преобразование. А CSS ресурс блокирующий.

                        Единственный способ избежать "прыжков" шрифта - использовать system-ui и перечень web-safe шрифтов.

                        Далее если шрифт сабсетить по набору глифов, использовать unicode-range в сочетании с предзагрузкой, это тоже позволит избежать прыжков в большинстве случаев.


                      1. vanxant
                        28.08.2022 21:43
                        -1

                        CSS ресурс блокирующий

                        именно это нам и требуется

                        base64 от файла со шрифтом будет весить в среднем на 20-30% больше

                        Да, только он передаётся сжатым. А gzip/brottli от base64 от файла будет весить на 0,1% больше. Проверено

                        Единственный способ избежать "прыжков" шрифта - использовать system-ui и перечень web-safe шрифтов.

                        Нет, не единственный. Во-первых, указанное вами решение не работает, ну по крайней мере для не-английских сайтов. Во-вторых, описанное мной - единственное, которое работает.

                        Далее если шрифт сабсетить по набору глифов, использовать unicode-range в сочетании с предзагрузкой, это тоже позволит избежать прыжков

                        Нет конечно. Вы, прежде чем переписывать методичку твиттора, хотя бы попробуйте заменить какой-нибудь Tactic Sans на системный шрифт.


                      1. alexnozer
                        28.08.2022 22:51

                        именно это нам и требуется

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

                        Да, только он передаётся сжатым. А gzip/brottli от base64 от файла будет весить на 0,1% больше. Проверено

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

                        Нет, не единственный. Во-первых, указанное вами решение не работает, ну по крайней мере для не-английских сайтов. Во-вторых, описанное мной - единственное, которое работает.

                        Не "прыгает" шрифт если его нет. В том смысле, что нет деклараций. Тогда будет использоваться системный шрифт из системы. Причем доя кириллицы тоже. Об этом и речь - если отказаться от кастомных шрифтов, прыжков не будет. Если кастомный шрифт есть, он может не прыгать, если загрузится достаточно быстро.

                        Нет конечно. Вы, прежде чем переписывать методичку твиттора, хотя бы попробуйте заменить какой-нибудь Tactic Sans на системный шрифт.

                        Твиттер не читаю, тут мимо. Сказанное основывается на моих экспериментах, копании в сайтах и чтении пары публикаций от Adobe (думаю в шрифтах они разбираются лучше нас). Не знаю причём тут замена шрифта tactic sans и сабсеттинг (который подразумевает разделение шрифта на более мелкие сабсеты), о котором я писал в сообщении, которое вы цитируете.


                      1. vanxant
                        29.08.2022 00:04
                        -1

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

                        А вы, видимо, даже не задавались вопросом, ЗАЧЕМ сокращать блокировку основного потока. Т.е. даже не гуглили, потому что гугл как раз объясняет в первом же ответе, ссылкой на лайтхаус (бывший pagespeed).

                        будет использоваться системный шрифт из системы.

                        будет, да. Но если только вы не сопливый стартапер из ООО "три студента", у вас в конторе есть дизайнер с арт-директором. И они вас за "системный шрифт" просто уволят за профнепригодность.

                        Не знаю причём тут замена шрифта tactic sans и сабсеттинг

                        Ну просто пример, из недавних. Если Times слишком мелкий, то вот этот - очень крупный. И страница без инлайнинга этого шрифта просто кровь-кишки-разваливается при его загрузке, при любом значении font-display


                      1. urvanov
                        28.08.2022 22:56

                        ну по крайней мере для не-английских сайтов

                        В современных ОС шрифты сразу содержат кучу символов, не только английские буквы, но и иероглифы, математические, смайлики и кучу других. Сейчас не 2000-ые


                      1. 0xd34df00d
                        29.08.2022 00:06
                        +1

                        Если прыгание не ведёт к тому, что дёргается открытая после загрузки часть, и если загрузка дополнительных шрифтов выполняется достаточно быстро, чтобы пользователь не успел поскроллить после загрузки в случае ссылки на якорь, то в чём проблема с прыганьем?


                      1. vanxant
                        29.08.2022 00:26

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

                        Это всё равно некрасиво!

                        Вам, возможно, это трудно понять, но остальным 90% населения это очевидно. (


                      1. 0xd34df00d
                        28.08.2022 17:15
                        +1

                        В любой системе, будь то Windows, macos, и тд есть набор стандартных шрифтов, причём с щасечками, без засечек и моноширинный (как раз для кода).

                        Но в них не обязаны быть все нужные символы.


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

                        Даже я знаю, что нет. font-display: swap;, всё такое.


                  1. CoolCmd
                    27.08.2022 19:02

                    ну и Fira Code на сотыч.

                    вот это правильно, ведь у пользователей не установлено моноширинного шрифта!


                    1. 0xd34df00d
                      27.08.2022 19:07
                      +2

                      Не факт, что в установленном у пользователя моноширинном шрифте есть какой-нибудь ℕ или ∀.


                      1. Aleksandr-JS-Developer
                        27.08.2022 19:18

                        const ∀ = 123;


                      1. 0xd34df00d
                        27.08.2022 19:20
                        +1

                        Это хорошо, но когда я на своих андроидодевайсах открываю кое-какие свои исходники на гитхабе, то там нередки квадратики в тех местах, где квадратиков быть не должно.


                      1. urvanov
                        27.08.2022 20:30
                        +1

                        public class ユーザープロフィール {
                          /**
                           *الاسم الأخير للشخص 
                           */
                          private String 姓;
                          /**
                           * العشيرة التي تتكون منها
                           */
                          private String クラン;
                        }


                      1. CoolCmd
                        28.08.2022 11:41

                        мат. символы занимают сотыч?


                      1. 0xd34df00d
                        28.08.2022 17:17
                        +1

                        Сотыч килобайт? Да, спокойно.


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


                      1. vanxant
                        28.08.2022 18:22

                        Математических, инженерных и научных символов в Юникоде - примерно 5000 штук. Было 20 лет назад.


              1. dynamicult
                26.08.2022 22:19

                Предположим, что мы всё настроили оптимально (что бы это ни значило). Что тогда получается?

                Суть PWA в том, что при открытии сайта, браузер вообще не пойдет в сеть. Он обратится к сервис-воркеру, который является javascript-приложением, а тот достанет ответ из кэш-стора или вообще его сгенерирует динамически прямо на клиенте. А если захочет, то и обратится в сеть. Таким образом PWA, однажды открытый на клиентском устройcтве, может работать даже без интернета. Сам браузер будет в сети только проверять не обновился ли сервис-вокрер, и если да, то в фоне загружать новую его версию. Все остальные сетевые запросы к сайту в области ответственности установленного воркера, будут проксироваться через него.

                При обыкновенном баузерном кэшировании этого не случится. При отсутсвии интернета браузер вам покажет страницу ошибки. А при наличии сети все равно отправит запросы в сеть. Никакими настройками сервера и выставлением нужных заголовков вы не добьетесь поведения аналогичному или хотя бы приближенному к PWA.

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

                Сама концепция PWA не нова, как и все хорошо забытое. Не многие помнят такую вещь, как автономные веб-страницы в IE. Это почти то же самое, только более прогрессивное и стандартизированное. Теперь разработчик может сам контролировать эту автономность и программировать её логику.


                1. vanxant
                  26.08.2022 22:45
                  +6

                  только это всё никак не поможет при первом открытии сайта.


                1. 0xd34df00d
                  26.08.2022 23:32
                  +2

                  А какая там логика для совершенно статического контента? Ну, то есть, я даже не знаю, что там контролировать, и механизм кеширования браузера по идее должен сам отлично справляться.


                  При обыкновенном баузерном кэшировании этого не случится. При отсутсвии интернета браузер вам покажет страницу ошибки.

                  Собственно, когда я подобные статические сайты без всяких сервис воркеров открываю на планшете, случайно забыв включить вайфай, то они вполне себе отлично показывают кешированную версию (показывая «Оффлайн» в адресной строке, но неважно).


                  А при наличии сети все равно отправит запросы в сеть.

                  Меньше сотни байт. Это можно пережить:



                  1. arheops
                    26.08.2022 23:34
                    +1

                    Броузер спрашивает не обновилась ли страничка.
                    Вообще это от настроек кеша зависит, но в современных броузерах именно так. Как минимум для index.html


                    1. 0xd34df00d
                      26.08.2022 23:35
                      +5

                      Для меня со стороны попытки спрашивать, не обновилась ли страничка при детектируемом отсутствии соединения, и вывод плашки «нету интернета» при наличии кешированной версии выглядят как недоработка браузера. Почему её должны затыкать 100500 владельцев сайтов вместо двух разработчиков движков — непонятно.


                      1. k4ir05
                        27.08.2022 07:04
                        +2

                        Так браузеры ведут себя в соответсвии с заголовком Cache-Control (и некоторыми другими). Если там указано, что кэш надо перепроверять (must-revalidate, например, и кэши протухли), то они будут это делать. Если разработчик указал, что ресурс неизменяемый, то браузер и не будет перепроверять, а возьмёт из кэша.


                      1. mayorovp
                        27.08.2022 13:41

                        Вы как будто на идрисах ничего не писали.


                        У браузера нет доказательства того, что контент сайта не обновился. Значит, нужен запрос к серверу.


                        Если разрешать отображение старого контента без доказательств — сайты просто будут "ломаться".


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


                      1. 0xd34df00d
                        27.08.2022 19:12
                        +1

                        Если бы браузеры доказывали что-то про веб как на идрисах, то они бы ещё HTML 3.2 не реализовали бы.


                        У браузера нет доказательства того, что контент сайта не обновился. Значит, нужен запрос к серверу.

                        Если есть возможность сделать запрос — конечно, пусть браузер делает, я ж не против. Но если такой возможности нет (будь то отсутствие интернета, или сам сайт лежит), то отображение старой версии сайта в куче случаев (в подавляющем большинстве?) будет лучше, чем отображение пустой страницы. Особенно если это чисто контентный сайт.


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

                        Я это понимаю, и хочу что-то среднее — отображение прокешированной версии, если нет возможности загрузить новую.


                  1. dynamicult
                    26.08.2022 23:38
                    +1

                    Вот я только что открыл ваш блог. Дождался полной его загрзуки. После чего выключил интернет и перезагрузил страницу.

                    Если бы у вас был сервис-воркер с заскпритованной логикой кэширования, я бы снова увидел контент вашего блога, а не страницу с ошибкой.

                    То, что браузер на вашем планшете показывает вам страницу из кэша при отстуствии сети - это вольная прихоть самого браузера на мобильном устройстве, а не стандартное поведение. Оно не предсказуемо и не контролируемо, в отличии он концепции PWA.


                    1. 0xd34df00d
                      26.08.2022 23:45
                      +4

                      То, что браузер на вашем планшете показывает вам страницу из кэша при отстуствии сети — это вольная прихоть самого браузера на мобильном устройстве

                      Мой поинт в том, что это разумное поведение, и его разумно ожидать и у других браузеров.


                      а не стандартное поведение.

                      ИМХО стандартной должна быть только семантика, а не, в подавляющем большинстве случаев, презентация или поведение. Презентация (размер шрифтов, шрифт основного текста, или, возможно даже, цветовая гамма) или поведение — это прихоть и удобство пользователя, а не автора сайта, который решил «я так вижу» за всех. Откуда я там знаю, что пользователь хочет? Моё дело — дать ему семантически размеченный контент, а его просмотрщик пусть делает с ним что хочет.


                      Но, опять же, я не шарю в веб-разработке. Для меня это так, способ записать какие-то свои мыслишки и под настроение побаловаться с CSS как с одной из максимально далёких от моего обычного стека технологий. Может, это всё не имеет смысла.


                      [ из соседней ветки ]


                      https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers

                      Блин, сколько буков, чтобы просто сказать браузеру, что кешируемые ресурсы можно, ну, кешировать.


                      Эх, лучше бы этот ваш гугл добавил и популяризовал какой-нибудь X-Allow-Static-Caching вместо всяких когортных реклам.


                      1. k4ir05
                        27.08.2022 08:01

                        Мой поинт в том, что это разумное поведение, и его разумно ожидать и у других браузеров.

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

                        Блин, сколько буков, чтобы просто сказать браузеру, что кешируемые ресурсы можно, ну, кешировать.

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


                      1. PsyHaSTe
                        27.08.2022 23:29
                        +2

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

                        Что мешает показывать плашку "показать закешированную версию" аналогично с попыткой зайти на сайт с просроченным серитфикатом? А ещё лучше действительно рулить поведением хедером, уж автор сайта наверное знает когда можно использовать его сайт из кэша а когда нельзя. Сколько раз я открывал какой-нибудь блог, а потом у меня ноут обновлялся и в поезде я не мог почитать то что открыл потому что видите ли интернета нет. Да мне плевать что там 3 комментария появилось с тех пор, я их все равно не читаю.


                        Дедфуд выше прав и ничего не сделать


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

                        Ну а простым сайтам как быть? Вот я веду бложик в гитхаб пейджс скажем, я хочу одной строкой задать allow_caching_on_client = true и не хочу писать тонну кода эмулируя все механизмы кэширования которые в хроме наизобретали за последине 20 лет. Что я должен сделать если я хочу чтобы мои странички люди могли читать без интернета?


                      1. k4ir05
                        28.08.2022 02:46

                        Что мешает показывать плашку "показать закешированную версию" аналогично с попыткой зайти на сайт с просроченным серитфикатом?

                        Ну похожее поведение с кэшем я видел, кажется, в Brave. По поводу сертификата, имхо, это может быть небезопасно в некоторых случаях.

                        А ещё лучше действительно рулить поведением хедером, уж автор сайта наверное знает когда можно использовать его сайт из кэша а когда нельзя.

                        Так автор сайта ведь и рулит хедером. Это всё в настройках веб-сервера указывается.

                        Ну а простым сайтам как быть? Вот я веду бложик в гитхаб пейджс скажем, я хочу одной строкой задать allow_caching_on_client = true и не хочу писать тонну кода эмулируя все механизмы кэширования которые в хроме наизобретали за последине 20 лет. Что я должен сделать если я хочу чтобы мои странички люди могли читать без интернета?

                        Размещать их на подконтрольном себе сервере. А так это гитхаб решает, раз он предоставляет к ним доступ. Новые механизмы наизобретали для других целей.


                      1. PsyHaSTe
                        28.08.2022 03:52

                        Так автор сайта ведь и рулит хедером. Это всё в настройках веб-сервера указывается.

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


                      1. k4ir05
                        28.08.2022 13:59

                        Полагаю, что Cache-Control: only-if-cached. Сам этим не пользовался. Можно тут поподробнее почитать.


                      1. PsyHaSTe
                        28.08.2022 14:38

                        Не нашел only-if-cached или чего-либо похожего по ссылке что вы скинули


                      1. k4ir05
                        28.08.2022 15:23

                        Так это общая статья о кэшировании. Значения заголовка Cache-Control есть в справке по нему. Извеняюсь, мой косяк, это значение для запроса. Для ответа должно подойти immutable


                      1. V1RuS
                        28.08.2022 15:29

                        Что я должен сделать если я хочу чтобы мои странички люди могли читать без интернета?

                        RSS


                      1. PsyHaSTe
                        28.08.2022 16:11
                        +1

                        Помню делал поддержку RSS лет 10 назад. Казалось что достаточно удобный и компактный формат, особенно atom (или как они там). Но кажется что оно не очень распространено.


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


                      1. V1RuS
                        28.08.2022 16:35

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


                    1. vedenin1980
                      27.08.2022 00:34
                      +2

                      Эх, лучше бы этот ваш гугл добавил и популяризовал какой-нибудь X-Allow-Static-Caching вместо всяких когортных реклам.

                      Давно уже есть в стандарте html5 (ниже)

                      Оно не предсказуемо и не контролируемо, в отличии он концепции PWA.

                      Но ведь есть же cache manifest в html5, пишем в html

                      <html manifest="/cache.appcache" >


                      и в cache.appcache прописываем все файлы которые нужно кешировать или не кешировать. Все это занимает несколько минут на создание одного файла и одного тега.

                      Зачем тогда тут нужен PWA?


                      1. dynamicult
                        27.08.2022 01:00
                        +3

                        Но ведь есть же cache manifest в html5

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


                      1. vedenin1980
                        27.08.2022 01:41
                        +6

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

                        Дурная привычка java мира — всегда рассчитывать на сохранение обратной совместимости.


                      1. nuclight
                        28.08.2022 05:29

                        Почему дурная и почему java? Во всех нормальных языках так делают — сохраняют совместимость.


                      1. PsyHaSTe
                        27.08.2022 23:32

                        Может вы тогда ответите на вопрос из https://habr.com/ru/post/684836/#comment_24670152 (чуть выше задал? Манифест выглядит как штука которая решала эту задачу, а как сделать чтобы сервис воркер решал что-то не понимаю. Можно показать на пальцах, чтобы я такой "ааа понял, как я сразу не догадался"?


                      1. mayorovp
                        28.08.2022 00:03

                        Если коротко, то надо сложить вот сюда — https://developer.mozilla.org/en-US/docs/Web/API/Cache — все статические ресурсы, а потом ловить вот это — https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent — и отдавать кешированную версию.


                      1. PsyHaSTe
                        28.08.2022 00:25

                        Это кажется сильно больше 1 строчки, нет?..
                        Кажется что очень многие этого не делают как раз потмоу что это неинтуитивно и нераспространно. Хотя многие блоги выиграли бы от подобного. Почти все собственно, единожды написана инфа не меняется


                      1. ivan386
                        28.08.2022 08:19

                        Альтернативой теперь осталось вечное кеширование(Cache-Control: immutable) которое не удобно делать для главной страницы сайта. Ну и так-же недостатком этого HTTP заголовка является то что если мы хотим чтобы пользователь получил новые данные вместо закешированных то надо их запрашивать по другому URL.

                        #comment_24668604


                      1. PsyHaSTe
                        28.08.2022 14:36
                        +1

                        Ну это скорее костыль. Потому что нам нужен сценарий:


                        1. если есть инетрнет, загрузи новейшую страницу
                        2. если его нет, то покажи архивную и какую-нибудь плашку в ридере "вы видите страницу версии 20-08-2022 потому что у вас отстуствует интернет"


                      1. mayorovp
                        27.08.2022 13:43

                        Насколько я помню, с тем старым механизмом была проблема в том, что непонятно как часто надо запрашивать с сервера сам cache.appcache. И что делать если ссылка на него поменялась.


                      1. ivan386
                        27.08.2022 23:50

                        Он же вроде зарашивается браузером каждый раз при новом открытии страницы.


                      1. mayorovp
                        27.08.2022 23:58

                        Ну вот и проблема: интернета нет, запросить манифест не получается...


                      1. vedenin1980
                        28.08.2022 00:33

                        А в чем проблема-то? Нет интернета — отдавать то, что уже закешировалось с прошлого раза. Какие еще варианты?
                        Так будет работать с любой системой.


                      1. ivan386
                        28.08.2022 08:09

                        Сайт отображается из кеша сразу. Паралельно делается запрос манифеста. Если он изменился то в фоне подгружается новая версия сайта. Если манифест не изменился или не доступен то не обновляется.


                1. ivan386
                  27.08.2022 09:11

                  Таким образом PWA, однажды открытый на клиентском устройcтве, может работать даже без интернета.

                  Была технология по проще которую к сожалению таки выпилили из браузеров. Называлась application cache которая позволяла тоже самое без единой строчки Javascript.


                  Альтернативой теперь осталось вечное кеширование(Cache-Control: immutable) которое не удобно делать для главной страницы сайта. Ну и так-же недостатком этого HTTP заголовка является то что если мы хотим чтобы пользователь получил новые данные вместо закешированных то надо их запрашивать по другому URL.


          1. dynamicult
            26.08.2022 22:57

            Короче, личный блог мне на фреймворках переписывать или не надо?

            Если вы хотите контролировать кэширование и доступность вашего блога на клиенте, вам совершенно не обязательно переписывать его на что-либо.

            Достаточно написать один единственный скрипт ServiceWorker со всей нужной логикой обработки запросов и сохранением чего-либо в кэш. Как и все остальное в вебе это можно делать без использования сторонних инструментов.


            1. 0xd34df00d
              26.08.2022 23:22
              +1

              Давайте помедленнее, я глупый и не осилил JS.


              У меня есть страница, она состоит из чистого HTML и CSS. Вот прям сервер отдаёт клиенту HTML. Куда мне тут воткнуть Service Worker и какие запросы он будет обрабатывать? Чем его кэш принципиально лучше кэша браузера?


              1. dynamicult
                26.08.2022 23:38

                1. superconductor
                  27.08.2022 00:23
                  +2

                  Не умаляя достоинств PWA и сервис-воркеров, не могу не отметить, что использование сервис-воркеров вряд ли оправдано для простых статичных визиток, т.к.:

                  • сервис-воркер добавляет сложность - как минимум заставляет думать про совместимость версий приложения, воркера и бэкендного api,

                  • даже при наличии воркера необходимо скачать всю статику и положить в Кеш,

                  • у особенных пользователей какая-то часть статики может в Кеш не поместиться, и это тоже надо корректно обработать,

                  • неудачно поставленный сервис-воркер может замедлить выполнение запросов к сайту,

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

                  Т.е. это не лекарство от медленной сети, а гибкий инструмент для определенных потребностей.


                  1. vedenin1980
                    27.08.2022 00:41
                    -1

                    И есть CACHE MANIFEST который легко и прозрачно позволяет настроить кеширование статических сайтов.


                    1. dynamicult
                      27.08.2022 01:05
                      +5

                      AppCache давным давно DEPRECATED и не поддерживается браузерами. https://caniuse.com/offline-apps


                    1. k4ir05
                      27.08.2022 08:17

                      Но ведь в статье речь идёт о веб приложениях (web application), а не о статичных сайтах.


        1. Moskus
          27.08.2022 06:05
          +2

          Вам очень хочется выиграть в игру "поймай другого на слове", но это не выйдет, потому что автор статьи не делал никаких глупых абсолютных утверждений, а описал конкретный механизм, который зависит от передаваемого клиенту объёма, но не зависит от содержимого этого объёма. Он не отрицал эффект кэширования. Потому что даже когда у клиента что-то уже лежит в кэше, всё равно есть какие-то "первые 14Кб" и последующие данные. А как уж распорядиться этим знанием в разных ситуациях - вопрос предпочтений разработчика.


          1. gmtd
            27.08.2022 06:43
            -1

            Я не собирался никого ловить на слове. Просто заявлю

            1. Для 99.999% вебразработчиков информация от автора не имеет практического резона (они ею не будут пользоваться)

            2. Следовательно эти изыскания чисто теоретические

            3. Фреймворки (которые как раз работают на практике) намного намного лучше решают проблему быстрого открывания современных! сайтов (не "хэлло ворлд"), чем данный подход

            Можно, конечно, интегрировать сферического коня в вакууме, но если нужно будет делать сайт, то пригодятся фреймворки, а не советы автора

            Под "фреймворками" в данном случае имеется ввиду Serviсe Workers и концепция SPA

            Хотя соглашусь, если в самом начале показывать самодостаточную страницу-лоадер, то при первом заходе на сайт алгоритм автора имеет смысл

            Но эта страница - не веб-сайт (см. заголовок)


            1. ivan386
              27.08.2022 09:25
              +3

              Если бы они лучше решали эту проблему сайты бы не тормозили. А так я часто замечаю длительные прогрузки там где казалось бы получил JSON и отобразил данные. Но нет. При этом похоже JavaScript перелопачивает всю страницу заново и уже от скорости интернета это не зависит. Тормозят уже скрипты.


              1. gmtd
                27.08.2022 09:36
                +2

                Программер с кривыми руками и на чистом javascript-e сделает тормознутый сайт

                В сети хватает быстрых удобных богатых по функционалу сайтов на фреймворках


              1. 0x131315
                27.08.2022 18:38
                +1

                Чтобы решать такие проблемы, на это нужен бюджет, и опытная (дорогая) команда - такие условия имеют всего несколько процентов сайтов на рынке.

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

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

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


            1. Moskus
              27.08.2022 19:21

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


  1. dendude
    26.08.2022 16:39
    +3

    То есть нужно иметь каждый файл не более 14кБ чтобы всё работало фить-фить. При этом картинки такого размера найти нереально, вместо них lazy load ?


    1. LuggerFormas
      26.08.2022 16:55
      +3

      CDN уже давно стандарт вроде.


      1. alfixer
        26.08.2022 17:49
        +11

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


        1. Dolios
          26.08.2022 18:46

          А ссылки у вас не сохранилось? Интересно посмотреть.



        1. sunnybear
          26.08.2022 22:20
          +2

          Он просто не умеет готовить CDN


        1. AlexVS85
          26.08.2022 23:40
          +1

          Я так понимаю, это правда только в случае когда статика (картинки, скрипты, стили) раздаются тем же сервером что и сама страница (html) - тогда браузер может переиспользовать tcp соединение и не тратить время на открытие нового.

          Но в случаи нагруженных сервисов (или больших объемов) статика чаще всего где-то на другом сервере (AWS S3, GCS, ...) и тут не вижу проблем в CDN

          поправьте меня если я не прав


          1. alfixer
            27.08.2022 01:15
            +1

            Именно так. Или когда сервер и ЦА находятся в противоположных частях света или разбросаны по миру, также защита от DDOS. Тогда да, однозначно должно быть. В противных случаях в этом нет смысла и даже может навредить.


            1. AlexVS85
              27.08.2022 01:43
              +1

              по сути можно свести к двум ситуациям:

              • сайт достаточно простой что все можно раздать с одного сервера - CDN может замедлить за счет лишнего коннекта (+ время на резолв домена?). Это в случаи если все правильно настроено, а не Wordpress на бесплатном/дешевом shared hosting

              • статика раздается отдельно от HTML, тут сложно придумать случай вреда CDN

              так что:

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

              звучит как преувеличение


    1. andreishe
      26.08.2022 17:30
      +1

      Браузер переиспользует соединения для запросов с одного хоста, т.ч. через одно соединение может быть прокачано больше данных, даже если каждый запрос будет меньше 14k. И еще имейте в виду HTTP заголовки.


    1. alfixer
      26.08.2022 17:30

      Речь о первом пакете, в который нужно уместить сжатый HTML+важный CSS, чтобы показать хотя бы основу сайта. Помнить о критерии CLS. На картинки поставить заглушки или skeleton loader. Далее пакеты удваиваются с каждой итерацией.


    1. ifap
      26.08.2022 17:56

      Нет, грубо говоря, достаточно иметь "легкий" /index.htm


      1. gmtd
        26.08.2022 18:07
        +33

        ... с легким красивым аннимированным пре-лоадером на CSS

        который будет крутиться пока не загрузятся семь мегабайт js, css и картинок


        1. ifap
          26.08.2022 18:16
          +12

          ... с надписью: ваш браузер устарел!


        1. atomlib
          26.08.2022 18:20
          +14

          1. Areso
            26.08.2022 21:32
            +1

            Иронично, потому что ваша ссылка у меня открылась вот так:


          1. klounader
            28.08.2022 05:00

            image


        1. urvanov
          26.08.2022 20:37
          +2

          семь мегабайт js, css и картинок

          Что-то как-то маловато по современным меркам для сайта


    1. arheops
      26.08.2022 22:27

      А картинки и так обычно потом грузятся.


    1. Aquahawk
      26.08.2022 22:45

      нет, благодаря keep-alive который является дефолтной опцией по стандарту http 1.1 соединение продолжит использоваться дальше и его параметры скорее всего улучшатся. Речь только о новых соединениях где качество соединения заранее нетзвестно и пихать всё в сеть со стороны сервера не разумно.


      1. pae174
        28.08.2022 13:48

        На freebsd есть hostcache - хранилище статистики по качеству связи с теми хостами, с которыми сервер уже успел поработать. Так что если какой-то клиент с толстым каналом уже работал с сервером и у него было наработано большое cwnd, то послу ухода и последующего возвращения этого клиента у него сразу будет большое cwnd без всяких там начальных 14 килобайт.


  1. Breathe_the_pressure
    26.08.2022 17:39
    +33

    А эта статья у вас на 28,21 кБ. Вам надо бы поработать над размером. :)


    1. MiXei4
      27.08.2022 03:25
      +3

      В сжатом виде самое то будет.


  1. ermouth
    26.08.2022 17:53
    +1

    Было бы круто, если б в перевод не затаскивалась прямо вся разметка из оригинала. Автор оригинала явно злоупотребляет разметкой.


  1. aborouhin
    26.08.2022 18:12
    +11

    А не проще ли на сервере увеличить initcwnd / initrwnd (то самое количество пакетов, с которого мы начинаем) этак до 30, чтобы без лишних задержек пролетали страницы бóльшего размера? Пользователи с хорошим каналом получат прирост в скорости, а пользователи с еле живым - и так привыкли, что у них всё зависает :)


    1. nuclight
      28.08.2022 05:33

      rwnd тут причем? И как скомандовать ему увеличить cwnd, если это обычно хардкод?


      1. pae174
        28.08.2022 13:43

        На freebsd это действительно делается в настройках sysctl net.inet.tcp.initcwnd_segments .


  1. ryo_oh_ki
    26.08.2022 19:03
    +1

    Жаль, что в HTML-тегах внешних ресурсов типа img, script, iframe и так и не появился атрибут etag, представляющий аналогичный заголовок HTTP. Это позволило бы самой странице управлять кешированием собственного контента, и всё бы влезало в эти 14 Кб... наверное.


    1. gmtd
      26.08.2022 19:08
      +3

      Service Workers
      Страница сама управляет кешированием
      И вообще всем


    1. andreymal
      26.08.2022 19:14
      +1

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


      1. ifap
        26.08.2022 23:53

        Вряд ли, SRI - это про совсем другое и прикручивать хэш к ресурсам на same host - увеличивать размер кода во славу непонятно чего.


        1. andreymal
          27.08.2022 00:20

          Ну не знаю, лично для меня идентификация ресурсов по их хэшу выглядит вполне логичной (предполагая, что у sha256 не найдут нехороших коллизий в обозримом будущем)


          По крайней мере, если issue на гитхабе за год не закрыли — значит W3C тоже считает это логичным, возможно?


          1. ifap
            27.08.2022 00:36

            Я исхожу из того, что если мы допускаем доступ третьих лиц к своему веб-серверу на запись, то изменение ими какой-нибудь .css - меньшее из возможных зол, а значение хэша они в html поправят уж как-нибудь. W3C ИМХО исходят из того же посыла, упоминая в драфте следующей рекомендации SRI сторонние хосты как источник излишеств всяких нехороших. Впрочем, 1 пример у них приведен без схемы, т.е. скрипт загружается с same host...

            Это я все к тому, что SRI вряд ли будут затачивать под кэширование.


            1. andreymal
              27.08.2022 01:27
              +1

              При чём тут третьи лица? Просто проверяем актуальность закэшированного ресурса по хэшу вместо etag или даты


      1. pae174
        28.08.2022 14:26

        SRI не имеет никакого отношения к кэшированию и предназначен для предотвращения неприятностей в случае кагда ваш сайт использует на своих страницах какие-то штуки с других сайтов. Например, если вы на своём сайте размещаете <script src=http://какой-то-чужой-сайт/какой-то-там-скрипт.js>. Эта штука вообще бессмысленна применительно к собственным ресурсам.


        1. andreymal
          28.08.2022 15:18

          Ну так давайте сделаем SRI относящимся к кэшированию, в чём проблема применить его к собственным ресурсам?)


          1. pae174
            28.08.2022 18:57

            Давайте. Напишите пропозал, может примут.


    1. sunnybear
      26.08.2022 22:21

      Etag не зависит от mime типа


    1. pae174
      28.08.2022 14:32
      -1

      Жаль, что в HTML-тегах внешних ресурсов типа img, script, iframe и так и не появился атрибут etag,

      ETag с самого начала был везде - это свойство протокола а не какого-то конкретного формата файлов.


      1. mayorovp
        28.08.2022 14:58

        Речь идёт о способе подсказать etag ресурса ещё до попытки загрузить этот самый ресурс.


        1. pae174
          28.08.2022 16:02

          Я ничего не понял про подсказку etag ресурса.

          Сейчас есть три механизма:

          1) Сервер отдает браузеру Expires дата или Cache-control max-age=срок и браузер больше не беспокоит сервер запросами по поводу ресурса до истечения этого срока.

          2) Сервер отдает браузеру Last-Modified дата а браузер потом посылает серверу заголовок If-Modified-Since дата . В ответ на это сервер может либо ответить 304 Not modified, либо отдать новый контент и новую дату в Last-Modified.

          3) Сервер отдает браузеру ETag некий_тег а браузер потом посылает серверу If-None-Match некий_тег . Сервер опять же может ответить 304 или отдать новый контент и новый тег. При этом алгоритм расчета этого некоего_тега никак не стандартизирован и разные сервера создают его разными способами.

          Собственно мой вопрос - на чьей стороне, в какой момент времени и по какому правилу должно происходить предсказание etag до фактической загрузки ресурса?


          1. mayorovp
            28.08.2022 17:53

            Ну вот смотрите. Допустим, на странице есть условный тэг вида <img src=foo etag=bar>. При этом, у клиента (браузера) уже есть в кеше ресурс foo с тэгом bar. В таком случае он может вообще не делать запроса, а сразу показать кешированную картинку.


            1. ivan386
              28.08.2022 18:17

              Выше уже предложили использовать для этой цели не etag а integrity (Subresource Integrity) атрибут который уже используется для скриптов и стилей но не для кеширования.


            1. pae174
              28.08.2022 18:28
              -1

              Настройте сервер так, что бы он в ответ на запрос /foo отдавал бы только Expires через_сто_лет и браузер не будет перезапрашивать этот ваш /foo целых сто лет (ну или до тех пор, пока /foo не будет выкинут из кэша браузера по каким-то причинам).


              1. mayorovp
                28.08.2022 21:14

                Ага, а если таки foo изменится — то уведомить об этом клиента уже не получится


                1. pae174
                  28.08.2022 21:33

                  То есть вы хотите что бы закэшированный контент /foo оставался бы в кэше до тех пор, пока сервер каким-то образом не выкинет его оттуда сам по своей инициативе, так что ли?


                  1. vanxant
                    28.08.2022 21:45
                    -1

                    ... и этот "какой-то образ выкидываня" называется веб-воркером.


                    1. gmtd
                      29.08.2022 13:25

                      Непонятно почему заминусовали
                      Действительно, Service Workers используются для того, чтобы с сервера подавать команды, какие ресурсы надо принудительно обновить


                      1. mayorovp
                        29.08.2022 13:48

                        Потому что в этой ветке обсуждаются даже близко не они.


                  1. mayorovp
                    29.08.2022 10:43

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


                  1. ris58h
                    29.08.2022 10:52

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


  1. php7
    26.08.2022 19:37

    Вот есть канал 100МБит/с

    Это примерно [8.7к пакетов по 1500 байт]/с

    А если слать пакеты по 150 байт, это будет 87к пакетов/с? Или так же 8.7к?


    1. andreymal
      26.08.2022 20:03

      В теории в идеальной сети да, но на практике у меня между Петербургом и Москвой в iperf3 с пакетами по 150 байт получились 52% потерь пакетов (по 400 байт — 16% потерь, по 600 байт — 7% потерь, по 800 байт — 4% потерь, по 1000 байт — 3% потерь)


      1. arheops
        26.08.2022 22:31

        А чего это у вас внутри страны 3% потерь пакетов? Вроде как больше 1% — можно жаловаться провайдеру, не?


        1. andreymal
          26.08.2022 22:40

          Не знаю, как провайдеры должны реагировать на запредельное число пакетов, но если не выпендриваться и ставить размер 1500 (точнее 1460) байт, то потерь нет, так что всё нормально, наверное?


          1. arheops
            26.08.2022 22:58

            Неа, вдруг у вас VOIP просто. Потери больше 1% почти всеми провайдерам воспринимаются как «надо чинить». А тут на 1000 байт 3%.


            1. andreymal
              26.08.2022 23:30

              А тут на 1000 байт 3%.

              Ну, если не жестить и прописать чуть более скромные хотелки (скорость 92 мегабита), то потери пропадают. Но при размере пакета 150 байт потери пропадают только на скорости 25 мегабит, так что не надо слишком мелкие пакеты слать)


              1. arheops
                26.08.2022 23:33
                +1

                А, так это у вас просто кривой шейпер или роутер не умеющий много пакетов. Так бывает.


                1. cepera_ang
                  27.08.2022 18:27

                  Да, скорее всего просто роутер не потянул, причём скорее всего собственный же домашний (или на втором конце).


        1. laatoo
          27.08.2022 13:56

          больше 1% — можно жаловаться провайдеру, не?

          удачи


    1. arheops
      26.08.2022 22:30

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


    1. nuclight
      28.08.2022 05:34

      А зачем стрелять себе в ногу, уменьшая размер пакета?


      1. php7
        28.08.2022 18:15
        -1

        udp-запрос получения ключа memcached


    1. pae174
      28.08.2022 14:39

      это будет 87к пакетов/с? Или так же 8.7к

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


  1. Helltraitor
    26.08.2022 19:42
    -1

    Загрузчик 512 байт, размер TCP пакта 16 кб. Может стоит обновить стандарты?


    1. rzerda
      26.08.2022 20:23
      +1

      Ну обновите Вы стандарты, а оборудование во всём мире кто и за чей счёт будет обновлять?


  1. rzerda
    26.08.2022 20:32
    +8

    Я аж в календарь посмотрел от этой статьи. Это всё в вебе было интересно до примерно середины 2010-х, пока массово не приехал HTTPS и HTTP/2. При этом прямо в самой статье есть ссылка на «более глубокий анализ», в котором с дампами трафика поясняется, почему эта статья вредная.

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


    1. nuclight
      28.08.2022 05:36

      А что, initial cwnd в них как-то изменился? Он и в QUIC такой же.


      1. rzerda
        28.08.2022 07:47

        Никак не изменился, просто проблемы с быстродействием в вебе стали богаче, чем «давайте сэкономим один rtt на первом холодном заходе». Тот же набор сертификатов TLS легко может быть 5 килобайт, но оригинальный автор прямо в 2022 году пишет, что TLS используется «иногда». Пример с мобильными сетями отличный, но там кроме задержки ещё и потери есть, до состояния «в соединении с полумегабайтом переданных данных никогда не было cwnd больше 10».

        В общем, статья на мой вкус «пропишите вот это в sysctl и будет счастье». Буквально все ссылки в статье лучше, чем сама статья, потому что там либо HPBN, либо дампы трафика и утилиты для анализа происходящего.


  1. tohntobshi
    26.08.2022 20:57
    +1

    Мне кажется, на сайт, который реально имеет какую-то ценность, заходить будут в любом случае, какой бы медленный и убогий UX у него бы не был, алиэкспресс тому пример. А бесполезный ресурс никакие оптимизации не спасут, как бы он не летал.


    1. PavlovM
      27.08.2022 08:12
      +5

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

      И поисковики, кстати, ее в ранжировании тоже учитывают.


  1. Areso
    26.08.2022 21:30

    Хочу напомнить, что существует офигенный ежегодный https://js13kgames.com/ , который уже идёт и будет идти до 13-го числа!

    Больше игр, хороших и разных. И да, умещающихся в 13К!


  1. Wesha
    26.08.2022 23:05

  1. Slavik7
    27.08.2022 05:05

    А какие есть способы отладки всего это счастья? Могу я как-то научить браузер после загрузки первых 14кб останавливаться, чтобы посмотреть, что получилось? И заодно узнать, отдает ли веб-сервер 14кб или больше в качестве первой пачки.


    1. Sau
      27.08.2022 10:59

      В заголовках HTTP указан обычно размер содержимого, Content-Length.


    1. ToSHiC
      27.08.2022 12:27

      Можно задампить трафик в Wireshark, вас все равно только tcp уровень интересует, контент можно не расшифровывать.


      1. Slavik7
        27.08.2022 15:45

        Как раз интересно посмотреть, как браузер отрендерит эти самые первые 14кб. Вот после прочтения статьи мне стало интересно подготовить заглушку в 14кб для пользователей с плохим интернетом. Как вариант стырить пакеты с wireshark, сохранить в файл, потом открыть в браузере... Но может уже есть готовые более простые варианты для отладки.


    1. nuclight
      28.08.2022 05:40

      Для прикладного программиста это нет смысла отлаживать — оно ж и так работает. Столбиков с временем загрузки и так достаточно.


  1. AlexG37G
    27.08.2022 09:14
    +2

    Клуб 10 КБ - это коллекция веб-сайтов, размер домашних страниц которых не превышает 10 КБ в сжатом виде.


  1. ggo
    27.08.2022 09:27

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


  1. AVX
    27.08.2022 16:49

    Короче, делайте сайты "короче", в смысле избавьте от хлама. Уже лет 8 назад встречал статьи (в т.ч. на хабре), что сайты стали слишком жирные. Майкрософт ком страничка в 150 МБ - как это? И ещё куча таких, весьма популярных. А ведь если https (а оно сейчас поголовно), то при плохом соединении просто всё отваливается по таймауту, когда сайт толстый.

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

    Сейчас порой в интернет не хочется заходить со смартфона, ибо тормозит половина сайтов, гораздо проще получается прочитать тот же контент в каких-то чатах или каналах телеграм, там всё это же намного быстрее загружается и отображается. Просто все привыкли, что у всех 100 мегабит и комп 8 ядер и 16ГБ оперативки. Разработчикам (или скорее тестировщикам) нужно выдавать для проверки ВМ с одним ядром и 1 гигом памяти, и полосу в 256кбит. Хотя кого я обманываю - в половине случаев никакого тестирования не делают толком! (а, на пользователях и потестим :)


    1. makkarpov
      27.08.2022 22:36
      +3

      Майкрософт ком страничка в 150 МБ - как это?

      Понимаю, что для демонстрации современного бездуховного мира все средства хороши, но можно ли воочию это увидеть?

      Hidden text


      1. AVX
        27.08.2022 22:55

        Я эту цифру запомнил с тех времён, сейчас не проверял, каюсь. Может изменилось уже.


      1. psydvl
        28.08.2022 02:43
        +1

        Было бы неплохо отключить ещё всякие блокировщики и выключить кеш (галочка сверху) и, возможно, запускать вне России, чтоб фейсбук всё смог загрузить

        Получится хоть и немного, но больше


        1. makkarpov
          28.08.2022 09:25
          +1

          Это была чистая загрузка через Ctrl+F5 с чешского адреса (на что намекает cs-cz в заголовке).

          Убирание uBlock ничего особо не меняет, было 812kB + 2.8MB, стало 829kB + 2.8MB


        1. pae174
          28.08.2022 15:11

          Получится хоть и немного, но больше

          Неа. 2.8 мегабайта в разжатом виде на всё - хомяк, все стили, скрипты и прочее (всего 80 запросов). Чистая установка Firefox на чистой машине c Win10, Амстердам.


  1. cepera_ang
    27.08.2022 18:29
    +1

    Хорошая цель, уложиться в десять пакетов в мире, где 14 мегабайт на сайте никто не заметит, лол.


  1. Crimento
    27.08.2022 21:49
    +2

    А если у меня интранет и Jumbo Frame везде настроены, можно до 89 кб расшириться? :)


    1. nuclight
      28.08.2022 05:57

      Нет. Оно задано в байтах. Точнее,


               min (10*MSS, max (2*MSS, 14600))                            (1)

      (с) RFC 6928


      где MSS — размер пакета за вычетом заголовков (1460 в случае 1500).


  1. doomguy49
    28.08.2022 01:21

    Краткое содержание статьи: лучше – меньше, а ещё вот есть такая константа, равная 14kb

    Это, конечно, замечательно, что существует такая константа, но к чему она вообще, если ничто не влезет в неё?


  1. vasyash
    28.08.2022 10:07

    Размер окна разве не во время хэндшейка определяется?

    Хэндшейк, а потом только передача http. Мне кажется задержка появляется из-за фрагрментации кадров на промежуточных узлах