HTTP協(xié)議
協(xié)議簡介
HTTP是網頁瀏覽器與網站服務器之間通信的標準協(xié)議途蒋。它是一個客戶端終端(用戶)和服務器端(網站)請求和應答的標準(TCP)猛遍。通過使用網頁瀏覽器、網絡爬蟲或者其它的工具号坡,客戶端發(fā)起一個HTTP請求到服務器上指定端口(默認端口為80)懊烤。我們稱這個客戶端為用戶代理程序(user agent)。應答的服務器上存儲著一些資源宽堆,比如HTML文件和圖像腌紧。我們稱這個應答服務器為源服務器(origin server)畜隶。在用戶代理和源服務器中間可能存在多個“中間層”,比如代理服務器籽慢、網關或者隧道(tunnel)。所以如果要提高用戶和源服務器之間的并發(fā)能力跛锌,一般是優(yōu)化網關(比如ngnix)极景,或者使用隧道優(yōu)化技術(比如japronto)驾茴。
盡管TCP/IP協(xié)議是互聯(lián)網上最流行的應用,HTTP協(xié)議中晨缴,并沒有規(guī)定必須使用它或它支持的層峡捡。事實上筑悴,HTTP可以在任何互聯(lián)網協(xié)議上阁吝,或其他網絡上實現(xiàn)械拍。HTTP假定其下層協(xié)議提供可靠的傳輸。因此甲馋,任何能夠提供這種保證的協(xié)議都可以被其使用迄损。因此也就是其在TCP/IP協(xié)議族使用TCP作為其傳輸層。
通常芹敌,由HTTP客戶端發(fā)起一個請求,創(chuàng)建一個到服務器指定端口(默認是80端口)的TCP連接拗引。HTTP服務器則在那個端口監(jiān)聽客戶端的請求幌衣。一旦收到請求,服務器會向客戶端返回一個狀態(tài)哼凯,比如"HTTP/1.1 200 OK"楚里,以及返回的內容,如請求的文件班缎、錯誤消息、或者其它信息蔑祟。
HTTP工作原理
HTTP協(xié)議定義Web客戶端如何從Web服務器請求Web頁面疆虚,以及服務器如何把Web頁面?zhèn)魉徒o客戶端。HTTP協(xié)議采用了請求/響應模型罢屈∑ぃ客戶端向服務器發(fā)送一個請求報文,請求報文包含請求的方法鄙币、URL蹂随、協(xié)議版本、請求頭部和請求數據绩衷。服務器以一個狀態(tài)行作為響應激率,響應的內容包括協(xié)議的版本、成功或者錯誤代碼乒躺、服務器信息、響應頭部和響應數據曹货。
以下是 HTTP 請求/響應的步驟:
客戶端連接到Web服務器 一個HTTP客戶端讳推,通常是瀏覽器,與Web服務器的HTTP端口(默認為80)建立一個TCP套接字連接礼饱。例如究驴,http://www.luffycity.com。
發(fā)送HTTP請求 通過TCP套接字蝴韭,客戶端向Web服務器發(fā)送一個文本的請求(Request)報文跑慕,一個請求報文由請求行摧找、請求頭部牢硅、空行和請求數據4部分組成减余。
服務器接受請求并返回HTTP響應(Response) Web服務器解析請求惩系,定位請求資源。服務器將資源復本寫到TCP套接字抒抬,由客戶端讀取晤柄。一個響應由狀態(tài)行、響應頭部惠勒、空行和響應數據4部分組成爬坑。
釋放連接TCP連接 若connection 模式為close,則服務器主動關閉TCP連接售担,客戶端被動關閉連接署辉,釋放TCP連接;若connection 模式為keepalive,則該連接會保持一段時間骑素,在該時間內可以繼續(xù)接收請求;
客戶端瀏覽器解析HTML內容 客戶端瀏覽器首先解析狀態(tài)行刚夺,查看表明請求是否成功的狀態(tài)代碼。然后解析每一個響應頭创橄,響應頭告知以下為若干字節(jié)的HTML文檔和文檔的字符集莽红“畎睿客戶端瀏覽器讀取響應數據HTML燃辖,根據HTML的語法對其進行格式化网棍,并在瀏覽器窗口中顯示。
例如:在瀏覽器地址欄鍵入URL氏身,按下回車之后會經歷以下流程:
瀏覽器向 DNS 域名解析服務器(一般無需特別配置)請求解析該 URL 中的域名所對應的 IP 地址;
解析出 IP 地址后惑畴,根據該 IP 地址和默認端口 80,和服務器建立TCP連接;
瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應的文件)的HTTP 請求陷虎,該請求報文作為 TCP 三次握手的第三個報文的數據發(fā)送給服務器;
服務器對瀏覽器請求作出響應倒得,并把對應的 html 文本發(fā)送給瀏覽器;
釋放 TCP連接;
瀏覽器將該 html 文本解碼并顯示內容;
我們可以看到霞掺,通常的HTTP協(xié)議中包括TCP的連接和斷開以及傳遞報文的功能。TCP協(xié)議在HTTP協(xié)議中起到傳輸層的作用缠劝。那么HTTP真正的嚴格定義就很清楚了骗灶,它是以網頁瀏覽器為客戶端,資源文件在服務器端耙旦,以TCP/IP為傳輸協(xié)議的一種通訊協(xié)議免都。它對應的套接字端口默認是80。
HTTP請求方法
HTTP/1.1協(xié)議中共定義了八種方法(也叫“動作”)來以不同方式操作指定的資源:
GET 向指定的資源發(fā)出“顯示”請求脓规。
HEAD 與GET方法一樣险领,都是向服務器發(fā)出指定資源的請求秒紧。只不過服務器將不傳回資源的本文部分挨下。它的好處在于,使用這個方法可以在不必傳輸全部內容的情況下绩聘,就可以獲取其中“關于該資源的信息”(元信息或稱元數據)耗啦。
POST 向指定資源提交數據机杜,請求服務器進行處理(例如提交表單或者上傳文件)。數據被包含在請求本文中似将。POST會向服務器增加或修改數據蚀苛,而且多次提交會造成資源重復創(chuàng)建。但很多時候為了查找方便速度更快腋舌,數據庫往往采用自增鍵作為主鍵渗蟹。這時候無法用PUT來操作。只能用POST來操作授艰。
PUT 向指定資源位置上傳更新或創(chuàng)建新內容世落。它與POST的區(qū)別是重復提交不會增加數據。但必須在客戶端明確知道數據資源的具體標識谷朝。有些在服務器端使用數據庫自增鍵作為主鍵的數據是無法用PUT來增改的忘古。但PUT能夠保證數據資源不會被打亂,所以原則上應該用PUT請求而非POST請求送朱。在設計數據庫時,經常使用的數據要設計成修改必須用PUT驶沼,數據主鍵不能是自增鍵。
DELETE 請求服務器刪除Request-URI所標識的資源大年。
TRACE 回顯服務器收到的請求翔试,主要用于測試或診斷复旬。
OPTIONS 這個方法可使服務器傳回該資源所支持的所有HTTP請求方法。用'*'來代替資源名稱壁涎,向Web服務器發(fā)送OPTIONS請求,可以測試服務器功能是否正常運作怔球。
CONNECT HTTP/1.1協(xié)議中預留給能夠將連接改為管道方式的代理服務器竟坛。通常用于SSL加密服務器的鏈接(經由非加密的HTTP代理服務器)。
關于HTTP請求方法的兩種主要方法的常識:
? GET提交的數據會放在URL之后流码,也就是請求行里面延刘,以?分割URL和傳輸數據,參數之間以&相連驾荣,如EditBook?name=test1&id=123456.(請求頭里面那個content-type做的這種參數形式普泡,后面講) POST方法是把提交的數據放在HTTP包的請求體中.
? GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
2.3.4 HTTP消息詳解
HTTP消息可以分為客戶端請求(request)和服務器端響應(response)兩種歧匈。其中客戶端請求的格式如圖
所示件炉。其中GET請求實際上是以URL的形式展現(xiàn)出來的。
而服務器端的響應(response)則格式如圖所示口糕。
HTTP響應的示例如下圖所示: