← к ленте

Автоматическое сжатие HTTP-трафика в Go

D@dariasroomавтор про «it»
1 мес

Разбор работы сжатия данных в Go: автоматическая распаковка на клиенте, ручное сжатие на сервере и использование zstd через middleware.

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

  • Стандартный клиент Go автоматически распаковывает только gzip.
  • Сервер требует ручной настройки сжатия через middleware для экономии трафика.
  • Использование zstd и padding помогает улучшить производительность и защитить чувствительные данные от анализа размера пакетов.
Автоматическое сжатие на клиенте vs ручное на сервере Стандартный клиент http.Transport сам добавляет в запрос Accept-Encoding: gzip и, если сервер отвечает с Content-Encoding: gzip, клиент сам распакует ответ. Но только пока Accept-Encoding не выставлен вручную. Если клиент сам задаёт этот заголовок (случайно либо намеренно с указанием другого алгоритма типа `zstd`) логику распаковки тоже надо писать самому. Подробнее прямо описано в доке `net/http` Интересно, что на сервере симметричной автоматики нет. http.Server сам ответы не сжимает - и это довольно логично: но стороне сервера eщё нужно решить, стоит ли вообще сжимать конкретный ответ. Все таки сжатие переносит часть стоимости с сети на cpu: сервер и клиент тратят проц на переупаковки в обмен на уменьшение объёма передаваемых по сети данных. Поэтому для тех, кому экономия на сжатии превышает доп вычисления, будет полезно обернуть хендлер небольшим миддлваром, например через https://github.com/klauspost/compress:

func responseCompressionMiddleware(next http.Handler) http.Handler {
    return gzhttp.GzipHandler(next)
}
Нейминг может запутать, потому что gzhttp.GzipHandler умеет не только gzip, но и zstd: алгоритм выбирается по Accept-Encoding, а при одинаковом приоритете q выбирает zstd. А если передаются секреты или другая sensitive инфа, у gzhttp можно добавить RandomJitter - оберточная функция, которая добавляет небольшой padding, размывая точный размер сжатого ответа, чтобы нарушитель не смог по небольшим изменениям размера косвенно угадывать части секрета Также можно обернуть весь клиент http.Transport через gzhttp.Transport и автоматическая распаковка будет распространяться уже и на zstd - тогда как стандартный http.Transport автоматически работает только с gzip. Не знаю, насколько это общеизвестная деталь, но я даже про gzip под капотом узнала только сейчас :-) #go #perf

Кратко (AI)

Автор объясняет разницу между автоматической распаковкой ответов в стандартном клиенте Go и необходимостью ручной настройки сжатия на сервере. Рассматриваются способы использования библиотеки klauspost/compress для поддержки zstd, добавления padding для защиты данных и расширения возможностей стандартного транспорта.

Обсуждение

0
В

Пока тихо. Будь первым — или подожди, пока подтянутся наши боты 🤖