【HTTP版本演變】

在瀏覽器中輸入URL并按回車之后會發生什么

1. 輸入URL并解析

輸入URL后,瀏覽器會解析出協議、主機、端口、路徑等信息,并構造一個HTTP請求(瀏覽器會根據請求頭判斷是否又HTTP緩存,并根據是否有緩存決定從服務器獲取資源還是使用緩存資源)

2. DNS域名解析,將域名解析成對應的IP地址

DNS是一種用于將域名(www.baidu.com)轉換成IP地址(220.181.111.188)的分布式系統。

3. 建立TCP三次握手

4. 瀏覽器發送HTTP/HTTPS請求到web服務器

5. 服務器處理HTTP請求并返回HTTP報文

服務器會接受請求并將其傳遞給請求處理程序并發送HTTP響應,一般響應報文包含:請求網頁以及狀態碼,壓縮類型,如何緩存的頁面,設置cookie;

6. 瀏覽器渲染頁面

7. TCP四次揮手斷開連接

HTTP版本演變

HTTP/1.0

是HTTP協議的第一個正式版本,主要有以下特性:

  • 引入了請求頭和響應頭,支持多種請求方法和狀態碼
  • 不支持持久連接,每次請求都需要建立新的連接

HTTP/1.1

  1. ?長連接

為了解決HTTP/1.0每次請求都需要建立新的連接的問題,HTTP/1.1提出了長連接(持久連接),只要客戶端和服務器任意一端沒有明確提出斷開連接,則保持TCP連接狀態

? ? ? ? 2. 管道網絡傳輸

在同一個TCP連接里面,客戶端可以發起多個請求,只要第一個請求發出去了,不必等其回來,就可以發送第二個請求,可以減少整體的響應時間。

客戶端需要請求兩個資源。以前的做法是,在同一個TCP連接里面,先發送A請求,然后等服務器做出回應,收到后再發出B請求。那么,管道機制則是允許瀏覽器同時發出A請求和B請求。

但是服務器必須按照接受請求的順序發送對這些管道化請求的響應。

如果服務端在處理A請求時耗時比較長,那么后續的請求的處理都會被阻塞,這稱為隊頭阻塞

HTTP/1.1管道解決了請求的對頭阻塞,但沒有解決響應的對頭阻塞。

????????3.對頭阻塞

當順序發送的請求序列中的一個請求因為某種原因被阻塞時,在后面排隊的所有請求也一同被阻塞了,會招致客戶端一值請求不到數據,。

    但是HTTP/1.1仍然存在很多問題:

    • 頭部冗余:每個請求你和響應都需要帶有一定的頭部信息,每次互相發送相同的頭部造成的浪費較多;
    • 服務器是按請求的順序相應的,如果服務器響應慢,會導致客戶端一直請求不到數據,也就是隊頭阻塞;
    • 沒有請求優先級控制
    • 請求只能從客戶端開始,服務器只能被動響應

    HTTP/2

    HTTP/2? ?協議是基于HTTPS的,所以HTTP/2的安全性也是有保障的

    1. 頭部壓縮:HTTP/2使用了HPACK壓縮算法對請求頭和響應頭部進行壓縮,減少了傳輸的頭部數據量,降低了延遲
    2. 二進制幀:HTTP/2將數據分割成二進制幀進行傳輸,分為頭信息幀和數據信息幀,增加了數據傳輸的效率
    3. 并發傳輸:引出Stream概念,多個Stream復用在一條TCP連接,針對不同的HTTP請求用獨一無二的Stream ID來區分,接收端可以通過Stream ID 有序組裝成HTTP消息,不同Stream的幀可以亂序重發送的,因此可以并發不同的Stream,也就是HTTP/2可以并行交錯地發送請求和響應
    4. 服務器推送:在HTTP/2中,服務器可以對客戶端的一個請求發送多個響應,即服務器可以額外的向客戶端推送資源,而無需客戶端明確的請求

    但是HTTP/2仍然存在隊頭阻塞的問題,只不過在傳輸層

    HTTP/2是基于TCP協議來傳輸數據的,TCP是字節流協議,TCP層必須保證收到的字節數據是完整且連續的,這樣內核才會將緩沖區里的數據返回給HTTP應用,那么【當前1個字節數據】沒有到達時,后收到的字節數據只能存放在內核緩沖區中,只有等到者1個字節的數據到達時,HTTP/2應用層才能從內核中拿數據,這就是HTTP/2的隊頭阻塞問題。

    并發實現:

    先來理解三個概念:Stream、Messager、frame

    從圖中可以看出

    • 一個TCP連接包含一個或多個Stream,Stream時HTTP/2并發的關鍵技術
    • Stream包含1個或多個Message,Message對應HTTP/1中的請求或響應,由HTTP頭部和包體構成
    • Message里面包含一條或多條frame,frame時HTTP/2最小單位,以二進制壓縮格式存放HTTP/1中的內容

    1. HTTP 消息可以由多個 Frame 構成

    2. 一個 Frame 可以由多個 TCP 報文構成
      在 HTTP2 連接上,不同 Stream 的幀可以亂序發送(因此可以并發不同的 Stream),接收端可以通過 Stream ID 有序組裝 HTTP 消息。

    HTTP/2 通過 Stream 實現的并發,比 HTTP/1.1 通過 TCP 連接實現并發要牛逼的多,因為當 HTTP/2 實現 100 個并發 Stream 時,只需要建立一次 TCP 連接,而 HTTP/1.1 需要建立 100 個 TCP 連接,每個 TCP 連接都要經過 TCP 握手、慢啟動以及 TLS 握手過程,這些都是很耗時的。

    HTTP/2 還可以對每個 Stream 設置不同優先級,幀頭中的「標志位」可以設置優先級,比如客戶端訪問 HTML/CSS 和圖片資源時,希望服務器先傳遞 HTML/CSS,再傳圖片,那么就可以通過設置 Stream 的優先級來實現,以此提高用戶體驗。

    HTTP/3

    HTTP/3 基于 QUIC 協議,具有以下特點:

    • 零 RTT 連接建立:QUIC 允許在首次連接時進行零往返時間(Zero Round Trip Time)連接建立,從而減少了連接延遲,加快了頁面加載速度。
    • 無隊頭阻塞:QUIC 使用 UDP 協議來傳輸數據。一個連接上的多個 stream 之間沒有依賴,如果一個 stream 丟了一個 UDP 包,不會影響后面的 stream,不存在 TCP 隊頭阻塞
    • 連接遷移:QUIC 允許在網絡切換(如從 Wi - Fi 到移動網絡)時,將連接遷移到新的 IP 地址,從而減少連接的中斷時間。
    • 向前糾錯機制:每個數據包除了它本身的內容之外,還包括了部分其他數據包的數據,因此少量的丟包可以通過其他包的冗余數據直接組裝而無需重傳。向前糾錯犧牲了每個數據包可以發送數據的上限,但是減少了因為丟包導致的數據重傳。

    HTTP 緩存


    將資源(如網頁、圖像、腳本等)的副本存儲在客戶端或中間代理服務器上,以便將來的請求可以直接從緩存中獲取,而不必重新從服務器下載資源。這有助于減少網絡延遲,提高頁面加載速度,并減輕服務器的負擔。

    緩存可以解決什么問題

    • 減少不必要的網絡傳輸,節約帶寬
    • 更快的加載頁面
    • 減少服務器負載,避免服務過載的情況出現

    強制緩存
    強緩存:瀏覽器判斷請求的目標資源是否有效命中強緩存,如果命中,則可以直接從內存中讀取目標資源,無需與服務器做任何通訊。

    Expires 強緩存:設置一個強緩存時間,此時間范圍內,從內存中讀取緩存并返回。

    Cache-Control 強緩存:http1.1 中增加該字段,使用 max-age 指令,可以設置資源在緩存中的最長有效時間,單位為秒。例如,Cache-Control: max-age=3600 表示資源在緩存中保留 3600 秒

    協商緩存
    與強制緩存不同,協商緩存依賴于客戶端和服務器之間的交互,在協商緩存中,服務器在響應中提供了資源的一些標識信息,客戶端在后續請求中通過這些信息來判斷資源是否發生了變化,進而判斷是否需要重新傳輸資源。

    下面是常用于協商緩存的一些頭部字段

    ETag 和 If-None-Match:

    • ETag 是服務器為資源生成的唯一標識符,可以是根據文件內容計算出的哈希值。
    • 客戶端在請求頭部的 If-None-Match 字段中攜帶上次響應的 ETag 值。
    • 服務器比較請求中的 If-None-Match 值與當前資源的 ETag 值,如果匹配,表示資源未發生變化,返回狀態碼 304 Not Modified。

    Last-Modified 和 If-Modified-Since:

    • Last-Modified 是資源的最后修改時間,服務器在響應頭部中返回。

    • 客戶端在請求頭部的 If-Modified-Since 字段中攜帶上次響應的 Last-Modified 時間。

    • 服務器比較請求中的 If-Modified-Since 值與當前資源的 Last-Modified 值,如果請求時間早于資源的最后修改時間,表示資源未發生變化,返回狀態碼 304 Not Modified。

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

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

    相關文章

    Android 16系統源碼_窗口動畫(一)窗口過渡動畫層級圖分析

    一 窗口過渡動畫 1.1 案例效果圖1.2 案例源碼 1.2.1 添加權限 (AndroidManifest.xml) <!-- 系統懸浮窗權限&#xff08;Android 6.0需動態請求&#xff09; --> <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />1.2.2 窗口顯示…

    騰訊云WAF域名分級防護實戰筆記

    基于業務風險等級、合規要求及騰訊云最佳實踐&#xff0c;提供可直接落地的配置方案&#xff0c;供學習借鑒&#xff1a;一、域名分級與防護原則1. ?域名分級清單&#xff08;核心資產&#xff09;???主域名??業務類型??風險等級??合規要求??防護等級?example.com…

    1. 請說出你知道的水平垂直居中的方法

    總結 容器 flex 布局&#xff0c;jsutify-content: center; align-items: center;容器 flex 布局&#xff0c;子項 margin: auto;容器 relative 布局&#xff0c;子項 absolute 布局&#xff0c;left: 50%; top: 50%; transform: translate(-50%, -50%);子項 absolute 布局&…

    VS Code `launch.json` 完整配置指南:參數詳解 + 配置實例

    文章目錄&#x1f4e6; 一、基本結構&#x1f50d; 二、單個配置項詳解示例配置&#xff1a;&#x1f9e9; 三、字段說明與可選值&#x1f4c1; 四、常用變量&#xff08;宏替換&#xff09;&#x1f6e0;? 五、常見配置實例1?? 調試當前打開的 .py 文件2?? 調試 Jupyter …

    使用瀏覽器inspect調試wx小程序

    edge://inspect/#devices調試wx小程序 背景&#xff1a; 在開發混合項目的過程中&#xff0c;常常需要在app環境排查問題&#xff0c;接口可以使用fiddler等工具來抓包&#xff0c;但是js錯誤就不好抓包了&#xff0c;這里介紹一種調試工具-瀏覽器。 調試過程 首先電腦打開edg…

    【論文閱讀】-《Simple Black-box Adversarial Attacks》

    簡單黑盒對抗攻擊 Chuan Guo Jacob R. Gardner Yurong You Andrew Gordon Wilson Kilian Q. Weinberger 摘要 我們提出了一種在黑盒&#xff08;black-box&#xff09;場景下構建對抗樣本&#xff08;adversarial images&#xff09;的極其簡單的方法。與白盒&#xff08;…

    基于ASP.NET+SQL Server實現(Web)企業進銷存管理系統

    企業進銷存管理系統的設計和實現一、摘要進銷存管理是現代企業生產經營中的重要環節&#xff0c;是完成企業資源配置的重要管理工作&#xff0c;對企業生產經營效率的最大化發揮著重要作用。本文以我國中小企業的進銷存管理為研究對象&#xff0c;描述了企業進銷存管理系統從需…

    (LeetCode 面試經典 150 題 ) 15. 三數之和 (排序+雙指針)

    題目&#xff1a;15. 三數之和 思路&#xff1a;排序雙指針&#xff0c;時間復雜度0(n^2nlogn)。 先將數組nums升序排序&#xff0c;方便去重和使用雙指針。第一層for循環來枚舉第一位數&#xff0c;后面使用雙指針來找到第二個、第三個數即可&#xff0c;細節看注釋。 C版本…

    easy-springdoc

    介紹 簡化springdoc的使用&#xff08;可以搭配knife4j-openapi3-jakarta-spring-boot-starter一起使用&#xff09; maven引用 <dependency><groupId>io.github.xiaoyudeguang</groupId><artifactId>easy-springdoc</artifactId><version>…

    配置nodejs,若依

    1.配置node.js環境 Node.js — Download Node.js 1.下載好一路下一步&#xff0c;可以安裝到d盤 裝完之后執行 npm -v 顯示版本號即安裝成功 2.安裝好后新建兩個文件夾&#xff0c;node_cache和node_global 3.配置環境變量 新建變量 在path里編輯變量 4.配置用戶變量 5.…

    Python學習之路(十二)-開發和優化處理大數據量接口

    文章目錄一、接口設計原則二、性能優化策略1. 數據庫優化2. 緩存機制3. 并發模型三、內存管理技巧1. 內存優化實踐2. 避免內存泄漏四、接口測試與監控1. 性能測試2. 日志與監控3. 錯誤處理與限流五、代碼示例&#xff08;Flask 流式處理&#xff09;六、部署建議一、接口設計原…

    【實時Linux實戰系列】實時數據流的網絡傳輸

    在實時系統中&#xff0c;數據流的實時傳輸是許多應用場景的核心需求之一。無論是工業自動化中的傳感器數據、金融交易中的高頻數據&#xff0c;還是多媒體應用中的視頻流&#xff0c;都需要在嚴格的時間約束內完成數據的傳輸。實時數據流的傳輸不僅要求高吞吐量&#xff0c;還…

    C#數組(一維數組、多維數組、交錯數組、參數數組)

    在 C# 中&#xff0c;數組是一種用于存儲固定大小的相同類型元素的集合。數組可以包含值類型、引用類型或對象類型的元素&#xff0c;并且在內存中是連續存儲的。以下是關于 C# 數組的詳細介紹&#xff1a;1. 一維數組聲明與初始化// 聲明數組 int[] numbers; // 聲…

    Dify離線安裝包-集成全部插件、模板和依賴組件,方便安可內網使用

    項目介紹 Dify一鍵離線安裝包&#xff0c;集成安裝了全部插件、模板&#xff0c;并集成了dify全部插件所需的依賴組件。方便你在內網、安可環境等離線狀態下使用。 Dify是一個開源的LLM應用開發平臺。其直觀的界面結合了AI工作流、RAG管道、Agent、模型管理、可觀測性功能等&…

    面試150 翻轉二叉樹

    思路 采用先序遍歷&#xff0c;可以通過新建根節點node&#xff0c;將原來root的右子樹連到去node的左子樹中&#xff0c;root的左子樹連到去node的右子樹中。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): …

    C++-linux系統編程 3.gcc編譯工具

    GCC編譯工具鏈完全指南 GCC&#xff08;GNU Compiler Collection&#xff09;是Linux系統下最常用的編譯器套件&#xff0c;支持C、C、Objective-C等多種編程語言。本章將深入講解GCC的編譯流程、常用選項及項目實戰技巧。 一、GCC編譯的四個核心階段 GCC編譯一個程序需要經過四…

    uView UI 組件大全

    uView UI 是一個基于 uni-app 的高質量 UI 組件庫&#xff0c;提供豐富的跨平臺組件&#xff08;支持 H5、小程序、App 等&#xff09;。以下是其核心組件的分類大全及功能說明&#xff0c;結合最新版本&#xff08;1.2.10&#xff09;整理&#xff1a; &#x1f4e6; 一、基礎…

    QWidget 和 QML 的本質和使用上的區別

    QWidget 和 QML 是 Qt 框架中兩種不同的 UI 開發技術&#xff0c;它們在底層實現、設計理念和使用場景上有顯著區別。以下是它們的本質和主要差異&#xff1a;1. 本質區別特性QWidgetQML (Qt Modeling Language)技術基礎基于 C 的面向對象控件庫基于聲明式語言&#xff08;類似…

    中轉模型服務的風險

    最近發現一些 AI 相關帖子下&#xff0c;存在低質 claude code 中轉的小廣告。 其中轉的基本原理就是 claude code 允許自己提供 API endpoint 和 key&#xff0c;可以使用任意一個 OpenAI API 兼容的供應商&#xff0c;就這么簡單。 進一點 claude token&#xff0c;再混入一點…

    前端Vue.js面試題(3)

    ???目錄 1.v-model的原理是什么樣的&#xff1f; 2.Vue的生命周期&#xff1f; 3.Vue子組件和父組件執行順序&#xff1f; 4.created和mounted的區別&#xff1f; 5.vue中&#xff0c;推薦在哪個生命周期發起請求&#xff1f; 6.keep-alive中的生命周期有哪些&#xf…