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

HTTP 2.0 為什么這么設計

網絡 網絡管理
我們知道,HTTP 的下層協議是 TCP,需要經歷三次握手才能建立連接。而 HTTP 1.0 的時候一次請求和響應結束就會斷開鏈接,這樣下次請求又要重新三次握手來建立連接。

HTTP 1.0 是 1996 年發布的,奠定了 web 的基礎。時隔三年,1999 年又發布了 HTTP

1.1,對功能上做了擴充。之后又時隔十六年,2015 年發布了 HTTP 2.0。

同學們肯定會覺得,隔了這么長時間,而且還從版本號還從 1 到了 2,那肯定有很多的新功能。其實不是的,HTTP 2.0 沒有沒有功能上的新增,只是優化了性能。

為什么要這么大的版本升級來優化性能,HTTP 1.1 的性能很差么?

那我們就來看下 HTTP 1.1 有什么問題:

HTTP 1.1 的問題

我們知道,HTTP 的下層協議是 TCP,需要經歷三次握手才能建立連接。而 HTTP 1.0 的時候一次請求和響應結束就會斷開鏈接,這樣下次請求又要重新三次握手來建立連接。

圖片

為了減少這種建立 TCP 鏈接的消耗,HTTP 1.1 支持了 keep-alive,只要請求或響應頭帶上 Connection: keep-alive,就可以告訴對方先不要斷開鏈接,我之后還要用這個鏈接發消息。當需要斷開的時候,再指定 Connection: close 的 header。

這樣就可以用同一個 TCP 鏈接進行多次 HTTP 請求響應了:

圖片

但這樣雖然減少了鏈接的建立,在性能上卻有問題,下次請求得等上一個請求返回響應才能發出。

這個問題有個名字,叫做隊頭阻塞,很容易理解,因為多個請求要排隊嘛,隊前面的卡住了,那后面的也就執行不了了。

怎么解決這個問題呢?

HTTP 1.1 提出了管道的概念,就是多個請求可以并行發送,返回響應后再依次處理。

也就是這樣:

圖片

其實這樣能部分解決問題,但是返回的響應依然要依次處理,解決不了隊頭阻塞的問題。

所以說管道化是比較雞肋的一個功能,現在絕大多數瀏覽器都默認關閉了,甚至都不支持。

那還能怎么解決這個隊頭阻塞的問題呢?

開多個隊不就行了。

瀏覽器一般會同一個域名建立 6-8 個 TCP 鏈接,也就是 6-8 個隊,如果一個隊發生隊頭阻塞了,那就放到其他的隊里。

這樣就緩解了隊頭阻塞問題。

我們寫的網頁想盡快的打開就要利用這一點,比如把靜態資源部署在不同的域名下。這樣每個域名都能并發 6-8 個下載請求,網頁打開的速度自然就會快很多。

這種優化手段叫做“域名分片”,CDN 一般都支持這個。

除了隊頭阻塞的問題,HTTP 1.1 還有沒有別的問題?

有,比如 header 部分太大了。

不知道大家有沒有感覺,就算你內容只傳輸幾個字符,也得帶上一大堆 header:

圖片

而且這些 header 還都是文本的,這樣占據的空間就格外的大。

比如,如果是二進制,表示 true 和 false 直接 1 位就行了,而文本的那就得經過編碼,“true” 就占了 4 個字節,也就是 32 位。那就是 32 倍的差距呀!

所以呢,HTTP 1.1 的時候,我們就要盡量避免一些小請求,因為就算請求的內容很少,也會帶上一大段 header。特別是有 cookie 的情況,問題格外明顯。

因此,我們的網頁就要做打包,也就是需要打包工具把模塊合并成多個 chunk 來加載。需要把小圖片合并成大圖片,通過調整 background:position 來使用。需要把一些 css、圖片等內聯。而且靜態資源的域名也要禁止攜帶 cookie。

這些都是為了減少請求次數來達到提高加載性能的目的。

而且 HTTP 的底層是 TCP,其實是可以雙向傳輸數據的,現在卻只能通過請求---響應這種一問一答的方式,并沒有充分利用起 TCP 的能力。

聊了這么多,不知道大家是否有優化它的沖動了。

也就是因為這些問題,HTTP 2.0 出現了,做了很多性能優化,基本解決了上面那些問題。

那 HTTP2 都做了哪些優化呢?

HTTP 2.0 的優化

先不著急看 HTTP 2.0 是怎么優化的,就上面那些問題來說,如果讓我們解決,我們會怎么解決?

比如隊頭阻塞的問題,也就是第二個響應要等第一個響應處理完之后才能處理。怎么解決?

這個很容易解決呀,每個請求、響應都加上一個 ID,然后每個響應和通過 ID 來找到它對應的請求。各回各家,自然就不用阻塞的等待了。

再比如說 header 過大這個問題,怎么解決?

文本傳輸太占空間,換成二進制的是不是會好很多。

還有,每次傳輸都有很多相同的 header,能不能建立一張表,傳的時候只傳輸下標就行了。

還有,body 可以壓縮,那 header 是不是可以壓縮。

這樣處理之后,應該會好很多。

那沒有充分利用 TCP 的能力,只支持請求--響應的方式呢?

那就支持服務端主動推送呀,但是客戶端可以選擇接收或者不接收。

上面是我們對這些問題的解決方案的思考,我們再來看看 HTTP2 是怎么解決這些問題的:

HTTP2 確實是通過 ID 把請求和響應關聯起來了,它把這個概念叫做流 stream。

而且我們之前說了 header 需要單獨的優化嘛,所以把 header 和 body 部分分開來傳送,叫做不同的幀 frame。

每個幀都是這樣的格式:

圖片

payload 部分是傳輸的內容這沒啥可說的。

header 部分最開始是長度,然后是這個幀的類型,有這樣幾種類型:

  • SETTINGS 幀:配置信息,比如最大幀 size,是否支持 server push 等。
  • HEADERS 幀:請求或響應的 header。
  • DATA 幀:請求或響應的 body。
  • CONTINUATION 幀:一個幀不夠裝的時候,可以分幀,用這個可以引用上一個幀。
  • PUSH_PROMISE 幀:服務端推送數據的幀。
  • END_STREAM 幀:表示流傳輸結束。
  • RST_STREAM 幀,用來終止當前流。

這幾種幀里面 HEADERS 和 DATA 幀沒啥可說的。

SETTING 幀是配置信息,先告訴對方我這里支持什么,幀大小設置為多大等。

幀大小是有個上限的,如果幀太大了,可以分成多個,這時候幀類型就是 CONTINUATION(繼續)。也很容易理解。

HTTP2 確實是支持服務端推送的,這時候幀類型也是單獨的,叫做 PUSH_PROMISE。

流是用來傳輸請求響應或者服務端推送的,那傳輸完畢的時候就可以發送 END_STREAM 幀來表示傳輸完了,然后再傳輸 RST_STREAM

來結束當前流。

幀的類型講完了,我們繼續往后看,后面還有個 flags 標志位,這個在不同的幀類型里會放不同的內容:

圖片

比如 header 幀會在 flags 中設置優先級,這樣高優先級的流就可以更早的被處理。

HTTP 1.1 的時候都是排隊處理的,沒什么優先級可言,而 HTTP 2.0 通過流的方式實現了請求的并發,那自然就可以控制優先級了。

后面還有個 R,這個現在還沒啥用,是一個保留的位。

再后面的流標識符就是 stream id 了,關聯同一個流的多個幀用的。

幀的格式講完了,大家是不是有點暈暈的。確實,幀還是有很多種的。這些幀之間發送順序也不同,不同的幀會在不同狀態下發送,也會改變流的狀態。

我們來看下流的狀態機,也就是流收到什么幀會進入什么狀態,并且在什么狀態下會發送什么幀:

(看不明白可以先往后看)

圖片

剛開始,流是 idle 狀態,也就是空閑。

收到或發送 HEADERS 幀以后會進入 open 狀態。

oepn 狀態下可以發送或接收多次 DATA 幀。

之后發送或接收 END_STREAM 幀進入 half_closed 狀態。

half_closed 狀態下收到或者發送 RST_STREAM 幀就關閉流。

這個流程很容易理解,就是先發送 HEADER,再發送 DATA,之后告訴對方結束,也就是 END_STREAM,然后關閉 RST_STREAM。

圖片

但是 HTTP2 還可以服務端推送呀,所以還有另一條狀態轉換流程。

流剛開始是 idle 狀態。

接收到 PUSH_PROMISE 幀,也就是服務端推送過來的數據,變為 reserved 狀態。

reserved 狀態可以再發送或接收 header,之后進入 half_closed 狀態。

后面的流程是一樣的,也是 END_STREAM 和 RST_STREAM。

這個流程是 HTTP2 特有的,也就是先推送數據,再發送 headers,然后結束流。

圖片

這就是 http2 發送一次請求、響應,或者一次服務端推送的流程,都是封裝在一個個流里面的。

流和流之間可以并發,還可以設置優先級,這樣自然就沒有了隊頭阻塞的問題,這個特性叫做多路復用。也就是復用同一個鏈接,建立起多條通路(流)的意思。

而且傳輸的 header 幀也是經過處理的,就像我們前面說的,會用二進制的方式表示,用做壓縮,而且壓縮算法是專門設計的,叫做 HPACK:

兩端會維護一個索引表,通過下標來標識 header,這樣傳輸量就少了不少:

圖片

首先,header 里其實不止有 header,還有一行 GET xxx/xxx 的請求行,和 200 xxx 的響應行,為了統一處理,就換成了 :host :path 等 header 來表示。

這樣發送的時候只需要發送下標就行:

圖片

比如 :method: get 就只需要發送個 2: get。

這個編碼也是根據頻率高低來設置的,頻率高的用小編碼,這種方式叫做哈夫曼編碼。

這樣就實現了 header 的壓縮。

至此, HTTP2.0 的主要特性就講完了,也就是多路復用,服務端推送,頭部壓縮,二進制傳輸。

最主要的特性是多路復用,也就是流和幀,流在什么狀態下發送什么幀。其他的特性是圍繞這個來設計的。

回過頭來看一下 HTTP1.1 的問題是否都得到了解決:

隊頭阻塞:通過流的來標識請求、響應,同一個流的分為多個幀來傳輸,多個流之間可以并發,不會相互阻塞。

header 太大:通過二進制的形式,加上 HPACK的壓縮算法,使得 header 減小了很多。

沒有充分利用 TCP 的特性:支持了服務端推送。

這樣看來,HTTP2.0 確實解決了 HTTP 1.1 的問題。

看起來,HTTP 2.0 已經很完美了?

其實不是的,雖然 HTTP 層面沒有了隊頭阻塞問題,多個請求響應可以并行處理。但是同一個流的多個幀還是有隊頭阻塞問題,以為你 TCP 層面會保證順序處理,丟失了會重傳,這就導致了上一個幀沒收到的話,下一個幀是處理不了的。

這個問題是 TCP 的可靠傳輸的特性帶來的,所以想徹底解決隊頭阻塞問題,只能把 HTTP 的底層傳輸協議換掉了。

這就是 HTTP3 做的事情了,它的傳輸層協議換成了 UDP。當然,現在 HTTP3 還不是很成熟,我們先重點關注 HTTP2 即可。

總結

1996 年發布 HTTP 1.0,1999 年 HTTP 1.1,2015 年 HTTP 2.0。

1.1 和 2 之間間隔了 15 年,確實改變了很多,但是只是優化了性能。

1.1 的問題是第二個請求要等第一個響應之后才能發出,就算用了管道化,多個響應之間依然也會阻塞,這就是“隊頭阻塞”問題。

而且 header 部分太大了,還是純文本的,可能比 body 部分傳的都多。

針對 1.1 的隊頭阻塞問題,我們會做域名分片,針對 header 過大的問題,我們會減少請求次數,也就是打包分 chunk、資源內聯、雪碧圖、靜態資源請求禁止 cookie 等優化策略。

HTTP 2.0 解決了 1.1 的這些問題,通過多路復用,也就是請求和響應在一個流里,通過同一個流 id 來關聯多個幀的方式來傳輸數據。多個流可以并發。

我們看了幀的格式,有長度、類型、stream id、falgs 還有 payload 等部分。

幀的類型還是挺多的,有 HEADRS、DATA、SETTINGS、PUSH_PROMISE、END_STREAM、EST_STREAM、等。

這些幀類型之間也不是毫無關聯的,流在不同的狀態下會發送、接收不同的幀,而且發送、接收不同的幀也會進入不同的狀態。

理解 HTTP2.0 的 stream 就要理解這樣的一個狀態流轉流程。

此外,HTTP 2.0 通過單獨設計的 HPACK 算法對 header 做了壓縮,也支持服務端推送。而且內容是通過二進制傳輸的,解決了 HTTP 1.1 的問題。

但是 HTTP 2.0 的底層是 TCP,它的可靠傳輸的特性使得同一個流內的多個幀依然是順序傳輸的,依然有隊頭阻塞問題。也是因為 HTP 3把底層協議換成 UDP。

雖然還是有一些問題,但 HTTP 2.0 已經基本上把 HTTP 1.1 的各方面性能不好的點都優化到了極致,是很有意義的一次版本升級。

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2022-05-23 10:11:36

HTTP緩存

2022-06-13 21:52:02

CDN網絡節點

2021-10-30 19:57:00

HTTP2 HTTP

2011-01-28 08:55:44

網頁設計Web

2019-07-16 16:00:31

HTTP時延服務

2013-03-04 10:10:36

WebKit瀏覽器

2022-06-02 08:03:19

PyCharmPython代碼

2024-02-26 21:15:20

Kafka緩存參數

2019-08-30 14:58:47

JavaScript程序員編程語言

2018-08-16 08:03:21

Python語言解釋器

2020-02-27 15:44:41

Nginx服務器反向代理

2020-02-27 21:03:30

調度器架構效率

2012-08-17 10:01:07

云計算

2020-06-16 14:13:50

Kubernetes容器Linux

2020-03-30 15:05:46

Kafka消息數據

2014-05-26 17:00:51

2024-03-07 10:21:56

2020-09-27 08:12:09

Nginx反向代理負載均衡

2020-11-10 22:53:54

oracle數據庫

2024-01-10 17:04:13

通信模塊通信技術通信模組
點贊
收藏

51CTO技術棧公眾號

韩国三级在线观看久| 瑟瑟在线观看| 欧美激情1区| 精品久久久久久中文字幕动漫 | 欧美精品一区二区三区蜜桃| 亚洲精品666| 国产精品灌醉下药二区| 精品久久一二三| 国产综合色精品一区二区三区| 国产精品xxxx| 在线成人www免费观看视频| 国产深夜精品福利| 欧美hd在线| 国产深夜精品福利| 亚洲小说区图片区都市| 精品国产一区二区三区在线观看| 成人在线免费观看| 久久精品亚洲精品国产欧美| 欧美激情极品| www.日韩不卡电影av| 电影在线观看一区| 亚洲国产精品成人va在线观看| 午夜影院免费| 日韩欧美国产系列| 一本大道久久a久久综合| 91爱爱小视频k| 中文字幕一区二区三区日韩精品 | 国产精品免费不| 色综合五月天导航| 成人禁用看黄a在线| 26uuu色噜噜精品一区二区| 日韩一区二区在线观看视频| av国产在线观看| 欧美一级搡bbbb搡bbbb| 国产精品久久麻豆| 精品粉嫩超白一线天av| 国产日韩欧美二区| 久久久久国产精品麻豆ai换脸 | 精品国产乱码久久久久久1区2区| sm国产在线调教视频| 日韩一区二区电影| 亚洲中文字幕无码中文字| 制服丝袜日韩国产| 综合天天久久| 亚洲91精品在线观看| 精品一区二区三区中文字幕老牛| 国产精品一区二区久久| 黄色在线一区| 日韩一级性生活片| 国产精品成人免费| 青青草91久久久久久久久| 一区在线视频| 精品视频色一区| 依依综合在线| 久久久久久久久中文字幕| 日韩.com| 日韩欧美精品一区二区| 激情欧美一区二区| 精品国产三区在线| 国产一区国产精品| 丰满的护士2在线观看高清| 亚洲视频精品在线| 丝袜美腿综合| 久久www免费人成精品| 成人av在线看| 天堂а√在线8种子蜜桃视频| 欧美电影三区| 久草免费福利在线| 五码日韩精品一区二区三区视频| 国偷自产av一区二区三区| 国产三级欧美三级| 欧美婷婷久久五月精品三区| 亚洲精品电影网站| bl视频在线免费观看| 日韩国产在线一区| 亚洲天堂网站在线观看视频| av在线播放国产| 欧美裸身视频免费观看| 一区二区三区国产精华| 亚洲精品在线免费看| 亚洲欧美视频一区| 国产网红女主播精品视频| 亚洲最大的av网站| 自拍偷自拍亚洲精品被多人伦好爽 | 国产一区二区免费在线观看| 国产精品国产三级国产普通话三级| 欧美日韩久久久久| 午夜国产精品视频免费体验区| 福利片在线看| 亚洲一区二区成人在线观看| 欧美私密网站| 精品国产31久久久久久| 麻豆国产欧美一区二区三区| 95精品视频在线| 国产淫片免费看| 欧美日韩一卡二卡三卡| 日韩欧美久久| 亚洲欧洲日韩精品| 伊人久久综合一区二区| 国产在线观看精品| 最新日韩一区| 蜜桃av色综合| 欧美性极品xxxx娇小| 日本高清免费电影一区| 国产网红女主播精品视频| 久久成人精品一区二区三区| 国产日产欧美一区二区| 欧美黑人疯狂性受xxxxx野外| 久久国产亚洲精品无码| 色撸撸在线观看| 国产黄色精品网站| 美女久久网站| 亚洲wwww| 三级做a全过程在线观看| 97超级碰碰| 精品福利在线视频| 亚洲自偷自拍熟女另类| 欧美视频精品| 国内精品不卡| 老司机在线看片网av| yellow91字幕网在线| 国产手机视频在线观看| 91美女视频在线| 国产精品免费网站| 国产精品国产自产拍高清av| 国产一区二区丝袜| 亚洲伦理精品| 欧美天堂社区| av久久久久久| 精品一区二区在线免费观看| 国产亚洲视频中文字幕视频| 亚洲精品日日夜夜| 日本精品一级二级| 在线亚洲a色| 成人免费淫片免费观看| 成人深夜福利app| 免费在线观看不卡| 秋霞欧美视频| 久久久久久亚洲精品不卡4k岛国| 欧美性高潮床叫视频| 亚洲高清资源在线观看| 麻豆国产精品视频| 郴州新闻综合频道在线直播| 福利在线午夜| 一道本视频在线观看| 亚洲精品国产一区二区精华液| 精品99re| 日韩免费av片在线观看| 91精品国产色综合久久不卡98| 国产亚洲精品久久久久久777| av资源新版天堂在线| 盗摄精品av一区二区三区| 亚洲欧美日韩国产一区| 91久久精品无嫩草影院| 欧美日韩影视| 精品视频色一区| 一区二区在线影院| 97久久国产精品| 欧美激情精品久久久| 国产69精品久久久| 久久91精品久久久久久秒播| 337p日本| 欧美精品日韩少妇| 久蕉在线视频| 男人揉女人奶房视频60分| 先锋成人影院| 永久免费看mv网站入口亚洲| 久久综合视频网| 自拍视频一区| av网站在线免费观看| 五月天亚洲综合| 久久av在线播放| 亚洲国产人成综合网站| 性高湖久久久久久久久| 视频精品导航| 国产精品精华液网站| 久久精品国产99精品国产亚洲性色| 国产丝袜一区二区| 亚洲同性gay激情无套| 婷婷激情综合网| 日本不卡免费在线视频| 欧美网站在线观看| 久久久www成人免费精品| 久久久999免费视频| 日韩福利电影在线观看| 亚洲欧洲另类国产综合| 国产欧美日韩综合精品一区二区| 福利微拍一区二区| 91免费欧美精品| 日韩av在线第一页| 人人澡人一摸人人添| 天天干狠狠干| 伦理片一区二区三区| 狠狠狠综合7777久夜色撩人| 最近最新mv在线观看免费高清| 在线观看一级片| 成人免费毛片播放| 一级片在线播放| 精品视频自拍| 四虎成人av|