13 HTTP傳輸大文件的方法
如何在有限的帶寬下高效快捷傳輸大文件?
-
數(shù)據(jù)壓縮
-
分塊傳輸
-
范圍請(qǐng)求
-
多段數(shù)據(jù)
數(shù)據(jù)壓縮
-
思路:把大文件整體變小
-
瀏覽器發(fā)送請(qǐng)求時(shí),請(qǐng)求頭字段Accept-Encoding是瀏覽器支持的壓縮格式列表,如 gzip,deflate,br;服務(wù)器選擇一種壓縮算法,放到響應(yīng)頭Content-Encoding中,再把壓縮數(shù)據(jù)壓縮后發(fā)給瀏覽器。
-
gzip 等壓縮算法只對(duì)文本文件有較好的壓縮率,而圖片、音頻文件已經(jīng)是高度壓縮的,再使用gzip 處理也不會(huì)變小,所以失效。
分塊傳輸
-
思路:化整為零,把文件分解成小塊,分批發(fā)送給瀏覽器,瀏覽器收到后再組裝復(fù)原。
-
chunked 分塊傳輸編碼:響應(yīng)報(bào)文頭字段“Transfer-Encoding:chunked”表示,意思是報(bào)文的body部分不是一次性發(fā)過(guò)來(lái)的,而是分成了許多的塊(chunk)傳輸。
-
Transfer-Encoding 與 Content-Length 互斥,因?yàn)橐错憫?yīng)報(bào)文的傳輸長(zhǎng)度未知,要么已知。
-
分塊傳輸?shù)木幋a規(guī)則:
-
每個(gè)分塊包含兩個(gè)部分,長(zhǎng)度頭和數(shù)據(jù)塊;
-
長(zhǎng)度頭是以 CRLF(回車(chē)換行,即\r\n)結(jié)尾的一行明文,用 16 進(jìn)制數(shù)字表示長(zhǎng)度;
-
數(shù)據(jù)塊緊跟在長(zhǎng)度頭后,最后也用 CRLF 結(jié)尾,但數(shù)據(jù)不包含 CRLF;
-
最后用一個(gè)長(zhǎng)度為 0 的塊表示結(jié)束,即“0\r\n\r\n”。
-

范圍請(qǐng)求
-
范圍請(qǐng)求(range request):允許客戶端再請(qǐng)求頭里面是有專(zhuān)用字段來(lái)表示只獲取文件的一部分,相當(dāng)于客戶端的“化整為零”。
-
服務(wù)器在響應(yīng)頭使用“Accept-Ranges:bytes” 明確告知客戶端,支持范圍請(qǐng)求,但是非必須。
-
發(fā)送 “Accept-Ranges:none” 或不發(fā)送“Accept-Ranges:bytes” ,表示服務(wù)器不支持范圍請(qǐng)求功能。
-
格式:“Accept-Ranges:bytes=x-y”
- x,y表示偏移量,從0開(kāi)始計(jì)數(shù),單位是字節(jié)
- x或y可以省略,“0-”表示文檔起點(diǎn)到終點(diǎn);“10-”表示從第10個(gè)字節(jié)開(kāi)始到文檔末尾;“-1”表示文檔最后一個(gè)字節(jié);“-10”表示文檔末尾的10個(gè)字節(jié)。
-
服務(wù)器收到Range 字段后要做四件事情
- 檢查范圍是否合法,如果范圍越界,返回狀態(tài)碼“416”,表示“請(qǐng)求范圍有誤,服務(wù)器無(wú)法處理,請(qǐng)?jiān)贆z查一下”
- 范圍正確,服務(wù)器根據(jù)Range頭計(jì)算偏移量,讀取文件的片段,返回狀態(tài)碼“206 Partial Content”,表示body是原數(shù)據(jù)一部分。
- 服務(wù)器添加一個(gè)響應(yīng)頭字段“Content-Range”,告訴片段的實(shí)際偏移量和資源大小,格式“bytes x-y/length”,與Range 頭的區(qū)別是沒(méi)有“=”,范圍長(zhǎng)度后面多了總長(zhǎng)度。
- 發(fā)送數(shù)據(jù),直接把片段用TCP發(fā)給客戶端,一個(gè)范圍請(qǐng)求就處理完成。
多段數(shù)據(jù)
- 范圍請(qǐng)求支持一次只獲取一個(gè)片段,也支持一次性獲取多個(gè)片段數(shù)據(jù)
2.多個(gè)片段用特殊的MIME 類(lèi)型:“multipart/byteranges”表示,代表報(bào)文的body 是多段字節(jié)序列組成,加參數(shù)“boundary=xxx”給出段之間的分隔標(biāo)記。 - 舉例
- 請(qǐng)求:
GET /16-2 HTTP/1.1
Host: www.chrono.com
Range: bytes=0-9, 20-29
- 響應(yīng):
HTTP/1.1 206 Partial Content
Content-Type: multipart/byteranges; boundary=00000000001
Content-Length: 189
Connection: keep-alive
Accept-Ranges: bytes
--00000000001
Content-Type: text/plain
Content-Range: bytes 0-9/96
// this is
--00000000001
Content-Type: text/plain
Content-Range: bytes 20-29/96
ext json d
--00000000001--
浙公網(wǎng)安備 33010602011771號(hào)