Http 資料壓縮 分塊傳輸 範圍請求

2021-10-02 09:47:47 字數 4087 閱讀 2086

1.首先來看資料壓縮

http傳輸資料時,會對資料進行壓縮,因為有些資料大的有幾 g、幾十 g 都有可能。

通常瀏覽器傳送請求時會帶著「accept-econding」頭欄位,面是瀏覽器支援的壓縮格式列表,例如 gzip、deflate、br 等,這樣伺服器就可以從中選擇一種壓縮演算法,放進「content-encoding」響應頭里,再把原資料壓縮後發給瀏覽器。

2.再來看分塊傳輸

分塊就是把資料分成一塊一塊的再傳送出去,瀏覽器收到後再組裝起來,這種「化整為零」的思路在 http 協議裡就是「chunked」分塊傳輸編碼,在響應報文裡用頭字段「transfer-encoding: chunked」來表示,意思是報文裡的 body 部分不是一次性發過來的,而是分成了許多的塊(chunk)逐個傳送。

分塊傳輸也可以用於「流式資料」,例如由資料庫動態生成的表單頁面,這種情況下 body 資料的長度是未知的,無法在頭字段「content-length」裡給出確切的長度,所以也只能用chunked方式分塊傳送。

「transfer-encoding: chunked」和「content-length」這兩個欄位是互斥的,也就是說響應報文裡這兩個字段不能同時出現,乙個響應報文的傳輸要麼是長度已知,要麼是長度未知(chunked),這一點你一定要記住。

下面我們來看一下分塊傳輸的編碼規則,其實也很簡單,同樣採用了明文的方式,很類似響應頭。

1.每個分塊包含兩個部分,長度頭和資料塊;

2.長度頭是以 crlf(回車換行,即\r\n)結尾的一行明文,用 16 進製數字表示長度;

3.資料塊緊跟在長度頭後,最後也用 crlf 結尾,但資料不包含 crlf;

4.最後用乙個長度為 0 的塊表示結束,即「0\r\n\r\n」。

3.範圍請求

有了分塊傳輸編碼,伺服器就可以輕鬆地收發大檔案了,但對於上 g 的超大檔案,還有一些問題需要考慮。

比如,你在看當下正熱播的某穿越劇,想跳過片頭,直接看正片,或者有段劇情很無聊,想拖動進度條快進幾分鐘,這實際上是想獲取乙個大檔案其中的片段資料,而分塊傳輸並沒有這個能力。

範圍請求」(range requests)的概念,允許客戶端在請求頭里使用專用欄位來表示只獲取檔案的一部分

伺服器會傳送專用欄位accept-ranges: bytes」明確告知客戶端:「我是支援範圍請求的」,範圍請求不是 web 伺服器必備的功能,可以實現也可以不實現。

如果不支援的話該怎麼辦呢?伺服器可以傳送「accept-ranges: none」,或者乾脆不傳送「accept-ranges」字段,這樣客戶端就認為伺服器沒有實現範圍請求功能,只能老老實實地收發整塊檔案了。

客戶端會傳送range請求字段,格式是「bytes=x-y」,其中x和y是以位元組為單位的資料範圍

range 的格式也很靈活,起點 x 和終點 y 可以省略,能夠很方便地表示正數或者倒數的範圍。假設檔案是 100 個位元組,那麼:「0-」表示從文件起點到文件終點,相當於「0-99」,即整個檔案;「10-」是從第 10 個位元組開始到文件末尾,相當於「10-99」;「-1」是文件的最後乙個位元組,相當於「99-99」;

「-10」是從文件末尾倒數 10 個位元組,相當於「90-99」。

例如客戶端請求

服務端響應

服務端收到range欄位後,要做4件事

1.檢查範圍是否合法

2.範圍合法的話,計算偏移量,讀取檔案的片段,返回狀態碼「206 partial content」,和 200 的意思差不多,但表示 body 只是原資料的一部分。

3.新增響應頭欄位 content-range,告訴片段的實際偏移量和資源的總大小

4.傳送資料

範圍請求還可以請求獲得多個片段

例如;請求多個片段

會得到伺服器響應:「multipart/byteranges」,表示報文的 body 是由多段位元組序列組成的,並且還要用乙個引數「boundary=***」給出段之間的分隔標記。每乙個分段必須以「- -boundary」開始(前面加兩個「-」),之後要用「content-type」和「content-range」標記這段資料的型別和所在範圍,然後就像普通的響應頭一樣以回車換行結束,再加上分段資料,最後用乙個「- -boundary- -」(前後各有兩個「-」)表示所有的分段結束。

ASIHTTPRequest 資料壓縮

從0.9版本開始,asihttprequest會提示伺服器它可以接收gzip壓縮過的資料。apache 2.x以上版本已經配備了mod deflate擴充套件,這使得apache可以透明地壓縮特定種類的資料。要開啟這個特性,你需要在apache的配置檔案中啟用mod deflate。並將mod de...

ASIHTTPRequest 資料壓縮

從0.9版本開始,asihttprequest會提示伺服器它可以接收gzip壓縮過的資料。apache 2.x以上版本已經配備了mod deflate擴充套件,這使得apache可以透明地壓縮特定種類的資料。要開啟這個特性,你需要在apache的配置檔案中啟用mod deflate。並將mod de...

ASIHTTPRequest 資料壓縮

從0.9版本開始,asihttprequest會提示伺服器它可以接收gzip壓縮過的資料。apache 2.x以上版本已經配備了mod deflate擴充套件,這使得apache可以透明地壓縮特定種類的資料。要開啟這個特性,你需要在apache的配置檔案中啟用mod deflate。並將mod de...