成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTTP 內容編碼,也就這 2 點需要知道 | 實用 HTTP

開發 開發工具
HTTP 協議在網絡知識中占據了重要的地位,HTTP 協議最基礎的就是請求和響應的報文,而報文又是由報文頭(Header)和實體組成。大多數 Http 協議的使用方式,都是依賴設置不同的 HTTP 請求/響應 的 Header 來實現的。

HTTP 協議在網絡知識中占據了重要的地位,HTTP 協議最基礎的就是請求和響應的報文,而報文又是由報文頭(Header)和實體組成。大多數 Http 協議的使用方式,都是依賴設置不同的 HTTP 請求/響應 的 Header 來實現的。

[[234324]]

本系列《實用 HTTP》就拋開常規的 Header 講解式的表述方式,從實際問題出發,來分析這些 HTTP 協議的使用方式,到底是為了解決什么問題?同時講解它是如何設計的和它實現原理。

HTTP 協議是一種無狀態的“松散協議”,它不會記錄不同請求的狀態,并且因為它本身包含了兩端(客戶端和服務端),根據請求和響應來區分,它大部分的內容都只是一個建議,其實雙邊是可以不遵守此建議的。

“這里寫了建議零售價 2 元…”

“哦,不接受建議!”

在上一篇文章中,聊到了 HTTP 的緩存機制,其實緩存的主要起因就是為了減少網絡請求次數,來達到快速響應的目的。而除了減少網絡請求之外,其實我們還可以通過對實體內容,進行編碼壓縮的方式,減少傳輸的內容大小,從而加快響應的速度。

本文就就繼續來聊聊 HTTP 的實體內容壓縮編碼機制。

二、HTTP 的內容編碼

2.1 為什么要對內容進行編碼?

編碼的目的就是為了壓縮報文實體內容的大小,而通過壓縮服務器響應報文傳輸的內容實體,在一定程度上就可以加快響應的速度。

畢竟傳輸一個 10kb 的內容,會比傳輸一個 100kb 的內容快很多。這就是需要使用內容編碼進行壓縮的原因。

2.2 壓縮編碼

說到壓縮編碼,就先簡單聊聊壓縮算法,對于壓縮算法而言,分為兩類:

  • 無損壓縮算法
  • 有損壓縮算法

從名稱上就可以理解,無損壓縮意味著它是可以被還原的,通常被應用在文本,而有損壓縮會對原始數據進行修改,以加大壓縮率的目的,對文件進行有損失的壓縮,這是一種不可逆的操作,通常一些對質量要求不高的圖片和視頻上,雖然壓縮以后可能會導致文件模糊,但是勉強還可以看。

而在 HTTP 協議中,通常我們只會對文本內容,進行壓縮編碼。一個主要的原因在于,壓縮本身是會消耗服務器資源的,而文件比多媒體文件輕便了很多。并且多媒體文件多數情況下,本身就已經是高度壓縮的二進制格式,再次進行壓縮的意義也不大。

2.3 設計一個“壓縮協議”

前面提到,HTTP 協議是一種松散的 “協商協議”,需要客戶端和服務端雙端配合,才可以生效。而壓縮算法有很多種,到底應該選擇哪一種,也是需要雙方協商的。

如果我們嘗試設計一下這個 HTTP 的 “壓縮協議”,主要需要關注這兩點。

1. 通知服務端,客戶端支持的壓縮算法

一個 HTTP 事務,總是由客戶端發起請求,而服務端將響應返回。那么客戶端就要在發起請求的時候,率先告知服務端,當前客戶端支持的壓縮算法。

通常客戶端會支持多種壓縮算法,為了讓服務端有選擇的空間,應該允許傳遞多個支持的壓縮算法。既然有多選的空間,那么就一定要有優先級的概念。

類似于我們在市場上交易,我接受人民幣、美元、比特幣的交易,但是因為我使用人民幣更方便,所以我需要指明交易方,如果方便的話***通過人民幣交易。

2. 服務端選擇支持的壓縮算法壓縮內容

服務端接受到客戶端的請求后,辨識出客戶端支持的壓縮算法,現在當前環境***的一種壓縮算法對響應內容體進行壓縮,然后將壓縮后的內容返回。

為了讓客戶端接收到響應后,能明確知道服務端使用的壓縮算法,還需要在響應中明確指明,當前的響應實體的數據使用的壓縮算法(當然也可以不壓縮)。

2.4 HTTP 的“壓縮協議”

前面我們自己設計的兩個條件,都是基于 HTTP 報文中的報文頭來實現的。接下來我們看看 HTTP 協議中,是如何設計“壓縮協議”的。

1. 請求頭中的 Accept-Encoding

客戶端為了告知服務端當前支持的壓縮編碼,可以在請求頭中,增加 Accept-Encoding 這個頭部字段,用來指定當前客戶端支持的壓縮編碼,如果有多個可以使用逗號 , 進行分割。

為了滿足優先級,其實是可以通過 , 分割的順序來指定的。HTTP 協議中,還可以使用 Q 值來說明編碼的優先級,Q 值的取值范圍是 0.0 ~ 1.0。0.0 表示客戶端不想接受此編碼,而 1.0 則表示希望使用此編碼,不過通常我們不需要明確的指定它,大家了解一下即可。

2. 響應頭中的 content-encoding

服務端為了在響應報文里體現當前對內容壓縮使用的編碼格式,會在響應頭中使用 Content-Encoding 標記,它是一個明確值,所以只可能有一個。

編碼的目的就是為了壓縮,所以當服務端選擇壓縮內容實體的時候,同時還會修改 Content-Length 來明確表示當前實體被編碼壓縮后的長度。

發兩張壓縮前和壓縮后的流程圖,就清晰了。

壓縮前:

壓縮后:

三、HTTP 的編碼類型

3.2 HTTP 編碼類型

HTTP 定義了一些標準的內容編碼類型,并且可以擴展更多的編碼類型。由互聯網號碼分配機構(IANA)對各種編碼進行標準化,它給每個內容編碼算法分配一個唯一的代號。

Content-Encoding 就是用這些標準化的代號來說明編碼使用的算法。

比較常用的算法有:

  • gzip:表明實體采用 GNU zip 編碼。
  • compress:表明實體采用 Unix 的文件壓縮程序。
  • deflate:表明使用是用 zlib 的格式壓縮的。
  • br:表明實體使用 Brotli 算法的壓縮格式。
  • identity:表明沒有對實體進行編碼,為默認值。

在這些算法中,除了 identity 之外,都是無損壓縮,他們都是需要可還原成原始的文本內容的。gzip 通常是效率***的,使用最廣泛的。

但是 gzip 對媒體文件的壓縮效果相對較差,本身 JPG/PNG 這類文件已經是一種高度壓縮的二進制文件,開啟 gzip 效果甚微還會浪費大量 CPU 資源。

瀏覽器的默認實現中,這些壓縮編碼通常只會作用在文本內容上,就是 Content-Type 為 text/Xxx 的請求上,而對于一些媒體文件,則不會使用這種方式對其進行壓縮。

3.2 GZIP

既然 gzip 是 HTTP 的內容編碼中,比較常用的一種編碼方式,這里拋磚引玉,簡單介紹一些 gzip,其他編碼方式,有興趣的可以自行查閱相關資料。

gzip 編碼是采用的 GNU Zip 編碼,是一種無損的壓縮算法,用于減少傳輸報文實體的大小,它是可逆的壓縮算法,不會導致信息損失。

gzip 的壓縮效率相對較高,并且使用也是最為廣泛的,我們在工作中如果不特殊說明,說到的 HTTP 壓縮,通常就是指的 gzip。

gzip 的原理,簡單來說,就是會去掃描整個文本的字符串,找到一樣的字符串,就只保留一個并分配一個標識,然后將其他相同的字符串使用這個標識替換,使整個文件變小。在還原的時候,只需要將每個標識代表的字符串,替換還原,就可以還原成最初的內容實體。

這種壓縮算法,非常適用于現在的互聯網產品,HTML、CSS、JavaScript 以及 Json 中,都包含了大量重復的字符串,所以在這里使用 gzip 是非常合適的。

gzip 具體能壓縮多少,完全取決于壓縮的實體內容,內容文本中,包含越多相同的字符串,壓縮率就越高,相反則越低。在理想狀態下,gzip 的壓縮率能高達 70%。

四、內容編碼的完整過程

到此我們就算了解清楚 HTTP 對內容編碼的完整流程了。大致流程如下圖。

再總結幾個關鍵點:

1. 請求頭中,通過 Accept-Encoding 來指定客戶端支持的內容編碼格式。

2. 服務端選擇一個支持的內容編碼去壓縮原始響應內容實體。

3. 修改響應頭,增加 Content-Encoding 用于指定使用的編碼方式,并且修改 Content-Length 來表明壓縮后的內容大小。

4. 內容壓縮的算法有很多,但是 gzip 是最常用的。

5. 內容壓縮算法,都是基于無損壓縮,最終都需要在客戶端將內容還原。

五、小結

一個報文通常會包含報文頭部和報文實體,而本文介紹的 HTTP 壓縮編碼,主要是針對報文實體內容中,文本內容的壓縮編碼,并為涉及到報文頭部的壓縮。主要是因為在 HTTP/1中,報文頭部始終是以 ASCII 文本傳輸,沒有經過任何壓縮,而在 HTTP/2 中才對其實現了解決方案,所以 HTTP 的編碼壓縮只是針對報文實體的,這句話并不全對,這個有機會以后再說。

除了內容編碼之外,HTTP 還有傳輸編碼,這個同樣也是有機會再說。

在本文中,說明了 HTTP 對報文實體內容的壓縮策略和方法,希望對你有幫助。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

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

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

2019-09-19 09:44:08

HTTPCDNTCP

2022-04-05 11:29:40

Linux安裝操作系統

2016-01-20 10:40:55

2016物聯網

2014-07-31 17:13:50

編碼程序員

2023-01-09 17:23:14

CSS技巧

2018-07-12 15:30:03

HTTP緩存機制

2020-08-24 08:27:00

HTTP存儲瀏覽器

2022-07-06 15:51:48

瀏覽器開發者工具

2017-09-20 10:50:19

數據中心電力中斷

2023-12-23 11:15:25

2018-03-08 08:04:53

JavaScript反調試惡意軟件

2021-04-15 08:04:27

容器DevOps程序

2020-06-10 08:33:05

Java 編程語言開發

2022-06-07 14:38:40

云原生架構云計算

2010-07-30 16:27:06

Flex開發

2018-04-26 14:25:03

2018-08-01 11:07:31

人工智能深度學習機器人

2018-07-04 14:56:02

HTTP傳輸編碼

2011-08-19 09:45:50

WindowsServ

2020-03-08 21:22:03

HTTP112
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av免费网站在线观看 | 亚洲精品中文字幕中文字幕 | 国产91亚洲精品一区二区三区 | 国产精品欧美一区喷水 | 久久夜视频| 四虎成人精品永久免费av九九 | 午夜精品久久久久久久久久久久久 | 国产精品综合久久 | 欧美久久国产精品 | 亚洲第一区久久 | 81精品国产乱码久久久久久 | 日韩国产一区二区三区 | 久久精品欧美一区二区三区不卡 | 91视频www.| 九九免费视频 | 国产精品美女久久久久aⅴ国产馆 | av在线天堂网 | 国产精品永久 | 日本精品在线一区 | 国产精品 欧美精品 | 九九免费视频 | 精品久久中文 | 粉嫩一区二区三区性色av | 亚洲www啪成人一区二区麻豆 | 国产免费又色又爽又黄在线观看 | 国产精品视频一区二区三区, | 色888www视频在线观看 | 精品粉嫩aⅴ一区二区三区四区 | 91精品国产91久久综合桃花 | 日韩精品在线一区 | 欧美在线视频网站 | 色综合视频 | 亚洲一区二区三区在线观看免费 | 欧美亚洲国语精品一区二区 | 日韩一区二区久久 | 黑人精品xxx一区一二区 | 免费观看一级视频 | 国产乱码精品一区二区三区五月婷 | 免费观看黄色一级片 | 亚洲精品中文字幕在线 | 欧美一区二区三区四区五区无卡码 |