詳解http協議

什么是HTTP協議

定義

Http協議即超文本傳送協議?(HTTP-Hypertext?transfer?protocol)?。

它定義了瀏覽器(即萬維網客戶進程)怎樣向萬維網服務器請求萬維網文檔,以及服務器怎樣把文檔傳送給瀏覽器。從層次的角度看,HTTP是面向(transaction-oriented)應用層協議,它是萬維網上能夠可靠地交換文件(包括文本、聲音、圖像等各種多媒體文件)的重要基礎。并且詳細地規定了客戶端瀏覽器與服務器之間互相通信的規則。

http主要方法

http狀態碼

收到請求消息之后,?Web?服務器會對其中的內容進行解析,?通過?URI和方法來判斷“對什么”“進行怎樣的操作”,?并根據這些要求來完成自己的工作,?然后將結果存放在響應消息中。?在響應消息的開頭有一個狀態碼,它用來表示操作的執行結果是成功還是發生了錯誤。

HTTP?狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型。

響應分為五類:信息響應(100–199),成功響應(200–299),重定向(300–399),客戶端錯誤(400–499)和服務器錯誤?(500–599)

HTTP狀態碼列表:

版本變遷

1991年,HTTP/0.9:支持GET請求方式獲取文本數據(比如HTML),且不支持請求頭,響應頭,無法向服務器傳遞太多信息。

1996年,HTTP/1.0:支持POST、HEAD等請求方法,支持請求頭、響應頭等,支持更多種數據類型(不再局限于文本數據)瀏覽器的每次請求都需要與服務器建立一個TCP連接,請求處理完成后立即斷開TCP連接。比如當前HTML在被瀏覽器解析時,發現有一個圖片資源,就是再次建立TCP連接,然后關閉TCP連接。

1997年,HTTP/1.1:

  • 支持PUT,DELETE請求,采用持久連接,多個HTTP請求,可以共用一個TCP連接。

  • 這版協議使用最廣泛。

2015,HTTP/2.0

2018,HTTP/3.0

HTTP報文格式

請求報文

HTTP請求報文第一行是請求行,其后繼的行叫做首部行。每行由一個回車和換行符結束,最后一行再附加一個回車換行符。一個請求報文至少為一行。

  • 請求行:由請求方法、URL(包含參數)和協議版本組成

  • 請求頭部:由多個key-value值組成

  • 空行:請求報文使用空行將請求頭部和請求數據分隔

  • 請求數據:GET方法沒有攜帶數據,POST方法會攜帶一個body

例:

響應報文

  • 狀態行:由協議版本、狀態碼和狀態值組成

  • 響應頭:由多個key-value值組成

  • 空行:響應報文使用空行將響應頭和響應體分隔

  • 響應體:響應數據,在上面是一段HTML

例:

HTTP傳輸原理

概述

以在瀏覽器中輸入www.baidu.com為例:

  1. 對www.baidu.com這個網址進行DNS域名解析,得到對應的IP地址

  2. 根據這個IP,找到對應的服務器,發起TCP的三次握手

  3. 建立TCP連接后發起HTTP請求

  4. 服務器響應HTTP請求,瀏覽器得到html代碼

  5. 瀏覽器解析html代碼,并請求html代碼中的資源(如js、css、圖片等)(先得到html代碼,才能去找這些資源)

  6. 瀏覽器對頁面進行渲染呈現給用戶

  7. 服務器關閉關閉TCP連接

詳細步驟
  1. DNS解析

a)首先會搜索瀏覽器自身的DNS緩存(緩存時間比較短,大概只有1分鐘,且只能容納1000條緩存)

b)如果瀏覽器自身的緩存里面沒有找到,那么瀏覽器會搜索系統自身的DNS緩存

c)如果還沒有找到,那么嘗試從?hosts文件里面去找

d)在前面三個過程都沒獲取到的情況下,就遞歸地去域名服務器去查找

  1. TCP連接建立(三次握手)

拿到域名對應的IP地址之后,User-Agent(一般指瀏覽器)會以一個隨機端口(1024<端口<65535)向服務器的WEB程序(常用的有httpd,nginx)等的80端口。這個連接請求(原始的http請求經過TCP/IP4層模型的層層封包)到達服務器端后(這中間有各種路由設備,局域網內除外),進入到網卡,然后是進入到內核的TCP/IP協議棧(用于識別連接請求,解封包,一層一層地剝開),還有可能要經過Netfilter防火墻(屬于內核的模塊)的過濾,最終達到WEB程序,最終建立了TCP/IP的連接

  1. 發起HTTP請求(建立連接后)

HTTP請求報文由三部分組成:請求行,請求頭、空格、請求正文

  1. 服務器響應http請求,瀏覽器得到html代碼

HTTP響應也由三部分組成:狀態行,響應頭,空格,消息體

狀態行包括:協議版本、狀態碼、狀態碼描述

  1. 瀏覽器解析html代碼,并請求html代碼中的資源

瀏覽器拿到html文件后,就開始解析其中的html代碼,遇到js/css/image等靜態資源時,就向服務器端去請求下載(會使用多線程下載,每個瀏覽器的線程數不一樣),這個時候就用上keep-alive特性了,建立一次HTTP連接,可以請求多個資源,下載資源的順序就是按照代碼里面的順序,但是由于每個資源大小不一樣,而瀏覽器又是多線程請求資源,所以這里顯示的順序并不一定是代碼里面的順序。

  1. 瀏覽器對頁面進行渲染呈現給用戶

最后,瀏覽器利用自己內部的工作機制,把請求的靜態資源和html代碼進行渲染,渲染之后呈現給用戶,瀏覽器是一個邊解析邊渲染的過程。首先瀏覽器解析HTML文件構建DOM樹,然后解析CSS文件構建渲染樹,等到渲染樹構建完成后,瀏覽器開始布局渲染樹并將其繪制到屏幕上。這個過程比較復雜,涉及到兩個概念:reflow(回流)和repain(重繪)。

DOM節點中的各個元素都是以盒模型的形式存在,這些都需要瀏覽器去計算其位置和大小等,這個過程稱為relow;當盒模型的位置,大小以及其他屬性,如顏色,字體,等確定下來之后,瀏覽器便開始繪制內容,這個過程稱為repain。頁面在首次加載時必然會經歷reflow和repain。reflow和repain過程是非常消耗性能的,尤其是在移動設備上,它會破壞用戶體驗,有時會造成頁面卡頓。所以我們應該盡可能少地減少reflow和repain。JS的解析是由瀏覽器中的JS解析引擎完成的。JS是單線程運行,JS有可能修改DOM結構,意味著JS執行完成前,后續所有資源的下載是沒有必要的,所以JS是單線程,會阻塞后續資源下載。

  1. 服務器關閉關閉TCP連接

一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然后如果瀏覽器或者服務器在其頭信息加入了這行代碼:

Connection:keep-alive 

TCP連接在發送后將仍然保持打開狀態,于是,瀏覽器可以繼續通過相同的連接發送請求。保持連接節省了為每個請求建立新連接所需的時間,還節約了網絡帶寬

什么是http2

http2:

  • 二進制格式:1.x是文本協議,然而2.0是以二進制幀為基本單位,可以說是一個二進制協議,將所有傳輸的信息分割為消息和幀,并采用二進制格式的編碼,一幀中包含數據和標識符,使得網絡傳輸變得高效而靈活;

  • 多路復用:2.0版本的多路復用多個請求共用一個連接,多個請求可以同時在一個TCP連接上并發,主要借助于二進制幀中的標識進行區分實現鏈路的復用;

  • 頭部壓縮:2.0版本使用HPACK算法對頭部header數據進行壓縮,從而減少請求的大小提高效率,這個非常好理解,之前每次發送都要帶相同的header,顯得很冗余,2.0版本對頭部信息進行增量更新有效減少了頭部數據的傳輸;

  • 服務端推送:在2.0版本允許服務器主動向客戶端發送資源,這樣在客戶端可以起到加速的作用;

http2的重要改動:
  • 降低延遲(多路復用):使用多路復用來降低高延遲的問題,多路復用指的是使用Stream讓多個請求可以共享一個TCP連接,解決HOL?Blocking(head?of?line?blocking)的問題,同時提升帶寬利用率。

    • HTTP1.1中keep-alive用的是http?pipelining本質上也是multiplexing,但是具體實現方案不理想?

    • 主流瀏覽器都默認禁止pipelining,也是因為HOL阻塞問題導致。

  • 服務端推送:HTTP1.X的推送都是半雙工,所以在2.0是實現真正的服務端發起請求的全雙工,另外在WebSocket在這一塊大放異彩

  • 請求優先級:針對引入多路復用的一個兜底方案,多路復用使用多個Stream的時候容易單請求阻塞問題,也就是前文所說的和管道連接一樣的問題,SPDY通過設置優先級的方式讓重要請求優先處理,比如頁面的內容應該先進行展示,之后再加載CSS文件美化以及加載腳本互動等等,實際減少用戶不會在等待過程中關閉頁面的幾率

  • Header壓縮:HTTP1.X的header很多時候都是多余的,所以2.0?會自動選擇合適的壓縮算法自動壓縮請求加快請求和響應速度。

什么是http3

這個版本是劃時代的改變,在HTTP3.0中,將棄用TCP協議,改為使用基于UDP協議的QUIC協議實現。需要注意QUIC是谷歌提出的(和2.0?的SPDY?一樣),QUIC指的是快速?UDP?Internet?連接,既然使用了UDP,那么也意味著網絡可能存在丟包和穩定性下降,谷歌當然不會讓這樣的事情發生,所以他們提出的QUIC既可以保證穩定性,又可以保證SSL的兼容,因為HTTP3上來就會和TLS1.3一起上線。

基于這些原因,制定網絡協議IETF的人馬上基本都同意了QUIC的提案(太好了又能白嫖成果),于是HTTP3.0?就這樣來了。但是這只是最基本的草案,后續的討論中希望QUIC可以兼容其他的傳輸協議,最終的排序如下IP?/?UDP?/?QUIC?/?HTTP。另外TLS有一個細節優化是在進行連接的時候瀏覽器第一次就把自己的密鑰交換的素材發給服務器,這樣進一步縮短了交換的時間。

為什么要使用http3

為什么HTTP3.0要從協議根本上動刀,那是因為HTTP/2雖然解決了HTTP協議無法多路復用的問題,但是沒有從TCP層面解決問題,具體的TCP問題體現如下:

  • RTT:RTT是Round?Trip?Time的縮寫,簡單來說就是通信一來一回的時間。

  • 隊頭阻塞,HTTP/2?多個請求跑在一個?TCP?連接中,如果此時序號較低的網絡請求被阻塞,那么即使序列號較高的?TCP?段已經被接收了,應用層也無法從內核中讀取到這部分數據,從?HTTP?視角看就是多個請求被阻塞了,并且頁面也只是加載了一部分內容;

  • TCP?和?TLS?握手時延縮短:TCL?三次握手和?TLS?四次握手,共有?3-RTT?的時延,HTPT/3最終壓縮到1?RTT(難以想象有多快);

  • 連接遷移需要重新連接,移動設備從?4G?網絡環境切換到?WIFI?時,由于?TCP?是基于四元組來確認一條?TCP?連接的,那么網絡環境變化后,就會導致?IP?地址或端口變化,于是?TCP?只能斷開連接,然后再重新建立連接,切換網絡環境的成本高

所以后續谷歌的研究方向轉為研究QUIC,實際上就是改良UDP協議來解決TCP協議自身存在的問題

為什么http3選擇UDP協議

這就引出另一個問題,為什么3.0有很多協議可以選擇為什么使用UDP,通常有下面的幾個點:

  • 基于TCP?協議的設備很多,兼容十分困難

  • TCP是Linux內部的重要組成,修改非常麻煩,或者說壓根不敢動

  • UDP本身無連接的,沒有建立連接和斷連的成本

  • UDP數據包本身就不保證穩定傳輸所以不存在阻塞問題(屬于愛要不要)

  • UDP改造相對其他協議改造成本低很多?

HTTP協議真的是無狀態的么?

仔細閱讀HTTP1.x和HTTP/2以及HTTP3.0三個版本的對比,其實會發現HTTP無狀態的定義偷偷發生了變化的,為什么這么說?

我們需要弄清一個概念,那就是Cookie和Session雖然讓HTTP實現了“有狀態”,但是其實這和HTTP協議本身的概念是沒有關系的。

Cookie和Session的出現根本目的是保證會話狀態本身的可見性,兩者通過創立多種獨立的狀態“模擬”用戶上一次的訪問狀態,但是每一次的HTTP請求本身并不會依賴上一次HTTP的請求,單純從廣義的角度看待其實所有的服務都是有狀態的,但是這并不會干擾HTTP1.X本身無狀態的定義。

此外HTTP協議所謂的無狀態指的是每個請求是完全獨立的,在1.0備忘錄定義中也可以看出一次HTTP連接其實就是一次TCP連接,到了HTTP1.1實現了一個TCP多個HTTP連接依然是可以看作獨立的HTTP請求。

說了這么多,其實就是說HTTP1.X在不靠Cookie和Session扶著的時候看做無狀態是對的,就好比游戲里面的角色本身的數值和武器附加值的對比,武器雖然可以讓角色獲得某種狀態,但是這種狀態并不是角色本身特有的,而是靠外力借來的。

然而隨著互聯網發展,到了HTTP/2和HTTP3之中HTTP本身擁有了“狀態”定義,比如2.0關于HEADER壓縮產生的HPACK算法(需要維護靜態表和動態表),3.0還對HPACK算法再次升級為QPACK讓傳輸更加高效。

所以總結就是嚴謹地來說HTTP1.X是無狀態的,在Cookie和Session的輔助下實現了會話訪問狀態的保留。到了HTTP/2之后HTTP是有狀態的,?因為在通信協議中出現了一些狀態表來維護雙方重復傳遞的Header字段減少數據傳輸。?

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

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

相關文章

第四十一天 | 62.不同路徑 63.不同路徑|| 343.整數拆分 96.不同的二叉搜索樹

題目&#xff1a;62.不同路徑 1.二維dp數組dp[i][j]含義&#xff1a;到達&#xff08;i&#xff0c;j&#xff09;位置有dp[i][j]種方法。 2.動態轉移方程&#xff1a;dp[i][j] dp[i - 1][j] dp[i][j - 1] 3.初始化&#xff1a;dp[0][j] 1, dp[i][0] 1 &#xff08;第一…

Vue3設置緩存:storage.ts

在vue文件使用&#xff1a; import { Local,Session } from //utils/storage; // Local if (!Local.get(字段名)) Local.set(字段名, 字段的值);// Session Session.getToken()storage.ts文件&#xff1a; import Cookies from js-cookie;/*** window.localStorage 瀏覽器永…

uniapp 安卓 Pc端真機瀏覽器調試

下載插件:真機模擬瀏覽器 1. 安裝, 每次啟用時使用usb 線連接電腦, 并且打開手機或者POS (調試設備)開發者模式, 比如我的是pos 機 則在系統設置中找到版本號,點擊多次就會觸發開發者模式 2.打開真機模擬軟件,打開后會打開一個瀏覽器,如果想要模擬google的瀏覽器則 在瀏覽器地…

精準鍵位提示,鍵盤盲打輕松入門

在說明精準鍵位提示之前&#xff0c;我們先來看一張圖&#xff1a; 這是一張標準的基準鍵位圖&#xff0c;也就是打字時我們雙手的8個手指放在基準鍵位上&#xff0c;在打不同的字母時&#xff0c;我們的手指以基準鍵位為中心&#xff0c;或上、或下、或左、或右&#xff0c;在…

202109青少年軟件編程(Python)等級考試試卷(四級)

第 1 題 【單選題】 執行如下 Python 代碼后, 結果是?( ) def inverse(s,n=0): while s:n = n * 10 + s % 10s = s // 10return nprint

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello,World!程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…

Docker常用軟件安裝

文章目錄 1.安裝Tomcat1.docker hub查找鏡像并復制拉取鏡像命令2.拉取鏡像到本地1.執行官網命令2.查看是否拉取成功 3.啟動tomcat4.退出和重啟1.由于是以交互方式啟動的&#xff0c;所以不方便&#xff0c;直接ctrl c退出2.查看當前的容器3.使用docker start 命令啟動容器&…

【cocos creator 】生成六邊形地圖

想要生成一個六邊形組成的地圖 完整代碼示例 以下是完整的代碼示例&#xff0c;包含了注釋來解釋每一步&#xff1a; cc.Class({extends: cc.Component,properties: {hexPrefab: {default: null,type: cc.Prefab},mapWidth: 10, // 網格的寬度&#xff08;六邊形的數量&am…

前端React老項目打包caniuse-lite報錯解決思路

1、下載項目&#xff0c;先更新.npmrc文件&#xff1a; registryhttp://registry.npmmirror.com 2、安裝依賴&#xff0c;本地啟動&#xff0c;運行正常&#xff0c;但直接提交代碼線上打包時會報錯&#xff1a; “ 未找到相關的合并請求。” 打開日志頁面&#xff0c;報錯信息…

【Flutter】線性布局彈性布局層疊布局

&#x1f525; 本文由 程序喵正在路上 原創&#xff0c;CSDN首發&#xff01; &#x1f496; 系列專欄&#xff1a;Flutter學習 &#x1f320; 首發時間&#xff1a;2024年5月25日 &#x1f98b; 歡迎關注&#x1f5b1;點贊&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

4、PHP的xml注入漏洞(xxe)

青少年ctf&#xff1a;PHP的XXE 1、打開網頁是一個PHP版本頁面 2、CTRLf搜索xml&#xff0c;發現2.8.0版本&#xff0c;含有xml漏洞 3、bp抓包 4、使用代碼出發bug GET /simplexml_load_string.php HTTP/1.1 補充&#xff1a; <?xml version"1.0" encoding&quo…

內網穿透--Nps-自定義-上線

免責聲明:本文僅做技術交流與學習... 目錄 Nps項目: 一圖通解: 1-下載nps/npc 2-服務端啟動 訪問web網頁: 添加客戶端&#xff0c;生成密匙. 3-kali客戶端連接服務端 4-添加協議隧道. 5-kali生成后門&#xff1a; 6-kali創建監聽: Nps項目: https://github.com/ehang…

藍橋杯Web開發【模擬題一】15屆

1.動態的Tab欄 日常在使用移動端 APP 或訪問 PC 端網站的時候&#xff0c;常常發現在一些有工具欄或者 Tab 欄的頁面會有頂欄固定的效果。簡單來說&#xff0c;在頁面未開始滾動時頂欄處在其原有的位置上&#xff0c;當頁面向下滾動一定區域后&#xff0c;頂欄會跟隨滾動固定在…

HTTPS證書——網站如何實現HTTPS訪問?

實現網站HTTPS訪問可以簡化為以下四個基本步驟&#xff0c;確保過程既通俗易懂又條理清晰&#xff1a; 1. 申請SSL證書 - 目的&#xff1a;SSL證書是實現HTTPS加密的關鍵&#xff0c;它驗證了網站的身份&#xff0c;并提供了加密數據所需的密鑰。 - 操作&#xff1a;首先&…

超鏈接的魅力:HTML中的 `<a>` 標簽全方位探索!

&#x1f310;超鏈接的魅力&#xff1a;HTML中的 標簽全方位探索&#xff01; &#x1f3de;?基礎營地&#xff1a;認識 <a> 標簽&#x1f6e0;?基本語法&#x1f4da;屬性擴展 &#x1f680;實戰演練&#xff1a;超鏈接的多樣玩法&#x1f308;內鏈與外鏈&#x1f4c…

TypeScript(持續更新中...)

1.TypeScript是什么&#xff1f; TypeScript是javaScript的超集。 2.使用TypeScript 1&#xff09;全局安裝nodejs 2&#xff09;安裝TypeScript編譯器 npm i -g typescript 3.編譯ts文件 //注意&#xff1a;需要在ts文件同級目錄執行此命令&#xff0c;否則會報找不到…

遙感、GIS和GPS技術在水文、氣象、災害、生態、環境及衛生等領域中的應用

【科研必備】遙感、GIS和GPS技術在水文、氣象、災害、生態、環境及衛生等領域中的應用 (qq.com)https://mp.weixin.qq.com/s?__bizMzg2NDYxNjMyNA&mid2247565057&idx4&snecec1f5396132122acf02b188f7b74ac&chksmce6515eaf9129cfc9a6c4a16413c0d746003cc192132…

PostgreSQL 教程

## PostgreSQL 教程 ### 1. PostgreSQL 概述 PostgreSQL 是一個開源的對象關系型數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;以其高擴展性和合規性聞名&#xff0c;支持 SQL 和 JSON 查詢。 ### 2. 安裝與配置 - **下載與安裝**&#xff1a;從 PostgreSQL 官方…

C++ Primer Plus第十七章復習題

1、iostream文件在CI/O中扮演這種角色&#xff1f; 答&#xff1a; iostream文件定義了用于管理輸入和輸出的類、常量和操縱符,這些對象管理用于處理I/O的流和緩沖區。該文件還創建了一些標準對象(cin、cout、cerr和 clog以及對應的寬字符對象)&#xff0c;用于處理與每個程序…

【論文筆記】| 微調LLM晶體生成

【論文筆記】| 微調LLM晶體生成 Fine-Tuned Language Models Generate Stable Inorganic Materials as Text NYU, ICLR 2024 Theme&#xff1a;Material Generation Main work&#xff1a; 微調大型語言模型以生成穩定的材料 可靠性&#xff1a;在樣本結構中&#xff0c;90% …