引言
HTTP是一個屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議卸夕,由于其簡捷层释、快速的方式,適用于分布式超媒體信息系統(tǒng)快集。它于1990年提出贡羔,經(jīng)過幾年的使用與發(fā)展廉白,得到不斷地完善和擴(kuò)展。目前在WWW中使用的是HTTP/1.0的第六版乖寒,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中猴蹂,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出。
HTTP協(xié)議的特點
支持客戶/服務(wù)器模式楣嘁。
簡單快速:客戶向服務(wù)器請求服務(wù)時磅轻,只需傳送請求方法和路徑。請求方法常用的有GET马澈、HEAD瓢省、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同痊班。由于HTTP協(xié)議簡單勤婚,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快涤伐。
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象馒胆。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
無連接:無連接的含義是限制每次連接只處理一個請求凝果。服務(wù)器處理完客戶的請求祝迂,并收到客戶的應(yīng)答后,即斷開連接器净。采用這種方式可以節(jié)省傳輸時間型雳。
無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力山害。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息纠俭,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大浪慌。另一方面冤荆,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。
HTTP協(xié)議的應(yīng)用場景
- Web service权纤、WSDL钓简、小偷程序、采集程序汹想、爬蟲程序外邓、socket、防盜鏈
http協(xié)議執(zhí)行的粗糙流程
chrome搜索自身的DNS緩存
搜索操作系統(tǒng)自身的DNS緩存(瀏覽器沒有找到緩存或緩存已經(jīng)失效古掏,緩存時間大概只有一分鐘)
讀取本地host文件
瀏覽器發(fā)起一個DNS 的一個系統(tǒng)調(diào)用
寬帶運(yùn)營商服務(wù)器查詢本地緩存
運(yùn)營商服務(wù)器發(fā)起一個迭代DNS解析請求
運(yùn)營商服務(wù)器把結(jié)果返回操作系統(tǒng)內(nèi)核同時緩存起來
操作系統(tǒng)內(nèi)核把結(jié)果返回瀏覽器
最終瀏覽器那桐了xxx.abc.com對應(yīng)的ip地址
瀏覽器獲得域名對應(yīng)的ip地址后坐榆,發(fā)起http“三次握手”
TCP/IP連接建立起來,瀏覽器就可以向服務(wù)器發(fā)送http請求了使用了比如說冗茸,用http的get方式請求一個根域里的一個域名席镀,協(xié)議可以采用HTTP 1.1 的一個協(xié)議
服務(wù)器端接受到了這個請求匹中,根據(jù)路徑參數(shù),經(jīng)過后端的一些處理之后豪诲,把處理后的一個結(jié)果的數(shù)據(jù)返回給瀏覽器顶捷,如果是網(wǎng)站的頁面就會把完整的HTML頁面代碼返回給瀏覽器。
瀏覽器拿到了網(wǎng)站的完整的HTML頁面代碼屎篱,在解析和渲染這個頁面的時候服赎,里面的JS,CSS,圖片靜態(tài)資源,他們同樣也是一個HTTP請求交播,同需要經(jīng)過上面的主要七個步驟重虑。
瀏覽器根據(jù)拿到的資源對頁面進(jìn)行渲染,最終把一個完整的頁面呈現(xiàn)給用戶
http協(xié)議的組成部分
HTTP協(xié)議主要可以拆分兩大模塊 “請求”與“響應(yīng)”秦士, 他們都具備 HTTP頭 和 正文信息
詳細(xì)的消息報頭解釋可跳步《HTTP協(xié)議詳解之消息報頭篇》
客戶端 請求報文信息
- 報文首部(HTTP頭)
請求行:包栝請求方法缺厉,URL和HTTP協(xié)議版本
請求首部字段、通用首部字段隧土、實體首部字段提针、其他(包括請求的各種條件和屬性【值鍵值對】)
空行(CR+LF)
報文主體(正文信息【即用戶提交的表單數(shù)據(jù)】)
服務(wù)端 響應(yīng)報文信息
- 報文首部(HTTP頭)
狀態(tài)行:包括響應(yīng)結(jié)果的HTTP協(xié)議版本、狀態(tài)碼曹傀、狀態(tài)描述
響應(yīng)首部字段辐脖、通用首部字段、實體首部字段皆愉、其他(包括響應(yīng)的各種條件和屬性【值鍵值對】)
空行(CR+LF)
報文主體(正文信息【即服務(wù)端返回的數(shù)據(jù)】)
telnet執(zhí)行的代碼案例
POST /test.php HTTP/1.1 (CRLF) <請求行>
host:localhost (CRLF) <請求條件和屬性>
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Thu,08 Mar 201507:17:51 GMT (CRLF)
If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)
v:1.0 <請求報文主體>
HTTP/1.1 200 OK <狀態(tài)行>
Server: nginx <響應(yīng)條件和屬性>
Date: Thu,08 Mar 201507:17:52 GMT
Connection: Keep-Alive
Content-Length: 23330
Content-Type: text/html
Cache-control: private
http test <響應(yīng)報文主體>
http請求方法
請求方法(所有方法全為大寫)有多種嗜价,各個方法的解釋如下:
GET 請求獲取Request-URI所標(biāo)識的資源
POST 在Request-URI所標(biāo)識的資源后附加新的數(shù)據(jù)
HEAD 請求獲取由Request-URI所標(biāo)識的資源的響應(yīng)消息報頭
PUT 請求服務(wù)器存儲一個資源,并用Request-URI作為其標(biāo)識
DELETE 請求服務(wù)器刪除Request-URI所標(biāo)識的資源
TRACE 請求服務(wù)器回送收到的請求信息幕庐,主要用于測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢服務(wù)器的性能久锥,或者查詢與資源相關(guān)的選項和需求
響應(yīng)狀態(tài)碼
狀態(tài)代碼有三位數(shù)字組成,第一個數(shù)字定義了響應(yīng)的類別翔脱,且有五種可能取值:
1xx:指示信息--表示請求已接收,繼續(xù)處理
2xx:成功--表示請求已被成功接收媒鼓、理解届吁、接受
3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn)
5xx:服務(wù)器端錯誤--服務(wù)器未能實現(xiàn)合法的請求
常見狀態(tài)代碼、狀態(tài)描述绿鸣、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤疚沐,不能被服務(wù)器所理解
401 Unauthorized //請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務(wù)器收到請求潮模,但是拒絕提供服務(wù)
404 Not Found //請求資源不存在亮蛔,eg:輸入了錯誤的URL
500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯誤
503 Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請求,一段時間后可能恢復(fù)正常