SDCH - Общий словарь сжатия в HTTP 
Дмитрий Маркович
Дмитрий Маркович 
LinkedIn Engineering, Traffic Team
Случайность 
Каждый день мы что-то ищем в Google... 
Request URL: 
https://www.google.com/s?output=search... 
accept-encoding: gzip, deflate, sdch 
Response: 
content-encoding: gzip 
get-dictionary: /sdch/j_fzWU8F.dct 
Bootstrapping
Request URL: 
accept-encoding: gzip, deflate, sdch 
avail-dictionary: j_fzWU8F 
Response: 
content-encoding: gzip 
content-encoding: sdch 
Normal SDCH Request
Проверка 
Без SDCH…
Проверка 
…и с SDCH 
Вроде бы особой разницы нет?
Но все-таки интересно - копаем дальше... 
get-dictionary: 
/sdch/j_fzWU8F.dct 
Словарь?
Теперь когда совсем интересно 
SDCH протокол впервые был предложен в 2008 году (Velocity 2008 Web Performance and Operations Conference). 
Цель протокола сжать HTTP ответы и таким образом улучшить производительность у пользователей с небольшой скоростью интернета.
Уменьшение времени передачи данных 
• 
Уменьшение размера это ключ к успеху 
• 
Gzip работает хорошо для сжатия индивидуальных ответов 
• 
Как насчет общих данных, которые присутствуют во всех ответах? 
• 
Передавать общие данные только 1 раз и пересылать только различные части ответа
Взгляд на LinkedIn
Но ведь уже есть RFC3229 - Delta сжатие в HTTP? 
• 
Применимо только для одинаковых путей, что делает невозможным какое-то кеширование
Как бы проверить, что это даст в рамках инфраструктуры LinkedIn 
Генерирует словари для статического контента 
1 
Оповещает о словарях поддерживающие клиенты через HTTP заголовки 
2 
Скачивает и хранит словари 
3 
При последующем запросе оповещает что словарь уже скачан 
4 
Кодирует содержимое ответа ч-з SDCH используя словарь и уменьшает передаваемый размер 
5 
Принимает и декодирует 
6
Какие браузеры? 
Google Chrome (версия 38+) 
Yandex Browser
Начинаем разбираться. Что положить в словарь? 
Данные словаря находятся в публичном доступе поэтому берем все публичные сss и js файлы.
Собираем словарь 
Как обычно с первого раза не работает :). Немного исправляем и что мы видим... 
https://github.com/gtoubassi/femtozip 
Библиотека для сборки словаря 
FemtoZip
Хеш словаря
Хеш в теле ответа
Детальная метаданных словаря 
Детальная метаданных словаря dictionary-metadata = 1#dictionary-header "n" dictionary-header = "domain" ":" value "n" | "path" ":" value "n" | "format-version" ":" value "n" | "max-age" ":" value "n" | "port" ":" <"> portlist <"> "n" portlist = 1#portnum portnum = 1*DIGIT 
Полный словарь 
dictionary-definition = dictionary-metadata payload
Пример словаря CSS
Вроде бы все отлично, но генерация словаря занимает довольно большое время ~10 часов.
ATS plugin 
Что он должен делать 
•определять что клиент поддерживает SDCH; 
•предлагать клиенту скачать словарь; 
•кодировать ответ согласно имеющемуся словарю;
Кодировка 
для этого Google выбрал уже стандартизированный VCDIFF протокол. 
http://code.google.com/p/open-vcdiff/ 
OPEN-VCDIFF 
библиотека для кодировки и раскодировки для VCDIFF (RFC3284) формата
Кодирование VCDIFF 
Замена длинных общих строк короткими инструкциями, необходимыми для клиента чтобы восстановить данные используя словарь.
Кодировка 
Кодировка 
vcdiff encode -dictionary file.dict < target_file > delta_file 
Раскодировка 
vcdiff decode -dictionary file.dict < delta_file > target
Примеры для трех файлов 
abook_remarketing_base_promo_en_US.css: 
on disk: 4198 bytes 
on wire: 809 bytes 
registration_subs_upsell_en_US.css: 
on disk: 9189 bytes 
on wire: 3220 bytes 
footer_en_US.css: 
on disk: 1941 bytes 
on wire: 1245 bytes
Примеры сжатия 
Процент сжатия 
Маленькие файлы могут стать больше из-за кодирования
Примеры сжатия 
Процент сжатия 
В этом графике убраны файлы у которых размер уменьшился меньше чем на 5 байт
Чем больше файл тем лучше он сжимается.
Что делать с данными которые плохо сжимаются?
Кеширование, CDN 
Требования: 
должен уметь поддерживать пользовательский Vary хидер и различать элементы по нему. 
Для SDCH это: 
Vary: Avail-Dictionary 
RESPONSE 
content-encoding: gzip 
content-encoding: sdch 
vary: avail-dictionary
Кеширование, CDN 
Требования: 
не должен убирать SDCH значение из Accept- Encoding хидера (Akamai) 
accept-encoding: gzip, deflate, sdch
Как часто обновлять словарь 
Кеширование на короткий период, задержки для деплоймента 
Кеширование, словарь все еще актуальный
Новый словарь 
Возвращаем 
get-dictionary: /sdch/j_fzWU8F.dct 
и браузер скачивает его в оффлайн режиме
Безопасность 
1. 
Словарь хэшируется как на клиенте, так и на сервере 
2. 
Словарь действителен только для указанного домена и пути
Что нужно знать о Proxy и Firewall 
• 
Распространение нежелательного контента через словарь 
• 
Невозможность раскодировать словарь для проверки безопасности контента 
• 
Замена контента в закодированном SDCH ответе делает его не валидным
Словарь и ответ могут не содержать опасного контента, но раскодируемый результат?
Решение 
1. Вырезать sdch из Accept-Encoding хидера :) 
2. Реализовать sdch протокол (сложно, долго, затратно). 
2.1 Производительность, для наших файлов ~400 
микросекунд
Загрузка сервера
SDCH компрессия доступна для CSS LinkedIn файлов
Наши результаты 
• 
В среднем на 30% уменьшился размер передаваемых данных относительно Gzip. 
• 
Только файлы маленького размера проиграли относительно Gzip. 
• 
Уменьшилось время загрузки страниц, особенно в регионах с небольшой скоростью интернета. 
• 
Чем больше веб ресурс (чем больше файлов участвует в формировании словаря), тем лучше работает эта технология.
Спасибо за внимание! 
dmarkovi@linkedin.com 
We are hiring!

SDCH, или новые подходы к увеличению производительности, Дмитрий Маркович (LinkedIn)

  • 1.
    SDCH - Общийсловарь сжатия в HTTP Дмитрий Маркович
  • 2.
  • 3.
    Случайность Каждый деньмы что-то ищем в Google... Request URL: https://www.google.com/s?output=search... accept-encoding: gzip, deflate, sdch Response: content-encoding: gzip get-dictionary: /sdch/j_fzWU8F.dct Bootstrapping
  • 4.
    Request URL: accept-encoding:gzip, deflate, sdch avail-dictionary: j_fzWU8F Response: content-encoding: gzip content-encoding: sdch Normal SDCH Request
  • 5.
  • 6.
    Проверка …и сSDCH Вроде бы особой разницы нет?
  • 7.
    Но все-таки интересно- копаем дальше... get-dictionary: /sdch/j_fzWU8F.dct Словарь?
  • 8.
    Теперь когда совсеминтересно SDCH протокол впервые был предложен в 2008 году (Velocity 2008 Web Performance and Operations Conference). Цель протокола сжать HTTP ответы и таким образом улучшить производительность у пользователей с небольшой скоростью интернета.
  • 9.
    Уменьшение времени передачиданных • Уменьшение размера это ключ к успеху • Gzip работает хорошо для сжатия индивидуальных ответов • Как насчет общих данных, которые присутствуют во всех ответах? • Передавать общие данные только 1 раз и пересылать только различные части ответа
  • 10.
  • 11.
    Но ведь ужеесть RFC3229 - Delta сжатие в HTTP? • Применимо только для одинаковых путей, что делает невозможным какое-то кеширование
  • 12.
    Как бы проверить,что это даст в рамках инфраструктуры LinkedIn Генерирует словари для статического контента 1 Оповещает о словарях поддерживающие клиенты через HTTP заголовки 2 Скачивает и хранит словари 3 При последующем запросе оповещает что словарь уже скачан 4 Кодирует содержимое ответа ч-з SDCH используя словарь и уменьшает передаваемый размер 5 Принимает и декодирует 6
  • 13.
    Какие браузеры? GoogleChrome (версия 38+) Yandex Browser
  • 14.
    Начинаем разбираться. Чтоположить в словарь? Данные словаря находятся в публичном доступе поэтому берем все публичные сss и js файлы.
  • 15.
    Собираем словарь Какобычно с первого раза не работает :). Немного исправляем и что мы видим... https://github.com/gtoubassi/femtozip Библиотека для сборки словаря FemtoZip
  • 16.
  • 17.
    Хеш в телеответа
  • 18.
    Детальная метаданных словаря Детальная метаданных словаря dictionary-metadata = 1#dictionary-header "n" dictionary-header = "domain" ":" value "n" | "path" ":" value "n" | "format-version" ":" value "n" | "max-age" ":" value "n" | "port" ":" <"> portlist <"> "n" portlist = 1#portnum portnum = 1*DIGIT Полный словарь dictionary-definition = dictionary-metadata payload
  • 19.
  • 20.
    Вроде бы всеотлично, но генерация словаря занимает довольно большое время ~10 часов.
  • 21.
    ATS plugin Чтоон должен делать •определять что клиент поддерживает SDCH; •предлагать клиенту скачать словарь; •кодировать ответ согласно имеющемуся словарю;
  • 22.
    Кодировка для этогоGoogle выбрал уже стандартизированный VCDIFF протокол. http://code.google.com/p/open-vcdiff/ OPEN-VCDIFF библиотека для кодировки и раскодировки для VCDIFF (RFC3284) формата
  • 23.
    Кодирование VCDIFF Заменадлинных общих строк короткими инструкциями, необходимыми для клиента чтобы восстановить данные используя словарь.
  • 24.
    Кодировка Кодировка vcdiffencode -dictionary file.dict < target_file > delta_file Раскодировка vcdiff decode -dictionary file.dict < delta_file > target
  • 25.
    Примеры для трехфайлов abook_remarketing_base_promo_en_US.css: on disk: 4198 bytes on wire: 809 bytes registration_subs_upsell_en_US.css: on disk: 9189 bytes on wire: 3220 bytes footer_en_US.css: on disk: 1941 bytes on wire: 1245 bytes
  • 26.
    Примеры сжатия Процентсжатия Маленькие файлы могут стать больше из-за кодирования
  • 27.
    Примеры сжатия Процентсжатия В этом графике убраны файлы у которых размер уменьшился меньше чем на 5 байт
  • 28.
    Чем больше файлтем лучше он сжимается.
  • 29.
    Что делать сданными которые плохо сжимаются?
  • 30.
    Кеширование, CDN Требования: должен уметь поддерживать пользовательский Vary хидер и различать элементы по нему. Для SDCH это: Vary: Avail-Dictionary RESPONSE content-encoding: gzip content-encoding: sdch vary: avail-dictionary
  • 31.
    Кеширование, CDN Требования: не должен убирать SDCH значение из Accept- Encoding хидера (Akamai) accept-encoding: gzip, deflate, sdch
  • 32.
    Как часто обновлятьсловарь Кеширование на короткий период, задержки для деплоймента Кеширование, словарь все еще актуальный
  • 33.
    Новый словарь Возвращаем get-dictionary: /sdch/j_fzWU8F.dct и браузер скачивает его в оффлайн режиме
  • 34.
    Безопасность 1. Словарьхэшируется как на клиенте, так и на сервере 2. Словарь действителен только для указанного домена и пути
  • 35.
    Что нужно знатьо Proxy и Firewall • Распространение нежелательного контента через словарь • Невозможность раскодировать словарь для проверки безопасности контента • Замена контента в закодированном SDCH ответе делает его не валидным
  • 36.
    Словарь и ответмогут не содержать опасного контента, но раскодируемый результат?
  • 37.
    Решение 1. Вырезатьsdch из Accept-Encoding хидера :) 2. Реализовать sdch протокол (сложно, долго, затратно). 2.1 Производительность, для наших файлов ~400 микросекунд
  • 38.
  • 39.
    SDCH компрессия доступнадля CSS LinkedIn файлов
  • 40.
    Наши результаты • В среднем на 30% уменьшился размер передаваемых данных относительно Gzip. • Только файлы маленького размера проиграли относительно Gzip. • Уменьшилось время загрузки страниц, особенно в регионах с небольшой скоростью интернета. • Чем больше веб ресурс (чем больше файлов участвует в формировании словаря), тем лучше работает эта технология.
  • 41.
    Спасибо за внимание! dmarkovi@linkedin.com We are hiring!