国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ZIP 也能邊下載邊解壓?流式解壓技術揭秘!

開發 開發工具
對于一個 ZIP 文件,由于標準的解壓方式總是從讀取文件的末尾開始的,因此必須下載完整個 ZIP 解壓后才能訪問。

 ????對于一個 ZIP 文件,由于標準的解壓方式總是從讀取文件的末尾開始的,因此必須下載完整個 ZIP 解壓后才能訪問。當用戶通過網絡訪問 ZIP 文件時,下載解壓所帶來的耗時將大大降低用戶體驗。那么能不能邊下載邊解壓呢?阿里巴巴文娛技術 喻遠將介紹 ZIP 流式解壓的原理和技術實現路徑。

打開網絡上的 ZIP 文件需要幾步?下載,解壓,拿到所有文件。面對一個 ZIP,能不能「邊下邊播」、「按需下載」?

今年 6 月,優酷繪本技術團隊開發出新的解壓方式——ZIP 流式解壓技術,并成功應用在優酷繪本秒開項目中,30M+ 繪本平均加載時長只需 0.91s,加載耗時比傳統的解壓方式降低了 88.3%,讓用戶的閱讀體驗直線提升。實際對比效果如下:

??

??

 

優化前

??

[[341409]]

??

 

優化后

本文將介紹 ZIP 流式解壓的原理和技術實現路徑,希望為大家帶來啟發,將 ZIP 流式解壓技術更多的應用到業務中。

一 什么是ZIP

ZIP 是一種文件格式,定義了如何將多個文件、數據塊組織在一起形成一個完整的文件。例如我們常見的 .apk,.ipa,.sketch,都是ZIP文件。通常程序是這樣創建 ZIP 文件的:

壓縮單個文件形成單文件數據塊;

在數據塊前后添加文件描述信息;

對每個待壓縮的文件重復以上步驟后,拼接所有數據形成更大的數據塊;

提取所有文件描述信息,生成一份「文件目錄」,附在最后一個數據塊的尾部。

我們將文件前部描述信息稱為 Local File Header,文件后部描述信息稱為 Data Descriptor, 被壓縮的文件本身稱為 File Data,將最后的文件目錄稱為 Central Directory。以上所有合在一起,就是一個標準的 ZIP 文件。如下圖:

??

??

 

ZIP 文件格式

一個標準的解壓方式總是從讀取 ZIP 文件末尾開始的,我們以解壓上圖的 File Data 1 為例:

??

??

 

首先在 ZIP 文件末尾找到 Central Directory 數據塊;

在 Central Directory 數據塊中找到 File Header 1;

從 File Header 1 中讀取 Local File Header 1 的偏移量和 File Data 1 的相關信息;

根據偏移量找到 Local File Header 1;

讀取 Local File Header 1;

解密 File Data 1(如果需要);

解壓 File Data 1;

讀取 Data Descriptor 1;

使用 File Header 1 中保存的 CRC-32 做校驗步驟 7 中計算的 CRC-32,以確保解壓后的數據完整性。

標準解壓方式存在的不足

可以發現,標準的解壓強依賴尾部的 Central Directory。當 ZIP 文件存儲在 cdn 上時,哪怕我們只想訪問其中的一個文件,也必須下載整個 ZIP 解壓后才可訪問。假如 ZIP 文件有 100 MB,但是我們只需要訪問其中的某一個 10 KB 的文件,那么下載整個 ZIP 將是對流量的巨大浪費。

二 優酷技術方案:ZIP流式解壓

我們的一個初步的想法是能不能邊下載邊解壓?

要實現這點,首先需要改變解壓方式,使其不能再依賴尾部的 Central Directory。

根據 ZIP 文件格式標準可知,除了 Central Directory,每個 File Data 頭部的 Loca File Header 部分也包含了該文件的相關信息。

假如 Local File Header 中包含了充分的信息,我們也許可以基于 Local File Header 去解壓文件數據,其解壓流程就可以變為:

??

??

 

從頭開始,搜索到 Local File Header 1;

讀取 Local File Header 1;

解密 File Data 1(如果需要);

解壓 File Data 1;

讀取 Data Descriptor 1;

CRC32 的校驗。

那么 Local File Header 里到底存儲了什么?是否滿足解密解壓所需?

了解 Local File Header

我們根據文檔對 Local File Header 的描述,畫出其二進制文件中的排列:

??

??

 

Local File Header 數據結構

其中的關鍵信息為:

Signature

元數據簽名

Compress Method

壓縮算法

Compressed Size

壓縮后文件大小

Uncompressed Size

壓縮前文件大小

CRC-32

文件的循環冗余校驗值

File name

文件名

元數據簽名是一個 Magic Number,用來標記接下來數據是什么內容。例如 Local File Header 的簽名是 0x04034b50,用 char 表示也就是 { 'P', 'K', '3', '4' }。當讀取到對應數據簽名時,則意味著接下來的數據結構符合對應元數據的定義,需要使用對應規則解析。

Compress Method 指明數據塊用何種算法壓縮,解壓需要使用對應的算法。

Compressed Size 和 UnCompressed Size可以幫助確定文件的結尾地址和 Data Descriptor 的偏移量。這兩個 Size 也是文件解密時 HMAC 計算的關鍵。

有了 Magic Number 作為元數據簽名,我們只需要逐字節遍歷去匹配這個 Number,就可以找到 Loca File Header,而不再需要依賴尾部的定位信息。而且 Local File Header 中存儲的元數據足夠我們決定解壓算法、計算大小、校驗 CRC-32 了。

還有一個問題是,解壓縮算法是否支持流式解壓縮?是否有特定的上下文依賴?通過了解壓縮算法的原理[1],我們知道,所有的壓縮算法都是支持從頭部開始流式解壓的。

而下載方面,文件是以從頭到尾連續的方式下載,這又天然地和和從頭解壓的方式配合,便可以初步實現邊下邊解!

加密 ZIP 文件的問題

一切都相當順利,直到遇到了加密后的 ZIP 文件。加密后的 ZIP 文件的 Local File Header 中的關鍵信息除了簽名和文件名以外,其他信息都被隱去,需要去 Central Directory 中讀取。

再一次,我們回到了依賴 Central Directory 的狀態。

在失去如此多關鍵信息的情況下能否繼續做到流式解壓?我們需要先挖掘一下 ZIP 的加密方式。

ZIP 的加密方式

ZIP 文件支持多種加密方式,最常見的是 Traditional PKWARE Encryption 和 AES Encryption 。

Traditional PKWARE Encryption 是 ZIP 自定義的一種基于密碼的對稱加密方式,每個字節的加密僅和密碼有關,加密前后的數據長度不變。這種不依賴上下文的加密方式可以實現我們需要的流式解密。

AES 加密采用的是 CTR 模式。CTR 模式將明文分組,并生成一個計數器。使用密鑰對計數器進行加密生成二進制字節流。利用這個字節流和明文進行 XOR 操作進行加密。其解密方式也是一樣的。

這種方式也支持流式解密。

??

??

 

兩種常用的加密方式都支持流式解密,那么加解密需要的關鍵信息,在 Local File Header 中是否有存儲就成了能否流式解密的關鍵。

流式解密的關鍵信息

無論是 Traditional PKWARE Encryption 還是 AES Encryption,在解密時都需要一些除密碼之外的關鍵信息,例如鹽值,加密算法的強度等。此外,在 AES 加密的 ZIP 文件中, Local File Header 中的 Compress Method 字段被抹去,這樣我們便無法知曉壓縮算法,因此無法解壓。

至此,問題集中為:

  • Local File Header 中是否有足夠的加密所需信息。
  • 加密的 ZIP 文件,是否能在除 Central Directory 以外的位置找到 Compress Method 字段。

Local File Header 中加密相關的信息

ZIP 格式的設計者在設計 ZIP 文件格式的初期就提供了文件拓展能力,一些額外的拓展數據可以存放在 Local File Header 的 Extra Field 中。ZIP AES 加密說明書[2]告訴我們 AES 的相關信息就存放在這里。其關鍵信息如下:

Signature

Extra Data 簽名(0x9901)

AES Encryption strength

AES 加密強度(128或192或256)

Actual compress Method

真正的壓縮算法

原來壓縮算法被藏到了 Extra Data 中。那么鹽值被存放在哪里了?答案是存放在 File Data 的頭尾。

??

??

 

綜上,我們找到解密所需的所有關鍵信息,整個流式解密解壓的所有技術點都被我們探索完。剩下的便是按原理實現,以及細節的打磨。

三 總結

說了那么多,流式解壓究竟有什么價值呢?

由于流式解壓實現了邊下載邊解壓,將整個操作的時長從下載 + 解壓縮變成了約等于純下載的時長,直接抹掉了解壓的耗時。在 39.1 MB 大小的 ZIP 包下載解壓測試中,耗時從 9.08 秒降低至 4.17 秒,有將近 100% 的提速!同時,你可以不必等待整個 ZIP 下載解壓完,而是在解壓完一小部分數據的時候,就直接展示 UI。用戶側看起來就好像一瞬間就解壓完了。

因此,流式解壓可以應用在許多時間敏感的操作里,也可以用來優化基于 ZIP 文件的相關業務。例如基于 ZIP 的全局換膚加速、基于 ZIP 的 Web 資源緩存加載的加速等等。前言中的優酷繪本秒開就是基于這一技術實現。

參考

[1]https://houbb.github.io/2018/11/09/althgorim-compress-althgorim-12-zip-02[2]AES Encryption Information: Encryption Specification AE-1 and AE-2https://www.winzip.com/win/en/aes_info.html[3]ZIP File Format Specificationhttps://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.1.TXT[4]AES Coding Tips for Developershttps://www.winzip.com/win/en/aes_tips.html

【本文為51CTO專欄作者“阿里巴巴官方技術”原創稿件,轉載請聯系原作者】

??戳這里,看該作者更多好文??

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2015-04-08 15:40:53

php在線解壓解壓zip文件

2021-05-08 00:00:27

JavaScript ZIP文件

2024-01-04 12:47:00

Linux命令工具

2018-02-28 13:20:40

Python解壓zip

2021-12-10 15:22:26

Go Zip 文件

2019-10-17 17:15:01

Linux解壓文件命令

2009-12-30 16:46:09

Ubuntu orac

2011-12-30 11:14:41

Javazip

2011-08-15 14:07:53

Objective-C解壓縮ZIP文件

2012-12-26 09:31:44

C#Winform

2012-05-10 09:43:28

2024-04-01 00:05:00

ChatGPTSSE

2021-01-03 09:44:34

解壓軟件解壓神器應用

2010-01-04 10:36:34

ubuntu Json

2010-01-08 14:13:14

Ubuntu 8.10

2010-01-07 16:47:01

2024-01-19 16:37:17

Linux操作系統

2010-01-07 16:34:08

Ubuntu apac

2016-03-04 09:42:12

無線技術WiFi

2010-12-01 11:44:56

IT從業者
點贊
收藏

51CTO技術棧公眾號

亚洲mv在线看| 日韩极品一区| 亚洲аv电影天堂网| 污的网站在线观看| 精品久久久网站| 校园春色亚洲| 久久中文字幕在线视频| 一区二区三区四区高清视频| 欧美一区第一页| 欧美激情麻豆| 日韩精品一区二区三区丰满| 韩国毛片一区二区三区| 少妇无码av无码专区在线观看| 欧美激情综合五月色丁香小说| 福利在线免费| 欧美精品色一区二区三区| 黄频免费在线观看| 欧美高清在线播放| 亚洲成av人电影| 在线免费观看成人| 亚洲国产高清在线| 可以在线观看的黄色| 亚洲精品在线三区| jazzjazz国产精品久久| 99久久无色码| 成人做爰69片免费看网站| 91福利免费| 在线播放日韩导航| 欧美在线va视频| 免费av在线一区二区| 免费国产亚洲视频| 四虎永久免费网站| 成人免费观看av| 亚洲福利av| 精品午夜一区二区三区在线观看| 555www成人网| 成人18视频在线观看| 色婷婷综合久色| 精品3atv在线视频| 国产精品白嫩美女在线观看| 美女诱惑黄网站一区| 美女一区二区三区视频| 这里是久久伊人| 高清日韩欧美| 亚洲色图自拍| 亚洲国产成人av好男人在线观看| 99爱在线视频| 国产综合香蕉五月婷在线| 国产盗摄视频一区二区三区| 最色在线观看| 精品国产一区二区三区久久狼黑人| 91精品天堂福利在线观看| 国产精品国产亚洲精品看不卡| 欧美专区在线观看一区| 盗摄牛牛av影视一区二区| 天天综合狠狠精品| 日韩欧美中文在线| 偷拍精品福利视频导航| 欧美成人精品福利| 欧美xxxx性xxxxx高清| 国产一区二区三区在线观看网站| 四虎成人精品一区二区免费网站| 精品久久久香蕉免费精品视频| 9999精品成人免费毛片在线看| 国产欧美日韩高清| 久久天天做天天爱综合色| 久久日韩视频| 国产欧美一区二区三区视频 | 日韩精品视频在线观看一区二区三区| 日韩三级免费| 亚洲日本丝袜连裤袜办公室| 欧美色另类天堂2015| 国产美女视频黄a视频免费| 亚洲欧洲成人自拍| 三上悠亚在线观看二区| 精品欧美一区二区在线观看| av在线播放网| 欧美激情一区二区久久久| 你懂的视频在线| 97视频com| 精品国产乱码久久久久久免费 | aaa国产精品视频| www国产黄色| 亚洲国产精品网站| 国产清纯白嫩初高生在线观看91| freemovies性欧美| 欧美最猛性xxxxx免费| 91福利在线免费观看| 中文精品一区二区| 亚洲午夜激情免费视频| 不卡日本视频| 福利视频一二区| 51精品久久久久久久蜜臀| 国产精品白浆| 99精品视频网站| 亚洲综合免费观看高清完整版在线| 黑人玩欧美人三根一起进| 国产精品丝袜久久久久久不卡| 丰满放荡岳乱妇91ww| 免费av在线网站| 国产成人综合av| 91色视频在线| 中文字幕影音在线| 欧美日韩一区在线视频| 色综合亚洲欧洲| 欧美日韩夜夜| 欧美在线观看成人| 精品国产三级a在线观看| 911精品美国片911久久久| 色婷婷亚洲十月十月色天| 亚洲视频axxx| 免费视频久久| 国自产拍在线网站网址视频| 欧美孕妇与黑人孕交| 久久天天做天天爱综合色| 粉嫩av一区二区三区四区五区 | 精品国产电影一区| 国产精品xxx在线观看| 日本手机在线视频| 亚洲欧洲日本专区| 狠狠色丁香久久婷婷综合丁香| 91最新在线| 国内一区二区在线视频观看| 亚洲1区2区3区4区| 水蜜桃久久夜色精品一区| av五月天在线| 欧美精品性视频| 久久久久久电影| 亚洲欧洲二区| www.日日操| 午夜精品福利视频| 亚洲免费观看高清完整版在线| 亚洲区小说区图片区qvod按摩| 国产高潮av| 91老司机在线| 在线观看91av| 韩日欧美一区二区三区| 日韩中文影院| 午夜激情福利在线| 欧美性在线视频| 亚洲一区二区三区四区的| av一区二区在线观看| www污污在线| 国模一区二区三区私拍视频| 欧美一级xxx| 国产成人三级在线观看| 精品一区二区三区四区五区| 欧美精品123| 久久久久国产精品视频| 亚洲区一区二区| 久久久一区二区三区捆绑**| 色综合久久中文| www.欧美日本韩国| 欧美日韩免费高清| 日韩毛片在线观看| 亚洲精品一区二区在线看| wwwwww欧美| 欧美激情国产日韩| 久久99影院| 久久久免费观看视频| 成人国产精品免费| 久久精品论坛| 黄色三级电影网| 国产成人精品aa毛片| 91精品店在线| 99色在线播放| 91pron在线| 亚洲国产精品电影| 91尤物视频在线观看| 国产精品免费99久久久| 黄色av免费在线观看| 国产高清自拍99| 中文字幕在线成人| 亚洲精品美女| jizz内谢中国亚洲jizz| 免费成人午夜视频| 国产精品91久久久| 欧美一卡二卡三卡| 久久综合给合久久狠狠狠97色69| 九九视频免费观看视频精品| 9色在线观看| 国产激情在线看| 91国语精品自产拍| 最近在线中文字幕| 国产字幕中文| 特级西西444www大精品视频| 欧美黑人巨大xxx极品| 都市激情亚洲色图| 国产一区二区伦理片| 色婷婷狠狠五月综合天色拍 | 成视频年人免费看黄网站| 国内精品**久久毛片app| 中文字幕亚洲欧美日韩高清| 亚洲综合丁香婷婷六月香| 久久国产精品区| 91九色精品| 日韩一二三区| av漫画网站在线观看| 色播视频在线观看| 欧美女人性生活视频|