2017-06-03 188 views
0

我具有接收壓縮數據的node.js WS的WebSocket。node.js ws permessagedeflate zlib解壓縮和pako的區別?

該文檔是關於充氣機構很淺,但通過從源文件中讀出它顯然是內置,並應根據所接收的數據的類型被自動激活。

然而,附加ws.on('message',function(data){})事件,當它返回一個<Buffer>

因爲我知道,那些流擁有PAKO以前充氣,我試圖安裝它,它實際上是使用下面的代碼工作:

pako.inflate(data, { to: 'string' }) 

從我的理解這兩個模塊使用zlib壓縮,但WS模塊莫名其妙地懷念它。

有人能給出一個合理的解釋,或者至少一個假設,爲什麼?

+0

是發送者明確地壓縮?換句話說,它使用'pako.deflate(...)'(或類似的東西)? – robertklep

+0

這不幸我不知道,但很有可能。 – Anonymous

回答

2

ws支持的是一個特殊的WebSocket擴展名爲「permessage-deflate」

此擴展在RFC 7692中有記錄,並且由於它是協議的擴展,所以它是底層WS協議實現(服務器和客戶端)需要支持的東西(有一個握手過程,客戶端和服務器嘗試以確定另一方是否支持它,並且發送方設置特定幀標誌以通知接收方該幀已被壓縮)。

一旦它的激活,這是相對透明的,並且框架(解)壓縮是由協議驅動程序自動處理。

就你而言,聽起來好像在WebSocket的頂部添加了一個明確的壓縮/解壓縮階段,發送者顯式壓縮數據(而不是WS幀本身),並且接收者需要明確解壓縮,這基本上你已經發現:收到的消息是一個(壓縮)緩衝區,你需要明確地解壓縮它。

所以它不是ws已經錯過了什麼,它只是對在生WS幀(上面層(DE)壓縮正在發生,如果在「permessage-放氣」擴展是積極的,能導致數據被壓縮和解壓兩次:一次通過用戶代碼,一次通過協議代碼)。