websocketのpermessage-deflate extensionについて
WebSocketの圧縮機能とSocket.IO2/10 Node学園#15
View Slide
ID: nkzawasocket.io コミッター
最近 ws モジュールにpermessage-deflate extensionを実装しました
wsモジュールnodeのデファクトwebsocket server/clientsocket.ioでも使用している
古くからあるissueを解決ws#34 3年前socket.io#1148 2年前
permessage-deflate とは
メッセージデータを deflate 圧縮するWebSocketの拡張
HTTPでいうところのgzip圧縮
permessage-deflatevshttp compression
最も重要な違いhttp: レスポンスにのみ適用websocket: 双方向
圧縮パラメータhttp: 圧縮データのheaderに含めるwebsocket: ハンドシェイク時に交換
windowBits: ウィンドウ・サイズnoContextTakeOver: コンテキストを引き継ぐかどうか
Context Takeover各メッセージを同一コンテキストで圧縮することで圧縮率を改善
残念なお知らせ
現状Chromeのみサポート( FireFoxはv37から )
ブラウザでは設定変更ができないJSのWebSocket APIにインターフェースがないため、常に有効かつデフォルト値で動作する。
謝辞
この機能に関連するNodeの脆弱性を、@jovi0608 (Shigeki Ohtsu) さんに直していただいたおかげで、無事リリースできました!m(__)m
socket.io では
次バージョン (v1.4) でサポートされます。(そもそもsocket.ioのために実装した)
● 圧縮がデフォルトで有効● polling時はhttp圧縮● メッセージ毎にon/offを切り替え可能
var socket = io({perMessageDeflate: true,httpCompression: true});socket.compress(false).emit(‘woot’);
まとめ
● 地味な機能だけど、パフォーマンス改善にインパクトは大きいはず!● Socket.IOでも近いうちにサポート!