防偽碼:讓堅持成為習(xí)慣,讓放棄成為奢侈。
http協(xié)議介紹
http:Hyper Text Transfer Protocol 超文本傳輸協(xié)議,是互聯(lián)網(wǎng)應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,主要用于Web服務(wù)。通過計算機(jī)處理文本信息,格式為HTML(Hyper Text Mark Language)超文本標(biāo)記語言來實(shí)現(xiàn)。
http協(xié)議的版本
http 0.9:僅于用戶傳輸html文檔
http 1.0
1.引入了MIME(Multipurpose Internet Mail Extesions)機(jī)制:多用途互聯(lián)網(wǎng)郵件擴(kuò)展,引入這個技術(shù)之后,http可以發(fā)送多媒體(比如視頻、音頻等)信息。此機(jī)制讓http不在單單只支持html格式,還可以支持其他格式來進(jìn)行發(fā)送了。
2.引入了keep-alive機(jī)制,支持持久連接的功能(但這個keep-alive原理是在首部添加了某個字段而形成的,并非原生就支持此功能)
3.引入支持緩存功能
http 1.1
支持更多的請求方法,更加精細(xì)的緩存控制,原生直接支持持久連接功能(presistent)。
http 2.0
提供了HTTP語義優(yōu)化的傳輸,spdy : google引入了的一個技術(shù),能夠加速http數(shù)據(jù)交互,尤其是使用ssl加速機(jī)制,但是spdy現(xiàn)在用的還不多。
目前常用的版本就是http 1.0版本和http 1.1版本。
html文本介紹
html文本架構(gòu)
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1>H1</h1>
<p></p>
<h2>H2</h2>
<p><a href="admin.html">ToGoogle</a></p>
</body>
</html>
html文檔的生成方式
靜態(tài)
事先就編輯并定義完成的
動態(tài)
通過編譯語言編寫的程序后輸出html格式的結(jié)果
動態(tài)語言有:php,jsp,asp,.net
備注:這些腳本都必須有相應(yīng)的解釋器,比如說php需要有php解釋器等等
靜態(tài)和動態(tài)的方式
靜態(tài)
1、Web服務(wù)器向內(nèi)核注冊socket
2、客戶端通過瀏覽器,向Web服務(wù)器發(fā)起request請求
3、Web服務(wù)器收到客戶端的request信息
4、如果用戶請求的資源在服務(wù)器本地的話,http服務(wù)會向系統(tǒng)內(nèi)核申請調(diào)用
5、內(nèi)核調(diào)用本地磁盤里的數(shù)據(jù),并將數(shù)據(jù)發(fā)給http服務(wù)
6、http將用戶請求的資源通過response報文,最終響應(yīng)給客戶端
動態(tài)
與靜態(tài)不同的是,如果用戶請求的是動態(tài)內(nèi)容,那么此時http服務(wù)會調(diào)用后端的解析器,由動態(tài)語言去處理用戶的請求,如果需要請求數(shù)據(jù)的時候,會向內(nèi)核申請調(diào)用,從而向磁盤中獲取用戶指定的數(shù)據(jù),通過解釋器運(yùn)行,運(yùn)行的結(jié)果通常會生成html格式的文件。然后構(gòu)建成響應(yīng)報文,最終發(fā)回給客戶端。
http協(xié)議
http協(xié)議的報文
HTTP報文中存在著很多行的內(nèi)容,一般是由ASCII碼串組成,各字段長度是不確定的。HTTP的報文可分為兩種:請求報文與響應(yīng)報文
1.request Message(請求報文)
客戶端 -→ 服務(wù)器端
由客戶端向服務(wù)器端發(fā)出請求,不同的網(wǎng)站用于請求不同的資源(html文檔)
2.response Message(響應(yīng)報文)
服務(wù)器端 -→客戶端
是服務(wù)器予以響應(yīng)客戶端的請求
請求報文格式介紹
請求行 + 請求首部 + 空白行 + 請求實(shí)體
例如:
<method><request-URL><version>
<HEADERS>
# 這里一定要是一個空白行
<entity-body>
1.請求行
由請求方法字段<method>+請求URL字段<request-URL>+HTTP協(xié)議版本<version>組成,用來標(biāo)識客戶端請求的資源時使用的請求方法,請求的資源,請求的協(xié)議版本是什么,它們直接使用“空格”進(jìn)行分隔!
<method>這次請求的方式是什么,也就是請求方法
<request-URL>請求的是哪個資源,哪個URL??梢允窍鄬β窂剑?images/log.jpg,也可以是絕對路徑,如http://www.baidu.com/images.banner.jpg
<version>請求的協(xié)議版本是什么,http協(xié)議版本,格式HTTP/<major>.<minor>,例如:HTTP/1.0,HTTP/1.1
上圖是用wireshark工具抓取http請求報文的顯示結(jié)果。在首部后的“\r\n”表示一個回車和換行,以此將該首部與下一個首部隔開。
或者用curl命令獲取http請求報文
2.請求首部
由關(guān)鍵字+關(guān)鍵字的值組成,之間使用“:”進(jìn)行分隔,格式Name:Value,請求首部的作用是通過客戶端將請求的相關(guān)內(nèi)容告知服務(wù)器端,首部可以不止一個。
<HEADERS>首部,首部可能不止一個。各種所可以使用的首部信息
3.空白行
請求首部之后會有一個空白行,通過發(fā)送回車字符和換行符,用于通知服務(wù)器端以下的內(nèi)容將不會再出現(xiàn)請求首部的信息。
4.請求實(shí)體
你需要請求的內(nèi)容到底是什么
<entity-body>請求實(shí)體,你到底請求的內(nèi)容是什么
響應(yīng)報文格式介紹
起始行 + 響應(yīng)首部 + 空白行 + 響應(yīng)實(shí)體
例如:
<version><status><reason-phrase>
<HEADERS>
# 這里一定要是一個空白行
<entity-body>
1.起始行
也稱之為狀態(tài)行,用于服務(wù)器端響應(yīng)客戶端請求的狀態(tài)信息,由版本號<version> + 狀態(tài)碼<status> + 原因短語<reason-phrase>組成,例如“ HTTP/1.1 200 OK”
<version>響應(yīng)時客戶端請求的是什么版本,服務(wù)器端就需要響應(yīng)什么版本
<status>請求的狀態(tài)碼是什么 202,403等
<reason-phrase>響應(yīng)的狀態(tài)碼的信息是什么,原因短語,這個狀態(tài)碼所響應(yīng)的意義,易讀信息
<HEADERS>一大堆的響應(yīng)首部
<entity-body>響應(yīng)體
2.響應(yīng)首部
<version>響應(yīng)時客戶端請求的是什么版本,服務(wù)器端就需要響應(yīng)什么版本
<status>請求的狀態(tài)碼是什么 202,403等
<reason-phrase>響應(yīng)的狀態(tài)碼的信息是什么,原因短語,這個狀態(tài)碼所響應(yīng)的意義,易讀信息
<HEADERS>一大堆的響應(yīng)首部
<entity-body>響應(yīng)體
類似請求報文,起始行后面一般有若干個頭部字段。每個頭部字段都包含一個名字和一個值,兩者之間用冒號分割。格式Name:Value。
例如:
Content-Type:
test/html; charset=utf-8
Content-Length: 78
3.空白行
最后一個響應(yīng)首部信息之后就是一個空行,通過發(fā)送回車符和換行符,通知客戶端空行下無首部信息
4.響應(yīng)實(shí)體
響應(yīng)實(shí)體中裝載了要返回給客戶端的數(shù)據(jù)。這些數(shù)據(jù)可以是文本,也可以是二進(jìn)制(例如圖片,視頻)
<version>響應(yīng)時客戶端請求的是什么版本,服務(wù)器端就需要響應(yīng)什么版本
<status>請求的狀態(tài)碼是什么 202,403等
<reason-phrase>響應(yīng)的狀態(tài)碼的信息是什么,原因短語,這個狀態(tài)碼所響應(yīng)的意義,易讀信息
<HEADERS>一大堆的響應(yīng)首部
<entity-body>響應(yīng)體
HTTP請求方法
在HTTP通信過程中,每個HTTP請求報文中都會包含一個HTTP請求方法,用于告知客戶端向服務(wù)器端請求執(zhí)行某些具體的操作,下面列舉幾項(xiàng)常用的HTTP請求方法。
HTTP請求方法 | 描述 |
GET | 用于客戶端請求指定資源信息,并返回指定資源實(shí)體 |
HEAD | 跟GET相似,但其不需要服務(wù)器響應(yīng)請求的資源,而返回響應(yīng)首部(只需要響應(yīng)首部即可,就是告訴我有或者沒有,不需要緩存界面給我) |
POST | 基于HTML表單向服務(wù)器提交數(shù)據(jù),服務(wù)器通常需要存儲此數(shù)據(jù),通常存放在mysql這種關(guān)系型數(shù)據(jù)庫中 |
PUT | 與GET相反,是向服務(wù)器發(fā)送資源的,服務(wù)器通常需要存儲此資源(存放的位置通常是文件系統(tǒng)) |
DELETE | 請求服務(wù)器端刪除URL指定的資源 |
MOVE | 請求服務(wù)器將指定的頁面移至另一個網(wǎng)絡(luò)地址 |
OPTIONS | 探測服務(wù)器端對請求的URL所支持使用的請求方法 |
TRACE | 跟一次請求中間所經(jīng)歷的代理服務(wù)器、防火墻或網(wǎng)關(guān)等。 |
常用的HTTP請求方式是GET, POST, HEAD
HTTP的狀態(tài)碼
狀態(tài)碼 | 說明 |
1XX | 信息性狀態(tài)碼,用于指定客戶端相應(yīng)的某些操作 |
2XX | 成功狀態(tài)碼,我請求一個資源,這個資源在,這就表示請求成功了。 |
3XX | 重定向的狀態(tài)碼,有時會返回的是一個新地址,而非結(jié)果 |
4XX | 客戶端類錯誤,你請求的資源不存在,或者你請求的時候,我們這個資源拒絕你訪問,你沒有權(quán)限 |
5XX | 服務(wù)器類的錯誤信息。向服務(wù)器發(fā)起請求,服務(wù)器發(fā)現(xiàn)需要運(yùn)行一個腳本,從而調(diào)用解析庫。如果在調(diào)用過程中出錯就會出現(xiàn)這種情況?;蛘吣愕哪_本有語法錯誤,也可能會導(dǎo)致這個問題。 |
常用狀態(tài)碼說明
狀態(tài)碼 | 說明 |
200 | 服務(wù)器成功返回網(wǎng)頁,這是成功的HTTP請求返回的標(biāo)準(zhǔn)狀態(tài)碼 |
201 | CREATED 上傳文件成功后顯示 |
301 | Move Permanently,永久重定向,會返回一個新地址,并告訴我們你所請求的地址將永久挪到那個新地址去了 |
302 | Fonud,臨時重定向,臨時放到某個地方,會在響應(yīng)報文中使用“Location:新位置”; |
304 | Not Modified,資源沒有做任何修改 |
403 | Forbidden 請求被拒絕 |
404 | Not Found 請求的資源不存在 |
405 | Method Not Allowed 你使用的方法不被允許,不支持 |
500 | Internal Server Error:服務(wù)器內(nèi)部錯誤 |
502 | Bad Gateway,代理服務(wù)器從上游服務(wù)器收到一條偽響應(yīng);上一層服務(wù)器返回了一個無法理解的報文,所以代理服務(wù)器就會表示錯誤。 |
503 | Service Unavailable,服務(wù)暫時不可用 |
HTTP首部介紹
通用首部
請求首部
響應(yīng)首部
實(shí)體首部:專門用來表示實(shí)體中資源內(nèi)部的類型、長度、編碼格式等
擴(kuò)展首部:非標(biāo)準(zhǔn)首部,可有程序員自行創(chuàng)建
通用首部
Connection:定義C/S之間關(guān)于請求、響應(yīng)的有關(guān)選項(xiàng)
在http1.0 的時候,如果他想使用持久連接,那么他所設(shè)置的選項(xiàng)即為
Connection:keep-alive
Cache-Control:緩存控制,實(shí)現(xiàn)更精細(xì)的緩存控制方式。在http 1.1上比較常見
請求首部
Client-IP :客戶端 IP地址
Host :請求的主機(jī),這在實(shí)現(xiàn)基于主機(jī)名的虛擬主機(jī)時很有用
Referer :指明了請求當(dāng)前資源原始資源的URL,使用referer是可以防盜鏈
User-Agent:用戶代理,一般而言是瀏覽器
Accept首部:指客戶端可以接受哪些編碼的類型
§ Accept:服務(wù)端能夠發(fā)送的媒體的類型
§ Accetp-Charset:接收的字符集
§ Accept-Encoding:編碼格式
§ Accept-Lanage:所能接受的語言編碼格式
條件式請求首部:(在http1.1中才會用到)
當(dāng)發(fā)送請求時,先問問對方是否滿足條件,如果滿足條件就請求,不滿足就不請求
跟安全相關(guān)的請求:
§ Authorization
§ Cookie
響應(yīng)首部
Age:資源響應(yīng)給你之后可以使用的時長
Server:向客戶端說明自己用到的程序名稱和版本
協(xié)商類的首部:
§ Vary:首部列表,服務(wù)器會根據(jù)此列表挑選最適合的版本發(fā)給客戶端
跟安全相關(guān):
§ WWW-Authentication
§ Set-Cookie
實(shí)體首部
Location:指明資源的新位置,實(shí)現(xiàn)302響應(yīng)碼時通常會用到
Allow:允許對此資源使用的請求方法
內(nèi)容相關(guān)的首部
§ Content-Encoding
§ Content-Language
§ Content-Length
§ Content-Location:內(nèi)容所在的位置
§ Content-Type
緩存相關(guān):
§ ETag:擴(kuò)展標(biāo)簽/標(biāo)記
§ Expires:過期時間
§ Last-Modified:最后修改時間
ETag解釋:
在網(wǎng)絡(luò)上,有一些緩存服務(wù)器,另外,瀏覽器自身也有緩存功能
基于一個前提:圖片不會經(jīng)常改動,服務(wù)器在返回狀態(tài)碼200的同時,還會返回該圖片的簽名Etag,(可以理解為圖片的指紋),當(dāng)瀏覽器再次訪問該圖片時,就會去服務(wù)器校驗(yàn)指紋信息,如果圖片沒有變化,直接使用緩存里的圖片,這樣減輕了服務(wù)器的負(fù)擔(dān),一看到304,瀏覽器就知道了,要從本地緩存里面取圖片,節(jié)省了圖片在網(wǎng)絡(luò)上傳輸?shù)臅r間
附:
HTTP最常見的請求頭如下:
Accept:瀏覽器可接受的MIME類型;
Accept-Charset:瀏覽器可接受的字符集;
Accept-Encoding:瀏覽器能夠進(jìn)行解碼的數(shù)據(jù)編碼方式,比如gzip。
Accept-Language:瀏覽器所希望的語言種類
Authorization:授權(quán)信息,通常出現(xiàn)在對服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中;
Connection:表示是否需要持久連接。值為“Keep-Alive”,或者看到請求使用的是HTTP 1.1(HTTP 1.1默認(rèn)進(jìn)行持久連接),它就可以利用持久連接的優(yōu)點(diǎn),當(dāng)頁面包含多個元素時(例如Applet,圖片),顯著地減少下載所需要的時間。
Content-Length:表示請求消息正文的長度;
Cookie:這是最重要的請求頭信息之一;
Cookie相關(guān)的HTTP擴(kuò)展頭
1)Cookie:客戶端將服務(wù)器設(shè)置的Cookie返回到服務(wù)器;
2)Set-Cookie:服務(wù)器向客戶端設(shè)置Cookie;
3)Cookie2 (RFC2965)):客戶端指示服務(wù)器支持Cookie的版本;
4)Set-Cookie2 (RFC2965):服務(wù)器向客戶端設(shè)置Cookie。
Cookie的流程
服務(wù)器在響應(yīng)消息中用Set-Cookie頭將Cookie的內(nèi)容回送給客戶端,客戶端在新的請求中將相同的內(nèi)容攜帶在Cookie頭中發(fā)送給服務(wù)器。從而實(shí)現(xiàn)會話的保持。
流程如下圖所示:
Host:初始URL中的主機(jī)和端口;
If-Modified-Since:只有當(dāng)所請求的內(nèi)容在指定的日期之后又經(jīng)過修改才返回它,否則返回304“Not Modified”應(yīng)答;
Referer:包含一個URL,用戶從該URL代表的頁面出發(fā)訪問當(dāng)前請求的頁面。
User-Agent:瀏覽器類型
HTTP最常見的響應(yīng)頭
HTTP最常見的響應(yīng)頭如下所示:
Allow:服務(wù)器支持哪些請求方法(如GET、POST等);
Content-Encoding:文檔的編碼(Encode)方法。
Content-Length:表示內(nèi)容長度。只有當(dāng)瀏覽器使用持久HTTP連接時才需要這個數(shù)據(jù)。
Content-Type: 表示后面的文檔屬于什么MIME類型。
Accept-Ranges: bytes該響應(yīng)頭表明服務(wù)器支持Range請求,以及服務(wù)器所支持的單位是字節(jié)(這也是唯一可用的單位).我們還能知道:服務(wù)器支持?jǐn)帱c(diǎn)續(xù)傳,以及支持同時下載文件的多個部分,也就是說下載工具可以利用范圍請求加速下載該文件.Accept-Ranges: none響應(yīng)頭表示服務(wù)器不支持范圍請求.
Date:當(dāng)前的GMT時間。
Expires:指明應(yīng)該在什么時候認(rèn)為文檔已經(jīng)過期,從而不再緩存它。
Last-Modified:文檔的最后改動時間。
Location:表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n。
Refresh:表示瀏覽器應(yīng)該在多少時間之后刷新文檔,以秒計。
HTTP最常見的實(shí)體頭
實(shí)體頭用作實(shí)體內(nèi)容的元信息,描述了實(shí)體內(nèi)容的屬性,包括實(shí)體信息類型,長度,壓縮方法,最后一次修改時間,數(shù)據(jù)有效性等。
Allow:GET,POST
Content-Encoding:文檔的編碼(Encode)方法,例如:gzip,
Content-Language:內(nèi)容的語言類型,例如:zh-cn;
Content-Length:表示內(nèi)容長度,eg:80,可參考“2.5響應(yīng)頭”;
Content-Location:表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n,例如:http://www.dfdf.org/dfdf.html,
Content-MD5:MD5 實(shí)體的一種MD5摘要,用作校驗(yàn)和。發(fā)送方和接受方都計算MD5摘要,接受方將其計算的值與此頭標(biāo)中傳遞的值進(jìn)行比較。
Content-Type:標(biāo)明發(fā)送或者接收的實(shí)體的MIME類型。Eg:text/html; charset=GB2312 主類型/子類型;
HTTP的事務(wù)
包含了一個HTTP請求,和對應(yīng)請求的響應(yīng)就叫做一個http事務(wù),也可以理解http事務(wù)就是一個完整的HTTP請求和HTTP響應(yīng)的過程。
http協(xié)議默認(rèn)情況下每個事務(wù)都會打開和關(guān)閉一個新的連接,所以會相當(dāng)耗費(fèi)時間和帶寬,由于TCP慢啟動特性,所以每條新的連接的性能本身就會有所降低,所以可打開的并行連接的數(shù)量上限是有限的。所以使用持久連接這種模式比默認(rèn)情況下不使用持久連接的方式會好一點(diǎn),他的好處表現(xiàn)在其請求和tcp斷開的過程所消耗的時間會被減少。
HTTP資源
資源就是通過HTTP協(xié)議可以讓用戶通過瀏覽器或用戶代理能夠通過基于http協(xié)議向服務(wù)器端請求并獲取的內(nèi)容,像html文檔,一張圖片等等。
資源類型:是通過MIME進(jìn)行標(biāo)記
格式:major/minor 主標(biāo)記和次標(biāo)記
常用的MIME類型
MIME類型 | 文件類型 |
test/html | html、htm文本類型 |
text/plain | text文本類型 |
image/jpeg | jpeg圖像類型 |
image/gif | gif圖像類型 |
vedio/mpeg4 | 音頻標(biāo)記類型 |
application/vnd.ms-powerpoint | 動態(tài)資源的標(biāo)記方式 |
URI和URL
URI(Uniform Resource Identifier) 同一資源標(biāo)示符
用于標(biāo)識某一互聯(lián)網(wǎng)資源名稱的字符串,通過這種標(biāo)識來允許你用戶對資源可通過特定的協(xié)議進(jìn)行交互操作。在Web上可用的每種資源,包括HTML文檔、圖像、視頻片段、程序等,
由一個通用資源標(biāo)識符進(jìn)行定位。所以我們可以使用URI來標(biāo)識每個資源的名稱
URL(Uniform Resource Locator)(統(tǒng)一資源定位符)
用于描述一個特定服務(wù)器上某資源的特定位置。
例如:http://www.baidu.com:80/download/bash-4.3.1-1.rpm
URL的格式分為三個部分
i. scheme(方案)(也叫協(xié)議):http://
ii. Internet地址:一般這個地址指的是服務(wù)器:www.baidu.com:8080
iii. 特定服務(wù)器上的資源:download/bash-4.3.1-1.rpm
CGI
Common Gateway Interface 通用網(wǎng)關(guān)接口
web服務(wù)器發(fā)現(xiàn)需要執(zhí)行腳本了,就通過CGI協(xié)議跟后端的應(yīng)用程序打交道,把用戶的請求動態(tài)交給服務(wù)器,這個服務(wù)器的結(jié)果通過CGI協(xié)議返回給http服務(wù)器。
其他需要了解的知識
一次Web資源請求的具體過程
1. 客戶端在Web瀏覽器輸入需要訪問的地址
2. Web瀏覽器會請求DNS服務(wù)器,查詢解析到指定域名和Web服務(wù)器的地址
3. 客戶端與請求的Web服務(wù)器端建立連接(TCP三次握手)
4. TCP建立成功之后,發(fā)起HTTP請求
5. 服務(wù)器端收到客戶端HTTP請求之后,會處理該請求
6. 處理客戶端指定請求的資源
7. 服務(wù)器構(gòu)建響應(yīng)報文,響應(yīng)給客戶端
8. 服務(wù)器端將此信息記錄到日志中
http如何并發(fā)的接收多個用戶請求
因?yàn)閔ttp默認(rèn)是工作在阻塞模型下的,默認(rèn)一次只接收一個請求,處理完請求后再去接收下一個請求,所以只能一個一個來。
所以我們希望并發(fā)響應(yīng)用戶請求,需要多進(jìn)程模型。web服務(wù)器自己會生成多個子進(jìn)程響應(yīng)用戶請求,也就是說,當(dāng)一個用戶請求發(fā)到Web服務(wù)器,Web主進(jìn)程不會直接響應(yīng)用戶請求,而是生成一個子進(jìn)程響應(yīng)這個用戶請求,這樣當(dāng)子進(jìn)程和此用戶建立連接之后。Web的主進(jìn)程就會再等待另一個用戶的請求,當(dāng)?shù)诙€用戶請求過來之后,再生成一個子進(jìn)程響應(yīng)第二個用戶請求。以此類推。所以每一個用戶請求都由一個子進(jìn)程來處理。
擴(kuò)展知識點(diǎn)1:利用wireshark分析HTTP協(xié)議
實(shí)驗(yàn)步驟
清空緩存
在進(jìn)行跟蹤之前,我們首先清空Web 瀏覽器的高速緩存來確保Web網(wǎng)頁是從網(wǎng)絡(luò)中獲取的,而不是從高速緩沖中取得的。之后,還要在客戶端清空DNS高速緩存,來確保Web服務(wù)器域名到IP地址的映射是從網(wǎng)絡(luò)中請求。
啟動wireshare
開始俘獲
1) 在菜單中選擇capture-options,選擇網(wǎng)絡(luò),打開start。如下圖:
2) 在瀏覽器地址欄中輸入www.baidu.com,然后結(jié)束俘獲,得到如下結(jié)果:
3) 在過濾器中選擇HTTP,點(diǎn)擊apply,得到如下結(jié)果:
四、 分析數(shù)據(jù)
在協(xié)議框中選擇“GET/HTTP/1.1”所在的分組會看到這個基本請求行后跟隨著一系列額外的請求首部。在首部后的“\r\n”表示一個回車和換行,以此將該首部與下一個首部隔開。
“Host”首部在HTTP1.1版本中是必須的,它描述了URL中機(jī)器的域名,本測試中是www.baidu.com。這就允許了一個Web服務(wù)器在同一時間支持許多不同的域名。有了這個首部,Web服務(wù)器就可以區(qū)別客戶試圖連接哪一個Web服務(wù)器,并對每個客戶響應(yīng)不同的內(nèi)容。
User-Agent首部描述了提出請求的Web瀏覽器及客戶機(jī)器。
接下來是一系列的Accpet首部,包括Accept(接受)、Accept-Language(接受語言)、Accept-Encoding(接受編碼)、Accept-Charset(接受字符集)。它們告訴Web服務(wù)器客戶Web瀏覽器準(zhǔn)備處理的數(shù)據(jù)類型。Web服務(wù)器可以將數(shù)據(jù)轉(zhuǎn)變?yōu)椴煌恼Z言和格式。這些首部表明了客戶的能力和偏好。
Keep-Alive及Connection首部描述了有關(guān)TCP連接的信息,通過此連接發(fā)送HTTP請求和響應(yīng)。它表明在發(fā)送請求之后連接是否保持活動狀態(tài)及保持多久。大多數(shù)HTTP1.1連接是持久的(persistent),意思是在每次請求后不關(guān)閉TCP連接,而是保持該連接以接受從同一臺服務(wù)器發(fā)來的多個請求。
我們已經(jīng)察看了由Web瀏覽器發(fā)送的請求,現(xiàn)在我們來觀察Web服務(wù)器的應(yīng)答。響應(yīng)首先發(fā)送“HTTP/1.1 200 ok”,指明它開始使用HTTP1.1版本來發(fā)送網(wǎng)頁。同樣,在響應(yīng)分組中,它后面也跟隨著一些首部。最后,被請求的實(shí)際數(shù)據(jù)被發(fā)送。第一個Cache-control首部,用于描述是否將數(shù)據(jù)的副本存儲或高速緩存起來,以便將來引用。一般個人的Web瀏覽器會高速緩存一些本機(jī)最近訪問過的網(wǎng)頁,隨后對同一頁面再次進(jìn)行訪問時,如果該網(wǎng)頁仍存儲于高速緩存中,則不再向服務(wù)器請求數(shù)據(jù)。在HTTP請求中,Web服務(wù)器列出內(nèi)容類型及可接受的內(nèi)容編碼。此例中Web服務(wù)器選擇發(fā)送內(nèi)容的類型是text/html
擴(kuò)展知識點(diǎn)2:curl查看HTTP 響應(yīng)頭信息
先看看客戶端(瀏覽器)從服務(wù)器請求數(shù)據(jù)經(jīng)歷如下基本步驟:
1.用戶發(fā)起一個http請求,緩存獲取到URL,根據(jù)URL查找是否有匹配的副本,這個副本可能在內(nèi)存中,也可能在本地磁盤。
2、如果請求命中本地緩存則從本地緩存中獲取一個對應(yīng)資源的"copy";
3、檢查這個"copy"是否過期,否則直接返回,是則繼續(xù)向服務(wù)器轉(zhuǎn)發(fā)請求。 HTTP中,通過Cache-Control首部和Expires首部為文檔指定了過期時間,通過對過期時間的判斷,緩存就可以知道文檔是不是在保質(zhì)期內(nèi)。Expires首部和Cache-Control:max-age首部都是來告訴緩存文檔有沒有過期,為什么需要兩個響應(yīng)首部來做這件簡單的事情了?其實(shí)這一切都是歷史原因,Expires首部是HTTP
1.0中提出來的,因?yàn)樗褂玫氖墙^對日期,如果服務(wù)端和客戶端時鐘不同步的話(實(shí)際上這種情況非常常見),緩存可能就會認(rèn)為文檔已經(jīng)過了保質(zhì)期。
4、服務(wù)器接收到請求,然后判斷資源是否變更,是則返回新內(nèi)容,否則返回304,未變更,更新過期時間。
HTTP 響應(yīng)頭的信息
(1). HTTP返回碼:
1xx:client的請求server已經(jīng)接收,正在處理
2xx:成功 表示 client請求,server端已經(jīng)接收、理解并處理
3xx:client 請求被重定向其他的server【其他的URL】
4xx:表示client請求不正確,server不能識別
5xx:server端服務(wù)不正常
(2). Cache-Control:
web 站點(diǎn)對緩存的設(shè)置: Cache-Control指定請求和響應(yīng)遵循的緩存機(jī)制
緩存分類
1)私有緩存:常見就是我們的瀏覽器里內(nèi)置的緩存。
2)公有緩存:常見的就是代理緩存
先看Cache-Control可選的參數(shù):private、public 、no-cache、max-age、must-revalidate等
no-cache: 響應(yīng)不會被緩存,而是實(shí)時向服務(wù)器端請求資源
no-store :在任何條件下,響應(yīng)都不會被緩存,并且不會被寫入到客戶端的磁盤里,這也是基于安全考慮的某些敏感的響應(yīng)才會使用這個。
Private:指示對于單個用戶的整個或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)前用戶的部分響應(yīng)消息,此響應(yīng)消息對于其他用戶的請求無效。不能再用戶間共享。
Public:響應(yīng)會被緩存,并且在多用戶間共享。正常情況, 如果要求 HTTP 認(rèn)證,響應(yīng)會自動設(shè)置為 private。
max-age:指示客戶機(jī)可以接收生存期不大于指定時間(以秒為單位)的響應(yīng),例如: Cache-control: max-age=5 表示當(dāng)訪問此網(wǎng)頁后的5秒內(nèi)再次訪問不會去服務(wù)器。
must-revalidate :響應(yīng)在特定條件下會被重用,以滿足接下來的請求,但是它必須到服務(wù)器端去驗(yàn)證它是不是仍然是最新的(強(qiáng)制所有緩存都驗(yàn)證響應(yīng))。
proxy-revalidate :類似于 must-revalidate,它要求對公共緩存進(jìn)行驗(yàn)證
(3). Connection:
server 是否支持長連接;如果keep-alive 說明web的server 支持長連接。
但是TCP 的長連接是雙向的;必須是client和server 都支持長連接;才可以建立長連接。
一般client 【瀏覽器】都是默認(rèn)支持長連接;所以只要sever端支持長連接;就可以建立長連接。
通過curl的-w參數(shù)我們可以自定義curl的輸出,%{http_code}代表http狀態(tài)碼
本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!
更多建議: