HTTP --- HTTP2小結

參考

HTTP發展史

  • HTTP/0.9 - 單行協議
    • 問世于1990年,那時的HTTP非常簡單: 只支持GET方法; 沒有首部; 只能獲取純文本
  • HTTP/1.0 - 搭建協議的框架
    • 1996年,HTTP正式被作為標準公布,版本為HTTP/1.0。1.0版本增加了首部、狀態碼、權限、緩存、長連接(默認短連接)等規范,可以說搭建了協議的基本框架。
  • HTTP/1.1 - 進一步完善
    • 1997年,1.1版本接踵而至。1.1版本的重大改進在于默認長連接; 強制客戶提供Host首部;管線化;Cache-Control、ETag等緩存的相關擴展
      • 注: Etag和Last-Modified同時存在,以Etag為主

【HTTP/1.0的缺陷】:

  1. 連接無法復用: 一個連接對應一次握手
  2. 隊頭阻塞: 前面一個連接未完成,后面的連接無法進行

對于問題1, HTTP/1.1新增了一個connection: keep-alive,使連接完成后不斷開.

目前存在的問題

? 我們先來看看HTTP發展到1.1存在的問題:

  1. 線頭阻塞: TCP連接上只能發送一個請求,前面的請求未完成前,后續的請求都在排隊等待.
  2. 多個TCP連接:
    • 雖然HTTP/1.1管線化可以支持請求并發,但是瀏覽器很難實現,chrome、firefox等都禁用了管線化.所以1.1版本請求并發依賴于多個TCP連接,建立TCP連接成本很高,還回存在慢啟動的問題.
  3. 頭部冗余,采用文本格式
    • HTTP/1.X版本是采用文本格式,首部未壓縮,而且每一個請求都會帶上cookie、user-agent等完全相同的首部
  4. 客戶端需要主動請求

HTTP/2.0中的一些重大改進

HTTP2性能提升的核心就在于二進制分幀層。HTTP2是二進制協議,他采用二進制格式傳輸數據而不是HTTP/1.x的文本格式

  • 1.1響應是文本格式,而2.0把響應劃分為兩個幀

    • HEADERS frame: 首部
    • DATA frame: 消息負載
  • 也就是說: 一條HTTP響應,劃分為兩個幀來傳輸,并且采用二進制來編碼

    • 流(Stream): 已經建立TCP連接上的雙向字節流,可以承載一個或多個消息
    • 消息(Message): 一個完整的HTTP請求或響應,由一個或多個幀組成。特定消息的幀在同一個流上發送,這意味著一個HTTP請求或響應只能在一個流上發送.
    • 幀(Frame): 通信的基本單位。 一個TCP連接上可以由任意數量的流

多路復用

HTTP/2.0讓所有的通信都在一個TCP連接上完成,真正實現了請求的并發.

HTTP/2.0建立一個TCP連接,一個連接上面可以有任意多個流(stream),消息分割成一個或多個幀在流里面傳輸。幀傳輸過去以后,再進行重組,形成一個完整的請求或響應。這使得所有的請求或響應都無法阻塞。

頭部壓縮

在1.X版本中,首部用文本格式傳輸,通常會給每個傳輸增加500~800字節的開銷。大多數請求的首部字段是相同的(如cookie、user-agent等)。

HTTP2為此采用HPACK壓縮格式來壓縮首部,頭部壓縮需要在瀏覽器和服務器之間:

  • 維護一份相同的靜態字典,包含常見的頭部名稱,以及常見的頭部名稱和值的組合
  • 維護一份相同的動態字典,可以動態的添加內容
  • 通過靜態Huffman編碼對傳輸的首部字段進行編碼

HTTP/2.0的靜態字典,部分:

IndexHeader NameHeader Value
1:authority
2:methodGET
3:methodPOST
4:path/
5:path/index.html
6:schemahttp
7:schemahttps
8:status200
9:status204

所以我們在傳輸首部字段的時候,例如要傳輸method:GET,那我們只需要傳輸靜態字典里面method: GET對應的索引值就可以了,一個字節搞定.

user-agent、cookie這種字典里面只有首部名稱而沒有值的首部,第一次傳輸需要user-agent在靜態字典中的索引以及他的值,值會采用Huffman編碼來減小體積

第一次傳輸過user-agent之后,瀏覽器和服務器就會把它添加到自己的動態字典中。后續傳輸就可以傳輸索引了,一個字節

服務器推送技術

  • 服務器推送: 使得服務器可以預測客戶端需要的資源,主動推送到客戶端

  • 例如: 客戶端請求index.html,服務器端能夠額外推送script.jsstyle.css.原理:

    • 客戶端發送請求時,服務器能夠分析這個頁面所依賴的其他資源,主動推送到客戶端的緩存
    • 當客戶端收到原始網頁的請求時,它需要的資源已經位于緩存

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250283.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250283.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藤條生長為字母的動畫

https://www.youtube.com/watch?vLshPEGiHsqc Blender Tutorial: Vine Animation Text 需要使用插件Add Curve: IvyGen, 進入用戶設置,找到并溝選該插件. 建模:立體文字, [Alt C] 轉換為網格mesh;選中網格文字,新建藤蔓:[Shift A], Curve\Add Ivy to Mesh左邊工具欄下方的IvyG…

RDS Mysql中binlog日志查看

1、在阿里云下載下載的binlog 文件 如:mysql-bin.000217 2、想在本機解析出來,在本機安裝mysql5.7版本(注意系統版本要比RDS mysql 版本高才行) 3、 cmd進入本機mysql\bin目錄 e: cd E:\mysql5.7\bin mysqlbinlog -vv --base64-o…

讀書筆記 --- 再次閱讀回流與重繪

參考 - 強烈推薦看看,這個作者寫了很多特別好的文章. 瀏覽器渲染過程 解析HTML,生成DOM樹; 解析CSS生成CSSOM樹將DOM樹和CSSOM樹合并,生成渲染(Render)樹Layout(回流): 根據生成的渲染樹,視口(viewport),得到節點的幾何信息(位置、大小)Painting(重繪): 根據渲染樹和幾何信息…

2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

C 有n個節點和m邊條,求一條最長的路徑,該路徑(c1,c2,c3...cn)滿足 不出現重復的節點,ci 和ci1是鄰居節點,且 ci 的鄰居節點數量小于ci1的鄰居節點數量。 記憶DFS遍歷,每次遞歸計算的值都保存在數組里,這樣復…

javascript --- 將DOM結構轉換成虛擬DOM 虛擬DOM轉換成真實的DOM結構

虛擬DOM的實現 使用虛擬DOM的原因: 減少回流與重繪 將DOM結構轉換成對象保存到內存中 <img /> > { tag: img} 文本節點 > { tag: undefined, value: 文本節點 } <img title"1" class"c" /> > { tag: img, data: { title "1&q…

swap(a,b)值交換的4種方法

方法一&#xff1a;int tmp 0; tmp b;b a; a tmp; 方法二&#xff1a;a ab; b a-b; a a-b;方法三&#xff1a;a ^ b ^ a^ b;方法四&#xff1a;a ab-(ba);轉載于:https://www.cnblogs.com/vocaloid01/p/9514126.html

裝系統工具

安裝如果失敗,注意是不是工具的版本太老導致 系統分區工具: DiskGeniusPortable 刻錄工具: UlraISO rufus https://rufus.ie/ win32diskimager 轉載于:https://www.cnblogs.com/jiangfeilong/p/9937164.html

小程序WXML基本使用

數據綁定 <!--wxml--> <view> {{message}} </view> // page.js Page({data: {message: Hello MINA!} }) 列表渲染 <!--wxml--> <view wx:for"{{array}}"> {{item}} </view> // page.js Page({data: {array: [1, 2, 3, 4, 5]} })…

javascript --- vue中簡單的模板渲染

一層的渲染 將下面的模板中的mustache語法使用給定數據渲染. 模板如下 <div id"root"><div><div><p>{{name}} - {{message}}</p></div></div><p>{{name}}</p><p>{{msg}}</p> </div>數據如…

tomcat 虛擬路徑 與 虛擬主機配置

虛擬路徑配置 方法一&#xff1a;此方法需要重啟服務 打開下面文件 在host里面添加context標簽 <Context docBase"D:\test" path"/testServlet/aaaaa" reloadable"true" /> 瀏覽器訪問&#xff1a;http://172.16.6.103:1080/testServlet/a…

20172328 2018-2019《Java軟件結構與數據結構》第八周學習總結

20172328 2018-2019《Java軟件結構與數據結構》第八周學習總結 概述 Generalization 本周學習了二叉樹的另一種有序擴展&#xff1f;是什么呢&#xff1f;你猜對了&#xff01;ヾ(???)&#xff89;&#xff9e;就是堆。本章將講解堆的鏈表實現and數組實現&#xff0c;以及往…

javascript --- 函數的柯里化 Vue 2.x中柯里化的使用

函數式編程部分重點 參考資料: 函數式編程 柯里化 只傳遞給函數一部分參數來調用它,讓它返回一個函數去處理剩下的參數 var add function (x) {return function(y) {return x y} }var increment add(1) var addTen add(10)increment(2) // 3addTen(10) // 12判斷元素:V…

MYSQL重置ROOT密碼

背景 mysql 服務器長時間未使用&#xff0c;管理員當時設置的root 密碼忘記&#xff0c;需要重置 root 密碼&#xff0c;并加以妥善保存。 步驟 關閉 mysql 服務以跳過密碼驗證的方式啟動 mysql 服務mysqld --skip-grant-tables本地登陸后設置新的root 密碼 update mysql.user …

javascript --- Vue初始化 模板渲染

不帶響應式的Vue縮減實現 模板 現有模板如下: <div id "app"><div class"c1"><div titlett1 id"id">{{ name }}</div><div titlett2 >{{age}}</div><div>hello3</div></div><ul>…

#RANK_1 極其簡單的遞歸——騎士與金幣

2000:金幣 總時間限制: 1000ms內存限制: 65536kB描述國王將金幣作為工資&#xff0c;發放給忠誠的騎士。第一天&#xff0c;騎士收到一枚金幣&#xff1b;之后兩天&#xff08;第二天和第三天&#xff09;里&#xff0c;每天收到兩枚金幣&#xff1b;之后三天&#xff08;第四、…

動手動腦4

import java.io.*; public class ThrowMultiExceptionsDemo { public static void main(String[] args) { try { throwsTest(); } catch(IOException e) { System.out.println("捕捉異常"); }}private static void throwsTest() throws ArithmeticException,IOExcep…

javascript --- 對象原型

對象原型 參考 - MDN Javascript中的原型 在Javascript中,每一個函數都有一個特殊的屬性,叫做原型 下面獲取函數的原型fn.prototype function f1(){} console.log(f1.prototype) /*{constructor: f f1()__proto__:{constructor: f Object()__defineGetter__: f __defineGe…

從零認識單片機(9)

keil軟件&#xff1a; IDE:IDE是集成開發環境&#xff0c;就是用來開發的完整的軟件系統。 keil和mdk: keil:只能用來開發單片機 mdk:基于keil 拓展ARM的開發&#xff0c;主要用來開發ARM-cortex-m系列單片機的程序。 使用keil打開已有的工程項目&#xff1a; 1、IDE開發軟件&a…

javascript --- vue2.x中原型的使用(攔截數組方法) 響應式原理(部分)

說明 在Vue2.x中,利用了對原型鏈的理解,巧妙的利用JavaScript中的原型鏈,實現了數組的pop、push、shift、unshift、reverse、sort、splice等的攔截. 你可能需要的知識 參考 - MDN 原型鏈 JavaScript常被描述為一種基于原型的語言(prototype-based language),每個對象擁有一…

dubbo-admin構建報錯

dubbo-admin構建報錯 意思是maven庫里沒有dubbo2.5.4-SNAPSHOT.jar這個版本的dubbo的jar包&#xff0c;把dubbo-admin項目的pom.xml的   <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${proje…