來自微信公眾號:開點(diǎn)工作室(ID:kaidiancs)
用戶訪問萬維網(wǎng)文檔崭闲,萬維網(wǎng)文檔之間的鏈接以及萬維網(wǎng)文檔中數(shù)據(jù)傳送到用戶計算機(jī)族购,這些功能的實現(xiàn)都是由超文本傳輸協(xié)議HTTP(HyperTextTransfer Protocol)負(fù)責(zé)完成的最住。HTTP是一個應(yīng)用層協(xié)議箫津,它使用TCP連接進(jìn)行可靠的傳送俭嘁,能夠在萬維網(wǎng)上進(jìn)行文本、聲音肴颊、圖像氓栈、視頻等各種信息的交換。
HTTP協(xié)議也是工作在客戶機(jī)/服務(wù)器模式下婿着,分為HTTP客戶端和HTTP服務(wù)器兩個部分授瘦,雙方每次進(jìn)行交互醋界,都是由客戶端發(fā)出的請求和服務(wù)器端發(fā)出的響應(yīng)構(gòu)成。HTTP協(xié)議規(guī)定的用戶使用瀏覽器訪問萬維網(wǎng)的過程可以總結(jié)為:
1.用戶在瀏覽器中鍵入需要訪問網(wǎng)頁的URL或者點(diǎn)擊某個網(wǎng)頁中鏈接提完;
2.瀏覽器根據(jù)URL中的域名形纺,通過DNS解析出目標(biāo)網(wǎng)頁的IP地址;
3.瀏覽器與網(wǎng)頁所在服務(wù)器建立TCP連接徒欣;
4.瀏覽器發(fā)送HTTP請求報文逐样,獲取目標(biāo)網(wǎng)頁的文件;
5.服務(wù)器發(fā)送HTTP響應(yīng)報文打肝,將目標(biāo)網(wǎng)頁文件發(fā)送給瀏覽器脂新;
6.釋放TCP連接;
7.瀏覽器將網(wǎng)頁的內(nèi)容包括文本粗梭、圖像争便、聲音等顯示呈現(xiàn)在用戶計算機(jī)屏幕。
HTTP協(xié)議是無連接的断医,它使用面向連接的TCP協(xié)議所提供的服務(wù)滞乙。同時,HTTP協(xié)議也是無狀態(tài)的鉴嗤,即服務(wù)器端不記錄客戶端訪問的時間和次數(shù)斩启。最初的HTTP協(xié)議版本是1.0版,使用非持續(xù)連接(nonpersistentconnection)躬窜。每傳輸一個對象都需要利用1個往返時間RTT建立TCP連接浇垦,用1個往返時間RTT申請并傳輸回對象,即平均用2個往返時間RTT獲取一個對象荣挨。目前使用比較廣泛的是HTTP協(xié)議的1.1版本(HTTP/1.1)男韧,其在默認(rèn)情況下使用持續(xù)連接(persistentconnection),即利用同一個TCP連接傳輸多個對象默垄。
HTTP報文是面向文本的此虑,報文中的每一個字段都是一些ASCII碼串,各個字段的長度是不確定的口锭。HTTP有兩類報文:請求報文和響應(yīng)報文朦前。請求報文是從客戶端向服務(wù)器發(fā)送的報文,響應(yīng)報文是從服務(wù)器到客戶端的報文鹃操。下面分別介紹請求報文和響應(yīng)報文的具體格式韭寸。
1.HTTP請求報文格式
HTTP請求報文的由請求行、請求頭部行荆隘、空行和請求數(shù)據(jù)四部分構(gòu)成恩伺,具體格式如下所示:
(請求行)方法名+空格+URL+空格+版本+回車換行(\r\n)
(請求頭部行1)關(guān)鍵字+“:”+空格+值+回車換行(\r\n)
……
(請求頭部行N)關(guān)鍵字+“:”+空格+值+回車換行(\r\n)
(空行)回車換行(\r\n)
(請求數(shù)據(jù))……
(1)請求行
請求行由請求方法字段、URL字段和HTTP協(xié)議版本字段3個字段組成椰拒,它們用空格分隔晶渠。最后由回車和換行表示請求行結(jié)束凰荚。例如:
GET?www.sdu.edu.cn? HTTP/1.1回車換行(\r\n)
其中“方法”字段表示該請求報文希望服務(wù)器做什么,請求報文的類型就是由所采用的方法決定的褒脯。HTTP請求報文的主要方法包括:GET便瑟、POST、HEAD番川、PUT到涂、DELETE、OPTIONS爽彤、TRACE养盗、CONNECT等。最常見的方法有GET和HEAD适篙。
GET是最常見的一種請求方式,當(dāng)客戶端要從服務(wù)器中讀取文檔時箫爷,當(dāng)點(diǎn)擊網(wǎng)頁上的鏈接或者通過在瀏覽器的地址欄輸入網(wǎng)址來瀏覽網(wǎng)頁嚷节,使用的都是GET方式。GET方法要求服務(wù)器將URL定位的資源放在響應(yīng)報文的數(shù)據(jù)部分虎锚,回送給客戶端硫痰。GET方式不適合傳送私密數(shù)據(jù)和大量數(shù)據(jù)。
HEAD的功能與GET相似窜护,只是服務(wù)器端接收到HEAD請求后只返回響應(yīng)頭效斑,而不會發(fā)送響應(yīng)內(nèi)容。當(dāng)我們只需要查看某個頁面的狀態(tài)的時候柱徙,使用HEAD是非常高效的缓屠,因為在傳輸?shù)倪^程中省去了頁面內(nèi)容。
(2)請求頭部行(header)
請求頭部行包括若干行护侮,每行由關(guān)鍵字及其值構(gòu)成的敌完,關(guān)鍵字和值用英文冒號“:”分隔,每一行都由回車換行表示結(jié)束羊初。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息滨溉,典型的請求頭部關(guān)鍵字有:
User-Agent:產(chǎn)生請求的瀏覽器類型。
Accept:客戶端可識別的內(nèi)容類型列表长赞。
Accept-Language:客戶端可識別的語言類型
晦攒。
Host:請求的主機(jī)名。
Connection:告知服務(wù)器發(fā)送完文檔后釋放連接還是保持連接得哆。
(3)空行
最后一個請求頭部之后是一個空行脯颜,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請求頭部了柳恐。
(4)請求數(shù)據(jù)
GET方法中沒有請求數(shù)據(jù)的內(nèi)容伐脖,POST方法使用請求數(shù)據(jù)热幔,用于客戶端向服務(wù)器端填寫表單等操作。
比如瀏覽器使用GET方法訪問山東大學(xué)主頁中的“學(xué)校簡介”文檔(URL為www.sdu.edu.cn/2010/xxjj.htm)讼庇,則其HTTP請求報文可以為:
GET /2010/xxjj.html HTTP/1.1 \r\n
Host: www.sdu.edu.cn\r\n
User-Agent:Mozilla/5.0
Accept-Language:cn */*\r\n
2.響應(yīng)報文格式
HTTP響應(yīng)也由四個部分組成绎巨,分別是:狀態(tài)行、消息頭部蠕啄、空行和響應(yīng)正文场勤。其具體格式如下:
(狀態(tài)行)版本+空格+狀態(tài)碼+空格+短語+回車換行
(消息頭部1)關(guān)鍵字+“:”+空格+值+回車換行
……
(消息頭部N)關(guān)鍵字+“:”+空格+值+回車換行
(空行)回車換行(\r\n)
(響應(yīng)正文)……
在響應(yīng)報文的狀態(tài)行中,版本字的表示服務(wù)器HTTP協(xié)議的版本歼跟,狀態(tài)碼字的表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼和媳;短語字段表示狀態(tài)代碼的文本描述。狀態(tài)碼由三位十進(jìn)制數(shù)字組成哈街,第一個數(shù)字定義了響應(yīng)的類別留瞳,有五種可能取值(1-5),每種狀態(tài)碼的含義如下:
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)娘香。
403 Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)办龄。
404 Not Found:請求資源不存在烘绽,比如輸入了錯誤的URL。
500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯誤俐填。
503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請求安接,一段時間后可能恢復(fù)正常。
消息頭部與請求頭部的格式相似英融,也是包含若干行盏檐,每行由關(guān)鍵字及其值構(gòu)成歇式,常用的關(guān)鍵字包括:
Date:表示返回消息的時間。
Content-Type:表示返回消息的內(nèi)容類型胡野。
Content-Length:返回內(nèi)容的長度(字節(jié)數(shù))材失。
Server:使用的服務(wù)器軟件及其版本號。
同樣硫豆,最后一個消息頭部之后是一個空行龙巨,發(fā)送回車符和換行符,通知客戶端以下不再有消息頭部了熊响。
響應(yīng)正文部分是服務(wù)器端根據(jù)客戶端的請求發(fā)回的具體文檔內(nèi)容旨别,以HTML語言表示。