HTTP 協(xié)議
HTTP 協(xié)議詳解
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。1960年美國人Ted Nelson構(gòu)思了一種通過計算機處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基。Ted Nelson組織協(xié)調(diào)萬維網(wǎng)協(xié)會(World Wide Web Consortium)和互聯(lián)網(wǎng)工程工作小組(Internet Engineering Task Force )共同合作研究,最終發(fā)布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。
HTTP協(xié)議工作流程
Http協(xié)議與其他協(xié)議一樣,也需要以特定的方式進行數(shù)據(jù)包的封裝,并按照一定的流程實現(xiàn)通信交互,而基于HTTP協(xié)議的請求/響應(yīng)模式的信息交互過程可分為四個步驟。
- (1) 客戶端與服務(wù)器需要建立連接,如:TCP連接
- (2) 連接建立后,客戶端向服務(wù)器發(fā)送一個請求,請求報文由三部分組成:請求行、消息報頭、響應(yīng)內(nèi)容。
- (3) 服務(wù)器接到請求后,解析該請求并返回響應(yīng)信息,響應(yīng)報文由三部分組成:狀態(tài)行、消息頭、響應(yīng)內(nèi)容。
- (4) 客戶端接收服務(wù)器所返回的信息并進行解析、處理和顯示。
通常,瀏覽器訪問一個頁面,需要發(fā)出多次請求獲取不同的響應(yīng)內(nèi)容,在HTTP/1.0版本中默認(rèn)是傳輸一次數(shù)據(jù)就關(guān)閉連接,而在HTTP/1.1版本中默認(rèn)為是持久連接,即一次TCP連接可以完成多次HTTP請求。是否支持持久連接,是由消息報頭中的connection字段決定的,如果請求或響應(yīng)中的connection設(shè)置為close,則客戶端和服務(wù)器的連接為非持久連接。
請求報文和響應(yīng)的報文結(jié)構(gòu)簡介
HTTP協(xié)議的請求和響應(yīng)數(shù)據(jù)包一般被稱為請求報文和響應(yīng)報文,根據(jù)協(xié)議標(biāo)準(zhǔn),請求報文和響應(yīng)報文是由報文首部、空行和報文主題組成的,而請求報文的首部又由請求行、請求首部字段、通用首部字段、實體首部字段組成,響應(yīng)報文的首部由狀態(tài)行、響應(yīng)首部字段、通用首部字段、實體首部字段組成。結(jié)構(gòu)圖請看往下看:
根據(jù)以上結(jié)構(gòu),可以將HTTP協(xié)議報文包含的內(nèi)容分為五類:
- 一、請求行,由請求方法、請求URL、HTTP版本組成;
- 二、是狀態(tài)行,由HTTP版本、狀態(tài)碼、原因短語組成;
- 三、首部字段,包含了請求首部、響應(yīng)首部、通用首部、實體首部四種類型,一般有名字和值組成;
- 四、是其他報文首部字段,包含了一些RFC()未定義的首部內(nèi)容;
- 五、是報文主體,由任意數(shù)據(jù)組成。
分析下 Laravel 官網(wǎng)的Http協(xié)議
這里我們訪問 laravel官網(wǎng) 的請求報文和響應(yīng)報文,來具體分析
(1) 請求行 (火狐可以查看到)
請求行中的請求方法用來描述服務(wù)器應(yīng)該執(zhí)行的操作,而請求URL指定了操作的資源,HTTP版本用來標(biāo)識客戶端使用的HTTP版本。圖中 訪問的Laravel網(wǎng)站請求報文的請求方法為“GET”,請求URL為“https://laravel.com/”,HTTP版本位 “HTTP/1.1”。在HTTP規(guī)范中定義了一組方法,用于指定服務(wù)器的響應(yīng)動作,如GET方法是指從服務(wù)器獲取一個文本,具體請求報文頭方法及其功能描述見下表:
HTTP請求報文方法及其功能
方法名稱 | 功能描述 | 是否包含主體數(shù)據(jù) |
---|---|---|
GET | 從服務(wù)器獲取文本 | 否 |
POST | 向服務(wù)器發(fā)送客戶端數(shù)據(jù) | 是 |
PUT | 上傳客戶端的文件到服務(wù)器 | 是 |
DELETE | 從服務(wù)器刪除一個文件 | 否 |
HEAD | 只獲取服務(wù)器可以執(zhí)行的方法 | 否 |
OPTIONS | 獲取服務(wù)器可以執(zhí)行的方法 | 否 |
TRACE | 對經(jīng)過代理服務(wù)器的報文進行追蹤 | 否 |
(2) 狀態(tài)行
狀態(tài)行包含響應(yīng)報文服務(wù)器使用的HTTTP版本、數(shù)字狀態(tài)碼和原因短語,對于圖響應(yīng)報文的狀態(tài)行,其中HTTP版本為“HTTP/1.1”,數(shù)字狀態(tài)碼位 “200”,原因短語“OK”。HTTP的狀態(tài)共分為五大類,用于描述返回的響應(yīng)結(jié)果。實際HTTP規(guī)范中定義的狀態(tài)碼有十幾種,比較具有代表性的狀態(tài)碼及含義如下:
HTTP響應(yīng)報文狀態(tài)碼及其含義
狀態(tài)碼范圍 | 狀態(tài)碼類別 | 含義 | |
---|---|---|---|
100~199 | 信息類狀態(tài)碼 | 收到請求初始部分,請繼續(xù)發(fā)送 | |
200~299 | 成功狀態(tài)碼 | ||
300~399 | 重定向狀態(tài)碼 | ||
400~499 | 客戶端錯誤狀態(tài)碼 | ||
500~599 | 服務(wù)器錯誤狀態(tài)碼 |
典型狀態(tài)碼
典型狀態(tài)碼 | 原因短語 | 含義 |
---|---|---|
100 | continue | 收到請求初始部分,請繼續(xù)發(fā)送 |
200 | OK | 請求已經(jīng)被正常處理 |
204 | No Content | 請求被成功處理,但沒有主體數(shù)據(jù) |
206 | Partial Content | 對資源部分請求成功 |
301 | Moved Permanently | 請求的URL資源已被更新,響應(yīng)首部包含新的URL |
302 | Found | 請求的URL資源臨時更新 |
304 | Not Modified | 請求不符合條件,需要更改條件 |
400 | Bad Request | 客戶端發(fā)送一個錯誤請求 |
401 | Unauthorized | 請求需要包含通過HTTP認(rèn)證的信息 |
403 | Forbiden | 訪問被拒絕 |
404 | Not Found | 沒有找到請求的URL |
500 | Internal Server Error | 服務(wù)器出現(xiàn)錯誤,無法提供請求的資源 |
503 | Service Unavailable | 服務(wù)器正忙,無法提供正常請求的服務(wù) |
(3) 首部字段
首部字段是構(gòu)成HTTP報文的基本要素之一,這部分包含的信息也是最為豐富,主要用于規(guī)定客戶端和服務(wù)端在處理請求和響應(yīng)時的操做。通常,根據(jù)首部字段的用途可以分為四類:
- 通用首部字段
- 請求首部字段
- 響應(yīng)首部字段
- 實體首部字段
首部字段通常由字段名和字段值構(gòu)成,中間通過“:”分隔。下面簡要介紹下四類字段的作用和部分首部字段含義。
通用首部字段
通用首部字段一般用來提供HTTP報文的最基本信息,這些信息無論是請求報文還是響應(yīng)報文都可以使用,主要用于描述HTTP協(xié)議本身。比如描述HTTP是否支持久連接的Connetion 字段、HTTP發(fā)送日期的Date字段、用于緩存控制的Cache-Control 字段等。下面列出了通用首部字段及含義:
通用首部字段名 | 功能說明 |
---|---|
Connection | 用于指定客服端/服務(wù)器間連接選項,例如指定連續(xù)連接或者通過“close”選項通知服務(wù)器在響應(yīng)完成后關(guān)閉連接 |
Date | 報文創(chuàng)建日期 |
Transfer-Enocoding | 指定報文主體數(shù)據(jù)的編碼方式 |
Update | 發(fā)送端協(xié)議準(zhǔn)備升級為新版本 |
Via | 報文經(jīng)過中間節(jié)點(網(wǎng)關(guān)、代理等)的信息 |
Cache-Control | 指定緩存行為 |
Warning | 錯誤通知 |
請求首部字段
請求首部字段一般用于HTTP請求報文中,主要描述客戶端的版本、處理能力等信息,用于幫助服務(wù)器更好的地提供請求響應(yīng)字段,如告訴服務(wù)器只接收某種響應(yīng)內(nèi)容的Accept字段、發(fā)送Cookies的Cookie字段等。下面列出的是常用的請求首部字段及含義:
HTTP 報文請求首部字段及含義
請求首部字段名 | 功能說明 |
---|---|
Accept | 客戶端可處理的媒體類型 |
Accept-Charset | 客戶端優(yōu)先接收的字符集 |
Accept-Encoding | 客戶端優(yōu)先接收的編碼格式,如 zip |
Accept-Langular | 客戶端希望的語言種類 |
Authorization | 授權(quán)信息,通常用于對服務(wù)器發(fā)送的WWW-Authenticate |
Cookie | 用于客戶端向服務(wù)器發(fā)送一個令牌 |
Cookie2 | 用來說明客戶端支持的Cookie版本 |
From | 客戶端的E-mail 地址,由一些特殊的Web客戶程序使用,瀏覽器不會用到它 |
Host | 請求資源所在服務(wù)器的主機和端口 |
If-Modified-Since | 只有當(dāng)所有請求的內(nèi)容在指定的日期之后又經(jīng)過修改才會返回它,否則返回 304 “Not Modified”應(yīng)答 |
Referer | 包含一個URL頁面出發(fā)訪問請求頁面 |
User-Agent | 客戶端信息,如客戶端應(yīng)用程序名稱、版本等 |
UA-OS | 客戶端主機上的操作系統(tǒng)名稱、版本等信息 |
UA-Pixels | 客服端顯示器像素信息 |
響應(yīng)首部字段
響應(yīng)首部字段是描述HTTP 響應(yīng)本身的字段,一般用于HTTP響應(yīng)報文中,主要用于描述響應(yīng)主機的信息、功能等,通過響應(yīng)首部字段有助于客戶端處理響應(yīng),并在將來發(fā)出更適合服務(wù)器的請求,如定時刷新的Refresh頭、設(shè)置Cookie的Set-Cookie頭等。下面列出常用的響應(yīng)首部字段及含義:
響應(yīng)首部字段名 | 功能含義 |
---|---|
Age | 響應(yīng)資源創(chuàng)建的時間 |
Set-Cookie | 在客戶端設(shè)置一個Cookie,服務(wù)器用來對客戶端進行標(biāo)識 |
Server | 服務(wù)器應(yīng)用程序軟件的名稱、版本等信息 |
Retry-After | 當(dāng)資源不可用時,在此期間再次發(fā)送請求 |
Refresh | 表示瀏覽器應(yīng)該在多長時間之后刷新文檔,以秒計 |
實體首部字段
實體首部字段用于描述HTTP報文體數(shù)據(jù)字段。由于報文主體可以存在于請求報文和響應(yīng)報文中,所以這種類型首部字段可以應(yīng)用在這兩種類型的報文中。實體首部字段用于描述主體內(nèi)容的元信息,包括實體信息類型、長度、壓縮方法、最后一次修改時間、數(shù)據(jù)有效性等,以便告訴接收者如何進行處理,如Content-Language 用于描述報文主體的語言等。下面列出常用的實體首部字段及含義:
實體首部字段名 | 功能含義 |
---|---|
Allow | 資源主體可以支持的HTTP請求方法 |
Content-Location | 通知接收端主體的URL,用于接收端定位到該資源 |
Content-Encoding | 主體適用的編碼方式 |
Content-Language | 解釋主體時適用的語言 |
Content-Length | 主體的大小,通常以字節(jié)數(shù)表示 |
Content-MD5 | 主體的MD5校驗和 |
Content-Type | 主體的對象類型 |
HTTP協(xié)議作為應(yīng)用層協(xié)議離不開TCP/IP協(xié)議的支持!