zstd(Zstandard)でウェブ通信を効率よく圧縮する
zstd(Zstandard)はMetaが開発した可逆圧縮アルゴリズムです。高い圧縮率と高速な展開速度を持ち、Baseline 2026でブラウザの通信でも利用できるようになりました。
はじめに
レスポンスボディは、Accept-EncodingリクエストヘッダーとContent-Encodingレスポンスヘッダーを使って圧縮できます。
Accept-Encoding
Accept-Encodingはリクエストヘッダーで、クライアントが対応している圧縮形式をサーバーに伝えます。
Accept-Encoding: gzip, deflate, br
カンマ区切りで複数の圧縮形式を指定できます。また、qパラメータで各形式の優先度(0〜1)を指定することもできます。
Accept-Encoding: gzip;q=0.8, br;q=1.0
優先度を指定しない場合は1.0として扱われます。q=0は「受け入れない」を意味します。
Content-Encoding
Content-Encodingはレスポンスヘッダーで、サーバーが実際に適用した圧縮形式をクライアントに伝えます。
Content-Encoding: br
クライアントはこのヘッダーを見て、適切な方法でレスポンスボディを展開します。
なお、サーバーが圧縮に対応していない場合や、クライアントが送ったAccept-Encodingの中に対応形式がなかった場合は、Content-Encodingヘッダーなしで非圧縮のまま返されます。
ただし、identity;q=0等で非圧縮も明示的に拒否している場合は、406 Not Acceptableが返されます。
zstdはこの仕組みに乗っかる形で、Baseline 2026で新たに加わった圧縮形式です。
zstd
zstd(Zstandard)はMetaが開発した可逆圧縮アルゴリズムで、RFC 8878で標準化されています。
zlibレベルの圧縮率を保ちつつリアルタイム圧縮が可能なことを目標に設計されています。
ベンチマークによれば、gzip(zlib)を上回る圧縮率を誇り、Brotliと同等のサイズを維持しながら、数倍速い展開速度を実現しています。
これにより、クライアント側のCPU負荷を抑えつつ高速なページロードが可能です。
また、圧縮速度と圧縮率はトレードオフの関係にありますが、圧縮レベルを細かく調整することでそのバランスを柔軟に変えられます。
ブラウザでの利用
Baseline 2026に加わったことで、主要なブラウザでzstdが利用できるようになりました。
対応したブラウザでは、Accept-Encodingヘッダーにzstdが自動的に追加されます。
Accept-Encoding: gzip, deflate, br, zstd
サーバーがzstd圧縮に対応している場合、Content-Encoding: zstdヘッダーとともにzstd圧縮されたレスポンスを返します。
Content-Encoding: zstd
実際にzstdに対応したブラウザでこのページの通信を確認すると、Content-Encoding: zstdでレスポンスが返ってきていることがわかります。
このサイトはVercelで配信しており、アプリ側で特別な設定をしなくても、Vercelのエッジネットワークがzstdをサポートしているため自動的に有効になっています。
圧縮辞書転送
zstdはさらに、圧縮辞書を用いた圧縮辞書転送(RFC 9842)にも対応しています。
通常の圧縮はレスポンス内の冗長性を検出して圧縮しますが、圧縮辞書転送ではあらかじめ用意した辞書を参照することで、さらに効率的な圧縮が可能です。
たとえば、ライブラリの旧バージョンを辞書として使うと、新バージョンとの差分だけを圧縮して転送できるため、転送サイズを大幅に削減できます。
辞書圧縮が利用可能な場合は Accept-Encoding に dcz(dictionary-compressed Zstandard)が追加されます。
Accept-Encoding: gzip, br, zstd, dcb, dcz
Available-Dictionary: :pZGm1Av0IEBKARczz7exkNYsZb8LzaMrV7J32a2fFG4=:
Available-Dictionaryは保持している辞書の識別子を伝えます。dczの他にdcb(dictionary-compressed Brotli)もあります。
現時点ではまだ Baseline には達していませんが、今後対応が広がることが期待されます。
おわりに
zstdがBaseline 2026で追加され、gzip・Brotliに並ぶ圧縮形式の選択肢として使えるようになりました。
ブラウザ側での対応は自動で行われるため、サーバー側でzstd圧縮を有効化するだけで恩恵を受けられます。高い圧縮率と展開速度を兼ね備えたzstdへの対応を検討してみてください。