重新学习的HTTP协议
在雞年的最后一天完成了這篇文章。表示愉悅的同時,更要祝福大家狗年大吉吧....
下方是一根正經的分割線...
重新學習前端知識,自己整理總結了些內容...所以想分享給大家。在分享的同時,也可以自己學習的更扎實...如果有錯誤或者理解不正確的地方,麻煩告知我會及時更正。同時也非常歡迎大家一起討論。鞠躬。 Github地址:項目地址?(不定期更新...
定義
HTTP( HyperText Transfer Protocol )超文本傳輸協議 ,是一種用于分布式、協作式和超媒體信息系統的應用層協議。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。
TCP/IP & HTTP
在這里我們研究的是HTTP,自然要知道它所處在哪個模型中,答案是應用層 因為HTTP是基于TCP/IP開發的協議,看過HTTP協議的同學肯定都知道,有句話概述HTTP協議為無差錯的協議,按序傳輸,未分段的數據流,這其實說的就是TCP協議。
- 獲取主機名
- DNS 緩存/ 解析 獲取服務器IP + 端口 (瀏覽器緩存,系統緩存,路由器緩存,IPS服務器緩存,根域名服務器緩存,頂級域名服務器緩存,主域名服務器緩存)
- 連接到服務器 (這里其實是TCP連接)
- 通過TCP信道發送一個HTTP請求
- 服務器讀取一個HTTP請求
- 服務器查找所需資源并通過TCP信道返回資源
- 關閉TCP連接
版本變遷
HTTP客戶端請求和服務端響應(目前主流的HTTP1.1和HTTP2
- 請求組成
- 起始行(start line) 請求方法 + 請求URI + 協議版本
- 報文首部(Header)
- 空行
- 報文主體
- 響應組成
- 起始行(start line) 協議版本 + 狀態碼 + 狀態嘛的原因短語
- 報文首部(Header)
- 空行
- 報文主體
- 請求方法
- GET — 獲取資源
- HEAD — 獲得報文首部
- POST -- 傳輸實體文本
- PUT -- 傳輸文件
- DELETE — 刪除文件
- CONNECT — 要求用隧道協議連接代理
- OPTIONS — 詢問支持的方法
- TRACE — 追蹤路徑
- 首部文件 這一塊圖解HTTP的第六章有詳細內容
- 通用首部
- 信息:Connection/Date/MIME-Version/Trailer/Update/Via
- 緩存:Cache-Control/Pragma
- 請求首部
- 信息:Client-IP/From/Host/Referer/UA-Color/UA-CPU/UA-Disp/UA-OS/UA-Pixels/User-Agent
- Accept:Accept/Accept-Charset/Accept-Encoding/Accept-Language/TE
- 條件請求:Expect/If-Match/If-Modified-Since/If-None-Match/If-Range/If-Unmodified-Since/Range
- 安全請求:Authorization/Cookie/Cookie2
- 代理請求:Max-Forward/Proxy-Authorization/Proxy-Connection
- 響應首部
- 信息:Age/Public/Retry-After/Server/Title/Warning
- 協商:Accept-Ranges/Vary
- 安全響應:Proxy-Authorization/Set-Cookie/Set-Cookie2/WWW-Authenticate
- 實體首部
- 信息:Allow/Location
- 內容:Content-Base/Content-Encoding/Content-Language/Content-Length/Content-Location/Content-MD5/Content-Range/Content-Type
- 實體緩存:ETag/Expires/Last-Modified
- 100 Continue 繼續,一般在發送post請求時,已發送了http header之后服務端將返回此信息,表示確認,之后發送具體參數信息
- 200 OK 正常返回信息
- 201 Created 請求成功并且服務器創建了新的資源
- 202 Accepted 服務器已接受請求,但尚未處理
- 206 Partial Content 響應報文包含了多個范圍內的內容
- 301 Moved Permanently 請求的網頁已永久移動到新位置。
- 302 Found 臨時性重定向。
- 303 See Other 臨時性重定向,且總是使用 GET 請求新的 URI。
- 304 Not Modified 自從上次請求后,請求的網頁未修改過。
- 400 Bad Request 服務器無法理解請求的格式,客戶端不應當嘗試再次使用相同的內容發起請求。
- 401 Unauthorized 請求未授權。
- 403 Forbidden 禁止訪問。
- 404 Not Found 找不到如何與 URI 相匹配的資源。
- 500 Internal Server Error 最常見的服務器端錯誤。
- 503 Service Unavailable 服務器端暫時無法處理請求(可能是過載或維護)。
各版本簡介
HTTP/1.0
- 早先的HTTP/1.0是一種無狀態、無連接的應用層協議。規定瀏覽器和服務器保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器處理完成后立即斷開TCP連接(無連接),服務器不跟蹤每個客戶端也不記錄過去的請求(無狀態)
- 這種無狀態性可以借助cookie/session機制來做身份認證和狀態記錄。而下面兩個問題就比較麻煩了。
- 首先,無連接的特性導致最大的性能缺陷就是無法復用連接。每次發送請求的時候,都需要進行一次TCP的連接,而TCP的連接釋放過程又是比較費事的。這種無連接的特性會使得網絡的利用率非常低。
- 其次就是就是隊頭阻塞(head of line blocking)。由于HTTP1.0規定下一個請求必須在前一個請求響應到達之前才能發送。假設前一個請求響應一直不到達,那么下一個請求就不發送,同樣的后面的請求也給阻塞了。
HTTP/1.1
- 長連接,通過設置Keep-Alive可以保持HTTP連接不斷開,避免了每次客戶端與服務器請求都要重復建立釋放建立TCP連接,提高了網絡的利用率。可以在請求頭中攜帶Connection: false來告知服務器關閉請求。
- 支持請求管道化(pipelining)。 基于長連接,使得請求管線化成為可能。管線化使得請求能夠并行傳輸。舉個例子來說,假如響應的主體是一個html頁面,頁面中包含了很多img,這個時候keep-alive就起了很大的作用,能夠進行并行發送多個請求。(客戶端依據域名來向服務器建立連接,一般PC瀏覽器會針對單個域名的服務器同時建立6 ~ 8個連接,手機端一般控制在4 ~ 6個。這也是為什么很多大型網站設置不同的靜態資源CDN域名來加載資源。) 需要注意的是,服務器必須按照客戶端請求的先后順序依次回送相應的結果,以保證客戶端能夠區分出每次請求的響應內容。 也就是說,HTTP管道化可以讓我們把先進先出隊列從客戶端(請求隊列)遷移到服務端(響應隊列)。
如圖所示,客戶端同時發了兩個請求分別來獲取html和css,假如說服務器的css資源先準備就緒,服務器也會先發送html再發送css。 同時,管道化技術只是使得客戶端能夠往一個服務器同時發送一組請求,假若客戶端想往這個相同的服務器發起另一組請求,也必須等待上一組請求全部響應完畢。 可見,HTTP1.1解決隊頭阻塞(head of line blocking)還不徹底。
- 緩存處理,支持斷點傳輸,以及增加了Host字段(使得一個服務器能夠用來創建多個Web站點)。
HTTP/2.0
HTTP/2 is the future of the Web 這是 Akamai 公司建立的一個官方的演示,用以說明 HTTP/2 相比于之前的 HTTP/1.1 在性能上的大幅度提升。 同時請求 379 張圖片,從Load time 的對比可以看出 HTTP/2 在速度上的優勢。 順口提一句 HTTP/2 協議是從 SPDY 演變而來,SPDY 已經完成了使命并很快就會退出歷史舞臺(例如 Chrome 將在「2016 年初結束對 SPDY 的支持」;Nginx 已經正式支持 HTTP/2 后,也不再支持 SPDY)
- 二進制分幀 HTTP2.0通過在應用層和傳輸層之間增加一個二進制分幀層,突破了HTTP1.1的性能限制、改進傳輸性能。
可見,雖然HTTP2.0的協議和HTTP1.x協議之間的規范完全不同了,但是實際上HTTP2.0并沒有改變HTTP1.x的語義。 簡單來說,HTTP2.0只是把原來HTTP1.x的header和body部分用frame重新封裝了一層而已。
- 多路復用 下面是幾個概念:
- 流(stream):已建立連接上的雙向字節流。
- 消息:與邏輯消息對應的完整的一系列數據幀。
- 幀(frame):HTTP2.0通信的最小單位,每個幀包含幀首部,至少也會標識出當前幀所屬的流(stream id)。
從圖中可見,所有的HTTP2.0通信都在一個連接上完成,這個連接可以承載任意數量的雙向數據流。 每個數據流以消息的形式發送,而消息由一或多個幀組成。這些幀可以亂序發送,然后再根據每個幀首部的流標識符(stream id)重新組裝。 舉個例子,每個請求是一個數據流,數據流以消息的方式發送,而消息又分為多個幀,幀首部記錄著stream id用來標識所屬的數據流,不同屬的幀可以在連接中隨機混雜在一起。接收方可以根據stream id將幀再歸屬到各自不同的請求當中去。
- 請求優先級 多路復用導致所有資源都是并行發送,可能會導致關鍵請求被阻塞。那么就需要「優先級」的概念了,這樣就可以對重要的文件進行先傳輸,加速頁面的渲染。
- 首部壓縮 在HTTP1.x中,首部元數據都是以純文本的形式發送的,通常會給每個請求增加500~800字節的負荷。 HTTP/2.0規定了在客戶端和服務器端會使用并且維護「首部表」來跟蹤和存儲之前發送的鍵值對,對于相同的頭部,不必再通過請求發送,只需發送一次。 事實上,如果請求中不包含首部(例如對同一資源的輪詢請求),那么首部開銷就是零字節。此時所有首部都自動使用之前請求發送的首部。 如果首部發生變化了,那么只需要發送變化了數據在Headers幀里面,新增或修改的首部幀會被追加到“首部表”。首部表在 HTTP2.0的連接存續期內始終存在,由客戶端和服務器共同漸進地更新。
比如說cookie,默認情況下,瀏覽器會在每次請求的時候,把cookie附在header上面發送給服務器。(由于cookie比較大且每次都重復發送,一般不存儲信息,只是用來做狀態記錄和身份認證)
- 服務器推送 服務器除了對最初請求的響應外,服務器還可以額外的向客戶端推送資源,而無需客戶端明確的請求。 在 HTTP/2官網 可以找到更多有關 HTTP/2 協議的資料。
- HTTP/2 的協議協商機制? 瀏覽器 服務器 協商結果 不支持 HTTP/2 不支持 HTTP/2 不協商,使用 HTTP/1.1 不支持 HTTP/2 支持 HTTP/2 不協商,使用 HTTP/1.1 支持 HTTP/2 不支持 HTTP/2 協商,使用 HTTP/1.1 支持 HTTP/2 支持 HTTP/2 協商,使用 HTTP/2
HTTPS
- HTTP => TCP => IP
- HTTP => SSL/TLS => TCP => IP
CURL
這個其實是題外話,因為自己調試很少用到CURL,了解了后才發現這東西真的很好用,所以也就帶在這里寫了進去,當給自己記錄下 用法也很簡單 curl [options...] <url> 具體的options可以用curl -help 去查看,這里我就說我幾個會用到的
- -H/--header 自定義頭信息傳遞給服務器
- -X/--request 指定什么命令
- -d/--data HTTP POST方式傳送數據
- -e/--referer 來源網址
總結
如果沒有時間看,直接看這里和以第一張的思維導圖。如果你覺得好,點個star.這個是我的git地址 我的Git地址
- HTTP是一種無狀態、無連接的應用層協議
- 現在主流的在使用的是HTTP/1.1 (特點:持久鏈接,增加緩存處理,支持斷點傳輸)和 HTTP/2(特點:二進制分幀,首部壓縮,多路復用,服務端推送)
- HTTPS 是由TLS(SSL)提供安全的HTTP協議
chrome查看協議類型
上次看到有人提問這個,按照以下步驟就可以了
文檔參考
總結這篇學習筆記也是從很多大神的文章中和書里找到的,感興趣的同學可以去看下,更深的研究。歡迎大家一起來討論學習。當然我寫的有問題的地方,也麻煩各位幫助指出,謝謝。
轉載于:https://juejin.im/post/5a83d7c8f265da4e7a785abf
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的重新学习的HTTP协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 寒假作业01
- 下一篇: 找出OData service出错根源的