http1.X與2.0

HTTP

HTTP 1.X

  1. HTTP是建立在TCP協議上的,HTTP協議的瓶頸及優化都是基于TCP協議本身的特性。

  2. TCP建立連接時有三次握手 會有1.5RTT的延遲,為了避免每次請求都經歷握手待來的延遲,應用層會選擇不同策略的http長連接。

HTTP 1.0 連接不能復用以及有head of line blocking問題。

http1.0協議頭里可以設置Connection:Keep-Alive。在header里設置Keep-Alive可以在一定時間內復用連接,具體復用時間的長短可以由服務器控制,一般在15s左右。到http1.1之后Connection的默認值就是Keep-Alive,如果要關閉連接復用需要顯式的設置Connection:Close。
<br />
head of line blocking會因為一個request沒有到達服務器或者一個response因為網絡沒有及時返回而影響后續所有請求。

連接復用問題

tcp長鏈接
http long-polling

客戶端在初始狀態會發送一個polling請求到服務器,服務器并不會馬上返回業務數據,而是等待有新的業務數據產生時返回。所以連接會被保持,一旦結束馬上又會發起一個新的polling請求,反復如此。

http streaming

與long-polling不同,server并不會結束初始的streaming請求,而是持續的通過這個通道返回最新的業務數據,但這個通道時單向的。

web socket

與傳統的 tcp socket連接相似,也是基于tcp協議,并提供雙向的數據通道。

解決head of line blocking

http pipelining

讓每個請求不用等待其他請求的response返回之后才發出,而是幾乎在同一時間把request發送給服務器。

SPDY

http 1.X存在諸多問題,在嘗試了各種優化手段后提出的SPDY方案。

SPDY目標

  • 降低延遲,客戶端的單連接單請求,server的FIFO響應隊列都是延遲的大頭。
  • http最初設計都是客戶端發起請求,然后server響應,server無法主動push內容到客戶端。
  • 壓縮http header,http1.x的header越來越膨脹,cookie和user agent很容易讓header的size增至1kb大小,甚至更多。而且由于http的無狀態特性,header必須每次request都重復攜帶,很浪費流量。

SPDY基礎功能

  • 多路復用。多路復用通過多個請求stream共享一個tcp連接的方式,解決了http 1.x hold of line blocking 的問題,降低了延遲同時提高了帶寬的利用率。
  • 請求優先級。多路復用帶來一個新的問題,在連接共享的基礎上可能導致一些關鍵請求被阻塞。
  • header壓縮。 http1.X的 header很多時候都是重復多余的。選擇合適的壓縮算法可以減小包的大小和數量。

SPDY高級功能

  • server推送。 http1.x只能由客戶端發起請求,然后服務器被動的發送response。開啟server push之后,server通過
    X-Associated-Content header
    告知客戶端會有新的內容推送過來。
  • server暗示。 和server push不同的是,server hint并不會主動推送內容,只是告訴有新的內容產生,內容的下載還是需要客戶端主動發起請求。server hint通過
    X-Subresources header
    來通知。

HTTP 2.0

  • 客戶端向server發送request這種基本模式不會變。
  • 老的scheme不會變,使用
    http://和https://
    的服務和應用不會要做任何更改。
  • 使用http1.x的客戶端和服務器可以無縫的通過代理方式轉接到http2.0 上
  • 不識別http2.0的代理服務器可以將請求降級到http1.x

HTTP 2.0主要改動

新的二進制格式

http 1.x是明文協議,格式由

strat line
,
header
,
body
組成。需要做協議解析來識別這3哥部分,http1.x的解析是基于文本的,而文本格式解析存在天然缺陷,二進制比文本格式更方便且健壯。


http 2.0的格式定義更接近tcp。由
Length
,
Type
,
Flags
,
Stream ID
,
Payload
5個部分組成。

  • length
    定義了整個frame的開始到結束
  • type
    定義frame的類型
  • flags
    用bit位定義了一些重要的參數
  • stream id
    用作流控制
  • payload
    就是request的正文

連接共享

stream id
作用就是連接共享機制,一個request對應一個stream并分配一個id,這樣一個連接上可以有多個stream,每個stream的frame隨機混雜在一起,接收方根據stream id將frame再歸屬到各自不同的request里面。每個stream都可以設置優先級和依賴。

header壓縮

http2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,避免重復header傳輸,減少傳輸大小。

壓縮算法選擇

SPDY/2使用的是gzip 壓縮算法,后來出現

BREACH
CRIME
2種攻擊方式,即使走SSL的SPDY也可以破解內容,http2.0采用
HPACK
的壓縮算法。

重置連接表現

對于http 1.x來說,是通過設置tcp segment里的reset flag來通知對端關閉連接。http2.0引入

RST_STREAM
類型的frame,可以在不斷開連接的前提下取消某個request的stream。

流量控制

http2.0 通過類似

receive window
的做法,數據的接收方通過告知對方自己的
flow window
大小表明自己還能接收多少數據。只有Data類型的 frame才有流量控制功能。

服務推送

http2.0 通過push的方式將客戶端需求的內容預先推送過去,也叫

cache push
。如果客戶端退出,需取消
server push
,可以通過發送
RST_STREAM
類型的frame來做到。

Nagle Algorithm/TCP Delayed Ack

Nagle Algorithm/TCP Delayed Ack
是一組對立的算法。http2.0可以通過
TCP_NODELAY
禁用Nagle或
TCP_QUICKACK
禁用ACK。官方推薦設置
TCP_NODELAY

更安全的SSL

HTTP2.0使用了tls的拓展ALPN來做協議升級,除此之外加密這塊還有一個改動,HTTP2.0對tls的安全性做了近一步加強

本文轉載于:猿2048?https://www.mk2048.com/blog/blog.php?id=kcihk1j&title=http1.X與2.0

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

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

相關文章

php代碼清除空格注解,去除php注釋和去除空格函數分享

雖然php5中已有php_strip_whitespace方法可以返回刪除注釋和空格后的PHP源碼的功能&#xff0c;為了學習&#xff0c;這里為大家提供一個自己的方法&#xff0c;也可以去除代碼中的空白和注釋&#xff0c;代碼如下&#xff1a;. 代碼如下:/*** 去除代碼中的空白和注釋* param s…

包裝的重要性

我記得大約15年前開始學習Java的時候。 我讀了很多有關“包裝”和“命名空間”的東西&#xff0c;但我完全不了解。 可悲的是&#xff1a;雖然包裝的某些方面幾乎為業內每個人所了解&#xff0c;但其他方面卻并非如此。 因此&#xff0c;讓我們看一下哪些軟件包最適合。 命名空…

我的python學習筆記全集_我的python學習筆記

(此文是在實際工程中遇到的一些小問題&#xff0c;給予解決和整理。解決方法大多來自網上零散的文章。)1——如下代碼&#xff0c;a[1,2,3]bab也是[1,2,3]了&#xff0c;接著a[0]4a[1]5a[2]6此時a變成[4,5,6]了&#xff0c;再看b&#xff0c;a變了之后沒有對b進行新的引用&…

課時28.假鏈接(掌握)

什么是假鏈接&#xff1f; 就是點擊之后不會跳轉的鏈接我們稱之為假鏈接。 假鏈接存在的意義&#xff1f; 在企業開發前期&#xff0c;其他界面都沒有寫出來&#xff0c;那么&#xff0c;我們就不知道應該跳轉到什么地方&#xff0c;所以就只能使用假鏈接來代替&#xff0c;…

筆記45 | 代碼性能優化建議[轉]

地址 筆記45 | 代碼性能優化建議[轉] 目錄 前言避免創建不必要的對象選擇Static而不是Virtual常量聲明為Static Final避免內部的Getters/Setters使用增強的For循環使用包級訪問而不是內部類的私有訪問避免使用float類型使用庫函數謹慎使用native函數關于性能的誤區前言 通常來說…

導彈攔截

鏈接 分析&#xff1a;經典DP題&#xff0c;最長不下降子序列的變種&#xff0c;同時需要記錄路徑&#xff0c;用pre[]數組記錄當前結點的前一個結點的方法很妙 1 #include "iostream"2 #include "cstdio"3 #include "cstring"4 #include "…

JUnit4參數化和理論示例

我始終依靠TestNG將參數傳遞給測試方法&#xff0c;以便為我的測試或套件提供一些靈活性。 但是&#xff0c;使用JUnit4可以實現相同的靈活性。 要使用它很簡單&#xff1a; package com.marco.test;import java.util.Arrays;import java.util.Collection;import junit.fram…

楊杰matlab神經網絡30例,MATLAB神經網絡30例

實例1 BP神經網絡在非線性函數擬合中的應用11.1 理論基礎11.1.1 BP網絡概述11.1.2 BP神經網絡的MATLAB函數21.2 非線性函數擬合方法6實例2 主元BP神經網絡在股票價格預測中的應用122.1 理論基礎122.1.1 主成分分析的原理122.1.2 主元神經網絡與股票預測142.2 股票價格的預測方法…

HTMLCSS 問題

1.子div使用浮動&#xff0c;父div高度自適應(個人感覺好用) 方法&#xff1a; css: <style> .clear{ clear:both} </style> html&#xff1a;在父div關閉之前添加<div class"clear"></div> 本文轉載于:猿2048?https://www.mk2048.com/…

python matplotlib數據可視化教程_matplotlib的Python數據可視化和探索——入門指南

matplotlib——最受歡迎的Python庫&#xff0c;用于數據可視化和探索我喜歡在Python中使用matplotlib。這是我學會掌握的第一個可視化庫&#xff0c;此后一直存在。matplotlib是最受歡迎的用于數據可視化和探索的Python庫&#xff0c;這是有原因的——它提供的靈活性和敏捷性是…

mysql 查詢所有子節點的相關數據

定義一個函數 CREATE DEFINERrootlocalhost FUNCTION getColumnChildLst(rootId INT) RETURNS varchar(1000) CHARSET utf8 BEGINDECLARE sTemp VARCHAR(1000);DECLARE sTempChd VARCHAR(1000);SET sTemp $;SET sTempChd cast(rootId as CHAR);WHILE sTempChd is not null DOS…

怎么用PHP實現年月日date,PHP date函數用法,php年月日寫法

日期和時間信息在 PHP 內部是以 64 位數字存儲的&#xff0c; 它可以覆蓋當前時間前后 2920 億年的時間&#xff0c;這個范圍之廣&#xff0c;足以滿足現有應用的實際需求。需要注意的是&#xff0c; 這些PHP時間函數都是依賴服務器的區域設置的&#xff0c; 所以在使用它們的時…

python氣象衛星云圖解析_【我教你系列】想要實時的地球圖像作為桌面?

Python 定時獲取衛星圖像做為桌面背景簡介這兩天看新聞的時候&#xff0c;突然發現最近有個臺風產生&#xff0c;并且在不斷的增強中。幸運的是從中央氣象臺預報的路徑來看&#xff0c;不會登陸我國。也正是通過這則新聞&#xff0c;我發現了一個不錯的衛星云圖網站。(ps:這篇文…

CSS權重的比較方法

CSS的權重如下&#xff1a; !important Infinity正無窮 行間樣式 1000 id 100 class|屬性|唯類 10 標簽|偽元素 1 通配符 0 256進制 當出現多個選擇器時 在同一行的選擇器權重相加即可 當兩個混合選擇器權重相同時優先選擇后面的選擇器 如&#xff1a; html <…

python_day8 面向對象常用 補充

__str__ 作用本來 打印 類對象是 打印的內存地址 但是在類中 增加 __str__ 參數 以后 再打印這個 類對象 就是顯示 __str__中的 return __del__作用 當 實例化的對象 在內存中 被釋放的時候執行 item操作通過 set get del 操作 item最終目的是將 類里面的 變量 像 字典一樣操作…

Spring中的@Cacheable開銷

Spring 3.1引入了很棒的緩存抽象層 。 最后&#xff0c;我們可以放棄所有本地化的方面&#xff0c;裝飾器和污染我們與緩存相關的業務邏輯的代碼。 從那時起&#xff0c;我們可以簡單地注釋重量級方法&#xff0c;并讓Spring和AOP機械完成工作&#xff1a; Cacheable("bo…

電工接線模擬仿真軟件_VERICUT數控加工仿真軟件,最強的數控加工模擬軟件,你知道么?...

VERICUT數控加工仿真軟件,最強的數控加工模擬軟件VERICUT軟件及功能簡介1、VERICUT軟件簡介VERICUT是美國CGTech公司開發一款專業的數控加工仿真軟件&#xff0c;是當前全球數控加工程序驗證、機床模擬、工藝程序優化軟件領域的領導者。該軟件自1988年開始推向市場以來&#xf…

php數據庫創建文件失敗怎么回事,安裝zblogPHP提示“創建c_option.php失敗”解決方法...

有zblog用戶反應在安裝zblog的最后一步時提示“創建c_option.php失敗”&#xff0c;如下圖&#xff1a;本文來說明下這個問題的原因和解決辦法。問題產生的原因&#xff1a;c_option.php是zblog的數據庫配置文件&#xff0c;當安裝完成的時候程序會自動創建這個文件。如果你的主…

一次搞清楚Mysql聯合索引,以及聯合索引究竟用了多少

一群DBA朋友聊天&#xff0c;突然拋出一個某公司聯合索引的面試題&#xff0c;當時好多人都蒙了&#xff0c;這次針對這個問題&#xff0c;做了個簡單的實驗&#xff0c;把聯合索引的作用一次搞清楚 問題大概是這樣的&#xff0c;聯合索引&#xff08;a,b,c,d&#xff09;下面這…

CSS Variables

CSS原生變量(CSS自定義屬性) 示例地址&#xff1a;https://github.com/ccyinghua/Css-Variables 一、css原生變量的基礎用法 變量聲明使用兩根連詞線"--"表示變量&#xff0c;"$color"是屬于Sass的語法&#xff0c;"color"是屬于Less的語法&a…