HTTP協(xié)議揭秘:探尋互聯(lián)網(wǎng)的背后密碼、探秘數(shù)據(jù)傳輸?shù)膴W秘
HTTP(超文本傳輸協(xié)議:Hypertext Transfer Protocol)是一種用于在Web上傳輸數(shù)據(jù)的協(xié)議,它是互聯(lián)網(wǎng)上最重要的應(yīng)用層協(xié)議之一。從誕生至今,HTTP一直扮演著連接世界的通信橋梁的角色,在互聯(lián)網(wǎng)的發(fā)展和普及中發(fā)揮著重要作用。本文將帶您深入了解HTTP協(xié)議的起源、工作原理、常見特點(diǎn)以及它對現(xiàn)代Web的影響。
一、起源與發(fā)展
HTTP協(xié)議最早由蒂姆·伯納斯-李(Tim Berners-Lee)在1989年創(chuàng)建,作為連接萬維網(wǎng)(World Wide Web)上文檔的一種通信協(xié)議。起初,HTTP的目標(biāo)是在客戶端和服務(wù)器之間傳輸超文本文檔(HTML)和超鏈接(Hyperlink)。隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,HTTP也在不斷演進(jìn)和完善。
在1991年,HTTP的第一個正式版本HTTP/0.9問世,其功能非常簡單,只能傳輸純文本的HTML文檔。而后,在1996年,HTTP/1.0發(fā)布,引入了更多功能,支持傳輸多種格式的資源,如圖片、樣式表和腳本文件。然而,隨著Web應(yīng)用和互聯(lián)網(wǎng)的規(guī)模不斷擴(kuò)大,HTTP/1.0的性能表現(xiàn)出現(xiàn)了瓶頸。為了解決HTTP/1.0的性能問題HTTP/1.1在1997年發(fā)布,引入了持久連接、管道化請求、Host頭字段等特性,顯著提升了網(wǎng)頁加載速度和用戶體驗(yàn)。
時至今日,HTTP協(xié)議持續(xù)發(fā)展,最新的版本是HTTP/2(2015年發(fā)布)和HTTP/3(2022年發(fā)布),它們進(jìn)一步優(yōu)化了性能、安全性和并行處理能力,逐漸成為主流的HTTP協(xié)議版本。
二、工作原理
HTTP是一種無狀態(tài)的協(xié)議,每個請求都是獨(dú)立的,服務(wù)器不保留與之前請求的狀態(tài)信息。HTTP使用客戶端-服務(wù)器模式,客戶端發(fā)送請求,服務(wù)器處理請求并返回響應(yīng)。
HTTP通信過程遵循以下步驟:
- 建立連接: 客戶端(通常是Web瀏覽器)向服務(wù)器發(fā)起TCP連接,并建立起雙向通信通道。
- 發(fā)送請求: 客戶端發(fā)送HTTP請求到服務(wù)器,請求包含請求行(請求方法、URL和HTTP版本)、請求頭和請求體(對于POST等有內(nèi)容的請求)。
- 處理請求: 服務(wù)器接收并解析請求,根據(jù)請求的內(nèi)容執(zhí)行相應(yīng)的操作,可能包括讀取數(shù)據(jù)庫、處理業(yè)務(wù)邏輯等。
- 發(fā)送響應(yīng): 服務(wù)器將處理結(jié)果封裝為HTTP響應(yīng),響應(yīng)包含響應(yīng)行(狀態(tài)碼、狀態(tài)文本和HTTP版本)、響應(yīng)頭和響應(yīng)體。
- 關(guān)閉連接: 服務(wù)器發(fā)送完響應(yīng)后,關(guān)閉TCP連接,請求-響應(yīng)過程完成。
三、特點(diǎn)與影響
HTTP協(xié)議具有以下特點(diǎn),這些特點(diǎn)對現(xiàn)代Web應(yīng)用和互聯(lián)網(wǎng)產(chǎn)生了深遠(yuǎn)的影響:
- 無連接和無狀態(tài): HTTP是無連接的,每個請求和響應(yīng)都是獨(dú)立的。它也是無狀態(tài)的,服務(wù)器不保存客戶端的狀態(tài)信息,每次請求都是無關(guān)的,這有利于實(shí)現(xiàn)可伸縮性和靈活性。
- 靈活性: HTTP的靈活性使得它可以傳輸各種類型的資源,如文本、圖片、視頻等,使Web應(yīng)用呈現(xiàn)豐富多樣的內(nèi)容。
- 基于請求-響應(yīng)模型: HTTP的請求-響應(yīng)模型使得客戶端可以向服務(wù)器請求數(shù)據(jù)或操作,并獲取服務(wù)器的響應(yīng)。這種模型促進(jìn)了客戶端與服務(wù)器之間的交互和通信。
- 分層架構(gòu): HTTP的分層架構(gòu)允許通過代理服務(wù)器和緩存來優(yōu)化網(wǎng)絡(luò)傳輸,提高性能和響應(yīng)速度。
- 狀態(tài)碼: HTTP的狀態(tài)碼提供了對請求處理結(jié)果的說明,例如200表示成功,404表示未找到,500表示服務(wù)器錯誤等。這些狀態(tài)碼對于診斷和調(diào)試Web應(yīng)用非常有用。
四、協(xié)議組成
HTTP協(xié)議是一種規(guī)范,其樣本通常以請求和響應(yīng)的形式呈現(xiàn)。下面是HTTP協(xié)議的一個樣本,分別展示了HTTP請求和HTTP響應(yīng)的格式。
HTTP請求樣本:
GET /hanko HTTP/1.1
Host: www.hanko.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36
Accept: text/html,application/xhtml+xml
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
- 第一行是請求行,包含請求方法(GET)、請求的資源路徑(/hanko)和HTTP協(xié)議版本(HTTP/1.1)。
- 接下來是請求頭,包含了請求的一些附加信息,如Host(請求的目標(biāo)主機(jī))、User-Agent(客戶端的瀏覽器信息)、Accept(客戶端接受的響應(yīng)內(nèi)容類型)等。
當(dāng)年阿里面試問到了http頭connection為keep-alive是什么意思?
當(dāng)HTTP請求頭中的Connection字段設(shè)置為keep-alive時,它表示客戶端希望與服務(wù)器建立持久連接。持久連接允許在同一個TCP連接上發(fā)送多個HTTP請求和響應(yīng),而不是每個請求都建立一個新的TCP連接,從而減少了連接的建立和關(guān)閉開銷,提高了性能和效率。
除了keep-alive之外,HTTP請求頭中的Connection字段還可以包含其他值,用途如下:
- close: 當(dāng)Connection設(shè)置為close時,表示客戶端或服務(wù)器希望在發(fā)送完當(dāng)前的請求和響應(yīng)后關(guān)閉TCP連接,即不使用持久連接。
- Upgrade: 用于HTTP升級。當(dāng)Connection設(shè)置為Upgrade時,表示客戶端希望升級到其他協(xié)議,如WebSocket。
- Connection-Token: 自定義的Connection標(biāo)記,可以用于傳遞額外的信息或指示特定的處理方式。
雖然名為"keep-alive",但HTTP的持久連接(keep-alive)并不是真正意義上的一直保持連接。實(shí)際上,HTTP的持久連接是一種在單個TCP連接上可以發(fā)送多個HTTP請求和響應(yīng)的機(jī)制,從而避免了每次請求都重新建立新的TCP連接,從而減少了連接的建立和關(guān)閉的開銷。
HTTP響應(yīng)樣本:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Server: Apache/2.4.41 (Ubuntu)
Date: Wed, 20 Jul 2023 12:34:56 GMT
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<p>This is an example page.</p>
</body>
</html>
- 第一行是響應(yīng)行,包含HTTP協(xié)議版本(HTTP/1.1)、狀態(tài)碼(200)和狀態(tài)文本(OK)。
- 接下來是響應(yīng)頭,包含了響應(yīng)的一些附加信息,如Content-Type(響應(yīng)內(nèi)容類型)、Content-Length(響應(yīng)內(nèi)容長度)、Server(服務(wù)器信息)等。
- 響應(yīng)頭與響應(yīng)體之間有一個空行,表示響應(yīng)頭結(jié)束,接下來是響應(yīng)體,即實(shí)際返回給客戶端的內(nèi)容。在本例中,響應(yīng)體是一個簡單的HTML頁面。
1、請求頭
常見的請求頭:
- Host: 指定請求的目標(biāo)主機(jī)名和端口號。
- User-Agent: 指定發(fā)送請求的用戶代理,通常是瀏覽器標(biāo)識。
- Accept: 指定客戶端可以接受的響應(yīng)內(nèi)容類型,如文本、圖片、JSON等。
- Accept-Language: 指定客戶端可以接受的自然語言,用于國際化。
- Authorization: 用于身份驗(yàn)證,包含認(rèn)證信息。
- Cookie: 用于在客戶端和服務(wù)器之間傳遞會話信息。
2、響應(yīng)頭
常見的響應(yīng)頭:
- Content-Type: 指定響應(yīng)內(nèi)容的類型,如text/html、application/json等。
- Content-Length: 指定響應(yīng)內(nèi)容的長度,單位為字節(jié)。
- Location: 用于重定向,指定新的URL地址。
- Set-Cookie: 用于在客戶端設(shè)置Cookie,用于維持會話狀態(tài)。
- Cache-Control: 指定響應(yīng)的緩存策略,如no-cache、max-age等。
3、狀態(tài)碼
HTTP狀態(tài)碼是HTTP協(xié)議中用于表示服務(wù)器對請求的處理結(jié)果的數(shù)字代碼。狀態(tài)碼由三位數(shù)字組成,每個狀態(tài)碼表示不同的處理結(jié)果。HTTP狀態(tài)碼主要分為五類,分別以不同的數(shù)字開頭,每類狀態(tài)碼具有特定的含義。以下是常見的HTTP狀態(tài)碼及其含義:
1xx(Informational): 表示請求已被接收,繼續(xù)處理。
- 100 Continue:服務(wù)器已接收到請求的頭部,并且客戶端應(yīng)繼續(xù)發(fā)送請求的其余部分。
2xx(Successful): 表示請求已成功被服務(wù)器接收、理解和處理。
- 200 OK:請求成功,服務(wù)器已成功處理請求。
- 201 Created:請求成功,并在服務(wù)器上創(chuàng)建了新的資源。
- 204 No Content:請求成功,但響應(yīng)不包含實(shí)體主體內(nèi)容,用于成功的DELETE請求等。
3xx(Redirection): 表示需要進(jìn)一步的操作以完成請求。
- 301 Moved Permanently:請求的資源已永久移動到新的URL,客戶端應(yīng)該使用新URL重新請求。
- 302 Found:請求的資源已臨時移動到新的URL,客戶端應(yīng)繼續(xù)使用原始URL。
- 304 Not Modified:客戶端通過條件式請求的資源未修改,可直接使用緩存的版本。
4xx(Client Error): 表示客戶端發(fā)生錯誤,無法完成請求。
- 400 Bad Request:請求錯誤,服務(wù)器無法理解請求。
- 401 Unauthorized:請求需要身份驗(yàn)證,客戶端需要提供有效的認(rèn)證信息。
- 403 Forbidden:服務(wù)器理解請求,但拒絕執(zhí)行請求。
- 404 Not Found:請求的資源不存在,服務(wù)器未找到請求的URL。
5xx(Server Error): 表示服務(wù)器發(fā)生錯誤,無法完成請求。
- 500 Internal Server Error:服務(wù)器內(nèi)部錯誤,無法完成請求。
- 502 Bad Gateway:服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)。
- 503 Service Unavailable:服務(wù)器暫時不可用,通常由于過載或維護(hù)。
4、請求方法
- GET:用于請求獲取指定資源。
- POST:用于提交數(shù)據(jù)給服務(wù)器,如提交表單數(shù)據(jù)。
- PUT:用于更新指定資源的內(nèi)容。
- DELETE:用于刪除指定資源。
- HEAD:類似于GET請求,但只獲取響應(yīng)頭信息,不獲取響應(yīng)體。
- OPTIONS:用于獲取目標(biāo)資源支持的通信選項(xiàng)。
- PATCH:用于對資源進(jìn)行局部更新。
5、Http版本
HTTP(Hypertext Transfer Protocol)協(xié)議經(jīng)過多次版本的演進(jìn)和改進(jìn),目前主要有以下幾個主要版本:
- HTTP/0.9: HTTP的最早版本,于1991年發(fā)布。它是一個非常簡單的協(xié)議,僅支持傳輸HTML文本,沒有請求頭和響應(yīng)頭,也沒有狀態(tài)碼。它主要用于傳輸超文本文檔(HTML)和超鏈接(Hyperlink)。
- HTTP/1.0: 于1996年發(fā)布,相比HTTP/0.9,HTTP/1.0引入了請求頭和響應(yīng)頭的概念,允許傳輸多種類型的資源,如圖片、樣式表和腳本文件。HTTP/1.0的特點(diǎn)是每個請求都需要單獨(dú)建立連接,導(dǎo)致效率較低。
- HTTP/1.1: 于1997年發(fā)布,是HTTP協(xié)議的一個重要版本。HTTP/1.1引入了持久連接、管道化請求、Host頭字段等特性,顯著提升了網(wǎng)頁加載速度和用戶體驗(yàn)。持久連接允許在同一個連接上發(fā)送多個請求和響應(yīng),避免了每次請求都需要重新建立連接的開銷。
- HTTP/2: 于2015年發(fā)布,是HTTP協(xié)議的最新主要版本。HTTP/2進(jìn)一步優(yōu)化了性能、安全性和并行處理能力。它引入了二進(jìn)制協(xié)議,允許多個請求和響應(yīng)同時在同一個連接上傳輸,消除了請求阻塞的問題。HTTP/2還支持頭部壓縮和服務(wù)器推送等特性,進(jìn)一步減少了數(shù)據(jù)傳輸?shù)拈_銷。
- HTTP/3: 最新版本,于2022年6月6日標(biāo)準(zhǔn)化為RFC9114。會拋棄使用TCP,通過UDP上使用QUIC來承載應(yīng)用層數(shù)據(jù)。
6、Cookie
HTTP Cookie(簡稱Cookie)是HTTP協(xié)議中的一種機(jī)制,用于在客戶端(通常是Web瀏覽器)和服務(wù)器之間傳遞會話信息和狀態(tài)數(shù)據(jù)。Cookie主要用于記錄用戶的一些狀態(tài)信息,以便服務(wù)器在后續(xù)請求中識別用戶或維持用戶的會話狀態(tài)。
工作原理:
- 服務(wù)器設(shè)置Cookie: 服務(wù)器在HTTP響應(yīng)中的Set-Cookie頭部中設(shè)置Cookie信息,并將Cookie發(fā)送給客戶端。例如:
Set-Cookie: session_id=1234567890; path=/; domain=example.com; expires=Sun, 20-Jul-2025 12:00:00 GMT; secure; HttpOnly
- 客戶端保存Cookie: 客戶端(Web瀏覽器)收到服務(wù)器設(shè)置的Cookie后,會將Cookie保存在本地。在以后的請求中,客戶端會在請求頭的Cookie字段中攜帶該Cookie信息。
- 客戶端發(fā)送Cookie: 客戶端在發(fā)送HTTP請求時,會將保存的Cookie信息包含在請求頭的Cookie字段中,發(fā)送給服務(wù)器。
- 服務(wù)器讀取Cookie: 服務(wù)器收到請求后,可以從請求頭的Cookie字段中讀取客戶端發(fā)送的Cookie信息,并根據(jù)其中的數(shù)據(jù)來識別用戶或維持會話狀態(tài)。
Cookie屬性:
Cookie可以包含多個屬性,用于指定其行為和有效期。常見的Cookie屬性包括:
- Name和Value: 表示Cookie的名稱和對應(yīng)的值。
- Domain: 指定Cookie的作用域,指定了哪些域名可以訪問該Cookie。
- Path: 指定Cookie的作用路徑,指定了哪些URL路徑可以訪問該Cookie。
- Expires和Max-Age: 指定Cookie的有效期,Expires指定一個具體的過期時間,Max-Age指定從當(dāng)前時間開始的有效期秒數(shù)。
- Secure: 表示Cookie只能通過HTTPS連接傳輸,用于保證Cookie的安全性。
- HttpOnly: 表示Cookie僅限于通過HTTP或HTTPS傳輸,不能被JavaScript等腳本訪問,用于防止XSS攻擊。
用途:
Cookie在Web應(yīng)用中有許多用途,其中一些常見的包括:
- 記錄用戶的登錄狀態(tài),實(shí)現(xiàn)用戶認(rèn)證和會話管理。
- 存儲用戶的個性化設(shè)置和偏好。
- 跟蹤用戶的瀏覽行為,用于分析用戶行為和推薦相關(guān)內(nèi)容。
- 在購物網(wǎng)站中,用于保存購物車信息和交易狀態(tài)。
7、URL長度
URL長度的限制由瀏覽器規(guī)定的,而不是HTTP協(xié)議。以下是一些瀏覽器對http中url長度的限制大小。
當(dāng)然大家會說我是搞開發(fā)的,我不用瀏覽器那么長度限制嗎?比如用apache-httpclient,我試httpclient也同樣是有長度限制的,過長就返回400錯誤了。