凡科網(wǎng)站教程免費(fèi)檢測(cè)網(wǎng)站seo
HTTP 協(xié)議
什么是 HTTP 協(xié)議
HTTP(超文本傳輸協(xié)議,HyperText Transfer Protocol)是用于在客戶端(如瀏覽器)和服務(wù)器之間傳輸超文本(如網(wǎng)頁(yè)、圖片、視頻等)的應(yīng)用層協(xié)議。它是現(xiàn)代互聯(lián)網(wǎng)數(shù)據(jù)通信的基礎(chǔ),支持從 Web 服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議,幾乎所有網(wǎng)頁(yè)和應(yīng)用都依賴 HTTP 進(jìn)行交互。
HTTP 工作原理
HTTP 遵循請(qǐng)求-響應(yīng)模型,客戶端(通常是 Web 瀏覽器)發(fā)送一個(gè) HTTP 請(qǐng)求到服務(wù)器,服務(wù)器處理該請(qǐng)求后返回一個(gè) HTTP 響應(yīng)給客戶端。這個(gè)過(guò)程可以概括為以下幾個(gè)步驟:
- 建立連接:客戶端與服務(wù)器之間通過(guò) TCP/IP 建立連接。在 HTTP/1.1之前,每個(gè)請(qǐng)求都需要重新建立連接;而 HTTP/1.1引入了持久連接,允許在一個(gè) TCP 連接上傳輸多個(gè)請(qǐng)求和響應(yīng)。
- 發(fā)送請(qǐng)求消息:客戶端向服務(wù)器發(fā)送請(qǐng)求消息,這通常包括請(qǐng)求行(指定請(qǐng)求方法如 GET、POST 等,請(qǐng)求的 URL 以及 HTTP 版本)、請(qǐng)求頭部(提供關(guān)于請(qǐng)求的元數(shù)據(jù),例如瀏覽器類型、接受的內(nèi)容類型等)以及可選的請(qǐng)求體(對(duì)于 POST 請(qǐng)求,它包含要發(fā)送的數(shù)據(jù))。
- 處理請(qǐng)求并發(fā)送響應(yīng)消息:服務(wù)器接收到請(qǐng)求后進(jìn)行處理,并返回一個(gè) HTTP 響應(yīng)消息給客戶端。響應(yīng)消息包含狀態(tài)行(顯示 HTTP 版本、狀態(tài)碼及描述短語(yǔ))、響應(yīng)頭部(提供關(guān)于響應(yīng)的元數(shù)據(jù),如內(nèi)容類型、長(zhǎng)度等)和響應(yīng)體(所請(qǐng)求的內(nèi)容,如HTML文檔、圖片等)。
- 關(guān)閉或保持連接:根據(jù)使用的 HTTP 版本和配置,連接可能會(huì)被立即關(guān)閉或保持打開以供后續(xù)請(qǐng)求使用。
HTTP 特點(diǎn)
- 無(wú)狀態(tài)性:HTTP 本身是無(wú)狀態(tài)協(xié)議,即每個(gè)請(qǐng)求都是獨(dú)立的,服務(wù)器不會(huì)保存客戶端的狀態(tài)信息。然而,通過(guò)使用 Cookies、Session 等技術(shù)可以在一定程度上實(shí)現(xiàn)有狀態(tài)的交互。
- 簡(jiǎn)單快速:客戶端向服務(wù)器請(qǐng)求服務(wù)時(shí),只需提供請(qǐng)求方法和路徑即可,因此 HTTP 協(xié)議簡(jiǎn)單且高效。
- 靈活:HTTP 允許傳輸任意類型的數(shù)據(jù)對(duì)象,通過(guò) Content-Type 標(biāo)記來(lái)指示數(shù)據(jù)的類型。
- 安全性:盡管 HTTP 本身并不安全,但可以通過(guò) SSL/TLS 加密升級(jí)為 HTTPS,從而確保數(shù)據(jù)的安全傳輸。
HTTP 的發(fā)展歷程
HTTP/0.9
蒂姆伯納斯李是一位英國(guó)計(jì)算機(jī)科學(xué)家,也是萬(wàn)維網(wǎng)的發(fā)明者。他在1989年創(chuàng)建了單行 HTTP 協(xié)議,它只是返回一個(gè)網(wǎng)頁(yè),這個(gè)協(xié)議在1991年被命名為 HTTP/0.9。
HTTP/1.0
1996年,HTTP/1.0 發(fā)布。該規(guī)范是顯著擴(kuò)大,并且支持三種請(qǐng)求方法:get,head 和 post。
HTTP/1.0 相對(duì)于 HTTP/0.9 的改進(jìn)如下:
- 每個(gè)請(qǐng)求都附加了 HTTP 版本。
- 在響應(yīng)開始時(shí)發(fā)送狀態(tài)代碼。
- 請(qǐng)求和響應(yīng)都包含 HTTP 報(bào)文頭。
- 內(nèi)容類型能夠傳輸 HTTP 文件以外的文檔。
但是,HTTP/1.0 不是官方標(biāo)準(zhǔn)。
HTTP/1.1
HTTP 的第一個(gè)標(biāo)準(zhǔn)化版本 HTTP/1.1 (RFC 2068)于1997年初發(fā)布,支持七種請(qǐng)求方法:options,get,head,post,put,delete 和 trace。
HTTP/1.1 是 HTTP/1.0 的增強(qiáng):
- 虛擬主機(jī)允許從單個(gè) IP 地址提供多個(gè)域。
- 持久連接和流水線連接允許 Web 瀏覽器通過(guò)單個(gè)持久連接發(fā)送多個(gè)請(qǐng)求。
- 緩存支持節(jié)省了寬帶并使響應(yīng)速度更快。
HTTP/1.1 在接下來(lái)的15年左右非常穩(wěn)定。
在此期間,出現(xiàn)了 HTTPS(安全超文本傳輸協(xié)議)。它是使用 SSL/TLS 進(jìn)行安全加密通信的 HTTP 的安全版本。
HTTP/2
由 IETF 在2015年發(fā)布,HTTP/2 旨在提高 web 性能,減少延遲,增加安全性,使 web 應(yīng)用更加快速、高效和可靠。
- 多路復(fù)用:HTTP/2 允許同時(shí)發(fā)送多個(gè)請(qǐng)求和響應(yīng),而不是像 HTTP/1.1 一樣只能一個(gè)一個(gè)地處理,這樣可以減少延遲,提高效率,提高網(wǎng)絡(luò)吞吐量。
- 二進(jìn)制傳輸:HTTP/2 使用二進(jìn)制協(xié)議,與 HTTP/1.1 使用的文本協(xié)議不同,二進(jìn)制協(xié)議可以更快地解析,更有效地傳輸數(shù)據(jù),減少了傳輸過(guò)程中的開銷和延遲。
- 頭部壓縮:HTTP/2 使用 HPACK 算法對(duì) HTTP 頭部進(jìn)行壓縮,減少了頭部傳輸?shù)臄?shù)據(jù)量,從而減少了網(wǎng)絡(luò)延遲。
- 服務(wù)器推送:HTTP/2 支持服務(wù)器推送,允許服務(wù)器在客戶端請(qǐng)求之前推送資源,以提高性能。
- 改進(jìn)的安全性:HTTP/2 默認(rèn)使用 TLS(Transport Layer Security)加密傳輸數(shù)據(jù),提高了安全性。
- 兼容 HTTP/1.1:HTTP/2 可以與 HTTP/1.1 共存,服務(wù)器可以同時(shí)支持 HTTP/1.1 和 HTTP/2,如果客戶端不支持 HTTP/2,服務(wù)器可以回退到 HTTP/1.1。
HTTP/3
于2021年5月27日發(fā)布,HTTP/3 是一種新的、快速、可靠以及安全的協(xié)議,適用于所有形式的設(shè)備。HTTP/3 沒(méi)有使用 TCP,而是使用谷歌在2012年開發(fā)的新協(xié)議 QUIC。
HTTP/3 是繼 HTTP/1.1 和 HTTP/2 之后的第三次重大修訂。
HTTP/3 帶來(lái)了革命性的變化,以提高 web 性能和安全性,設(shè)置 HTTP/3 網(wǎng)站需要服務(wù)器和瀏覽器支持。
目前,谷歌云、Cloudflare 和 Fastly 支持 HTTP/3。Chrome、Firefox、Edge、Opera 和一些移動(dòng)瀏覽器支持 HTTP/3。
請(qǐng)求和響應(yīng)報(bào)文
報(bào)文的格式
主體上分為報(bào)文首部和報(bào)文主體,中間空行隔開。
報(bào)文首部可以繼續(xù)細(xì)分為“行”和“頭”。
請(qǐng)求報(bào)文
客戶端發(fā)送給服務(wù)端的報(bào)文。
請(qǐng)求報(bào)文格式
- 請(qǐng)求首行(請(qǐng)求行);GET/POST 資源路徑?參數(shù) HTTP/1.1
- 請(qǐng)求頭信息(請(qǐng)求頭)。
- 空行。
- 請(qǐng)求體;POST請(qǐng)求才有請(qǐng)求體。
瀏覽器按住F12可以打開瀏覽器的開發(fā)者工具,點(diǎn)擊網(wǎng)絡(luò)就可以查看請(qǐng)求數(shù)據(jù)包
form 表單發(fā)送 get 請(qǐng)求特點(diǎn)
- 由于請(qǐng)求參數(shù)在請(qǐng)求首行中已經(jīng)攜帶了,所以沒(méi)有請(qǐng)求體,也沒(méi)有請(qǐng)求空行。
- 請(qǐng)求參數(shù)拼接在 url 地址中,地址欄可見
url?key1=value1&key2=value2
,不安全。 - 參數(shù)在地址欄中攜帶,有大小限制(一般限制為4k),只能攜帶純文本。
- get 請(qǐng)求參數(shù)只能上傳文本數(shù)據(jù)。
- 沒(méi)有請(qǐng)求體,所以封裝和解析快,效率高,瀏覽器默認(rèn)提交的請(qǐng)求都是 get 請(qǐng)求,例如:地址欄輸入回車,超鏈接,表單默認(rèn)的提交方式等。
查看 get 請(qǐng)求行、請(qǐng)求頭、請(qǐng)求體
- 請(qǐng)求行組成部分:
- 請(qǐng)求方式 get
- 訪問(wèn)服務(wù)器的資源路徑?參數(shù)1=值1&參數(shù)2=值2……
- 協(xié)議/版本,例如:HTTP/1.1
GET /05_web_tomcat/login_success.html?username=admin&password=123456 HTTP/1.1
-
請(qǐng)求頭:
Host
:主機(jī)虛擬地址。Connection
:控制網(wǎng)絡(luò)連接,值為keep-alive
時(shí)為長(zhǎng)連接。Upgrade-Insecure-Requests
:請(qǐng)求協(xié)議的自動(dòng)升級(jí)(HTTP 的請(qǐng)求,如果服務(wù)器是 HTTPS 的,瀏覽器會(huì)自動(dòng)將請(qǐng)求協(xié)議升級(jí)為 HTTPS)。User-Agent
:用戶系統(tǒng)信息。Accept
:瀏覽器支持的文件類型。Referer
:當(dāng)前頁(yè)面的上一個(gè)頁(yè)面的路徑。Accept-Encoding
:瀏覽器支持的壓縮格式。Accept-Language
:瀏覽器支持的語(yǔ)言。
-
請(qǐng)求空行
-
請(qǐng)求體
- get 請(qǐng)求數(shù)據(jù)不放在請(qǐng)求體里。
form 表單發(fā)送 post 請(qǐng)求特點(diǎn)
- post 請(qǐng)求有請(qǐng)求體,而 get 請(qǐng)求沒(méi)有請(qǐng)求體。
- post 請(qǐng)求數(shù)據(jù)在請(qǐng)求體中攜帶,請(qǐng)求體數(shù)據(jù)大小沒(méi)有限制,可以用來(lái)上傳所有內(nèi)容(文件、文本等)。
- 只能使用 post 請(qǐng)求上傳文件。
- post 請(qǐng)求報(bào)文多路和請(qǐng)求體相關(guān)的配置(請(qǐng)求頭)。
- 地址欄參數(shù)不可見,相對(duì)安全。
- post 效率比 get 低。
- post 請(qǐng)求要求將 form 標(biāo)簽的 method 屬性設(shè)置為 post。
查看 post 請(qǐng)求行、請(qǐng)求頭、請(qǐng)求體
-
請(qǐng)求行組成部分:
-
請(qǐng)求方式 post
-
訪問(wèn)服務(wù)器的資源路徑
-
協(xié)議/版本,例如:HTTP/1.1
-
POST /05_web_tomcat/login_success.html HTTP/1.1
- 請(qǐng)求頭
- 請(qǐng)求空行
- 請(qǐng)求體
username=admin&password=123456
響應(yīng)報(bào)文
服務(wù)端返回給客戶端的報(bào)文。
響應(yīng)報(bào)文格式
- 響應(yīng)首行(響應(yīng)行):協(xié)議/版本 狀態(tài)碼 狀態(tài)碼描述。
- 響應(yīng)頭信息(響應(yīng)頭)。
- 空行。
- 響應(yīng)體。
- 響應(yīng)行組成部分
- 協(xié)議/版本 HTTP/1.1
- 響應(yīng)狀態(tài)碼
- 狀態(tài)描述 OK (缺省)
HTTP/1.1 200 OK
- 響應(yīng)頭
Server
:服務(wù)器的版本信息。Accept-Ranges
:客戶端服務(wù)器是否允許范圍請(qǐng)求,即客戶端可以請(qǐng)求資源的某個(gè)部分而不是整個(gè)資源,值為bytes
時(shí),表示服務(wù)器支持按字節(jié)范圍請(qǐng)求資源。Content-Type
:響應(yīng)體數(shù)據(jù)的類型。Content-Length
:響應(yīng)體內(nèi)容的字節(jié)數(shù)。Date
:響應(yīng)的時(shí)間。Last-Mondified
:提供文檔最后修改的時(shí)間,可用于驗(yàn)證緩存的有效性。
- 響應(yīng)體
常見的響應(yīng)狀態(tài)碼
- 200:請(qǐng)求成功,瀏覽器會(huì)把響應(yīng)體內(nèi)容(通常為 html)顯示在瀏覽器中。
- 302:重定向,表示服務(wù)器要求瀏覽器重新再發(fā)一個(gè)請(qǐng)求,服務(wù)器會(huì)發(fā)送一個(gè)響應(yīng)頭 Location 指定新請(qǐng)求的 url 地址。
- 304:使用了本地緩存。
- 404:請(qǐng)求的資源沒(méi)有找到,說(shuō)明客戶端錯(cuò)誤的請(qǐng)求了不存在的資源。
- 405:請(qǐng)求的方法不允許。
- 500:請(qǐng)求資源找到了,但服務(wù)器內(nèi)部出現(xiàn)了錯(cuò)誤。
響應(yīng)的狀態(tài)碼
HTTP 響應(yīng)狀態(tài)碼是服務(wù)器對(duì)客戶端請(qǐng)求的響應(yīng)結(jié)果的一種標(biāo)準(zhǔn)化表示,它由三位數(shù)字組成,分為五類,每類都有一個(gè)共同的起始數(shù)字,具體如下:
- 1xx(信息性狀態(tài)碼):指示請(qǐng)求已接收,繼續(xù)處理。
100 Continue
:表明請(qǐng)求的初始部分已經(jīng)被接收,客戶端應(yīng)繼續(xù)發(fā)送剩余部分。101 Switching Protocols
:服務(wù)器根據(jù)客戶端的請(qǐng)求切換協(xié)議。
- 2xx(成功狀態(tài)碼):表示請(qǐng)求已被成功接收、理解和接受。
200 OK
:標(biāo)準(zhǔn)的成功響應(yīng),表明請(qǐng)求成功并且信息包含在響應(yīng)中。201 Created
:請(qǐng)求成功且服務(wù)器創(chuàng)建了新的資源。204 No Content
:請(qǐng)求成功但響應(yīng)報(bào)文中不包含實(shí)體的主體部分。
- 3xx(重定向狀態(tài)碼):需要采取進(jìn)一步操作以完成請(qǐng)求。
301 Moved Permanently
:請(qǐng)求的資源已被永久移動(dòng)到新位置,并且未來(lái)對(duì)該資源的任何引用都應(yīng)該使用本響應(yīng)返回的URI。302 Found
:與301類似,但是它是臨時(shí)性的重定向。304 Not Modified
:如果客戶端執(zhí)行了條件 GET 請(qǐng)求且該頁(yè)面自上次訪問(wèn)以來(lái)未被修改,則服務(wù)器會(huì)返回此狀態(tài)碼。
- 4xx(客戶端錯(cuò)誤狀態(tài)碼):請(qǐng)求包含語(yǔ)法錯(cuò)誤或無(wú)法完成請(qǐng)求。
400 Bad Request
:服務(wù)器無(wú)法理解請(qǐng)求的格式,客戶端應(yīng)當(dāng)修改請(qǐng)求后再試。401 Unauthorized
:當(dāng)前請(qǐng)求需要用戶驗(yàn)證。403 Forbidden
:服務(wù)器理解請(qǐng)求但拒絕執(zhí)行。404 Not Found
:請(qǐng)求的資源在服務(wù)器上不存在。405 Method Not Allowed
:請(qǐng)求方法對(duì)指定資源不適用。
- 5xx(服務(wù)器錯(cuò)誤狀態(tài)碼):服務(wù)器遇到錯(cuò)誤,無(wú)法完成有效請(qǐng)求。
500 Internal Server Error
:服務(wù)器遇到了未知情況,阻止了它完成請(qǐng)求。501 Not Implemented
:服務(wù)器不具備完成請(qǐng)求的功能。例如,服務(wù)器既不識(shí)別請(qǐng)求方法也不支持其對(duì)應(yīng)的資源類型。502 Bad Gateway
:作為網(wǎng)關(guān)或代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收到無(wú)效響應(yīng)。503 Service Unavailable
:由于臨時(shí)維護(hù)或者過(guò)載,服務(wù)器當(dāng)前無(wú)法處理請(qǐng)求。504 Gateway Timeout
:作為網(wǎng)關(guān)或代理工作的服務(wù)器未能及時(shí)從上游服務(wù)器獲得響應(yīng)。
每個(gè)狀態(tài)碼都提供了關(guān)于請(qǐng)求過(guò)程中的特定信息,幫助開發(fā)人員和系統(tǒng)管理員診斷問(wèn)題并優(yōu)化應(yīng)用性能。理解這些狀態(tài)碼對(duì)于有效的 Web 開發(fā)至關(guān)重要。