HTTP簡(jiǎn)介及其報(bào)文格式
超文本傳輸協(xié)議(Hyper Text Transfer Protocol,HTTP)是一個(gè)簡(jiǎn)單的請(qǐng)求-響應(yīng)協(xié)議,它通常運(yùn)行在TCP之上。它指定了客戶(hù)端可能發(fā)送給服務(wù)器什么樣的消息以及得到什么樣的響應(yīng)。請(qǐng)求和響應(yīng)消息的頭以ASCII形式給出;而消息內(nèi)容則具有一個(gè)類(lèi)似MIME的格式。這個(gè)簡(jiǎn)單模型是早期Web成功的有功之臣,因?yàn)樗归_(kāi)發(fā)和部署非常地直截了當(dāng)。
萬(wàn)維網(wǎng)WWW(World Wide Web)發(fā)源于歐洲日內(nèi)瓦量子物理實(shí)驗(yàn)室CERN,正是WWW技術(shù)的出現(xiàn)使得因特網(wǎng)得以超乎想象的速度迅猛發(fā)展。這項(xiàng)基于TCP/IP的技術(shù)在短短的十年時(shí)間內(nèi)迅速成為已經(jīng)發(fā)展了幾十年的Internet上的規(guī)模最大的信息系統(tǒng),它的成功歸結(jié)于它的簡(jiǎn)單、實(shí)用。在WWW的背后有一系列的協(xié)議和標(biāo)準(zhǔn)支持它完成如此宏大的工作,這就是Web協(xié)議族,其中就包括HTTP超文本傳輸協(xié)議。在1990年,HTTP就成為WWW的支撐協(xié)議。當(dāng)時(shí)由其創(chuàng)始人WWW之父蒂姆·貝納斯·李(Tim Berners-Lee)提出,隨后WWW聯(lián)盟(WWW Consortium)成立,組織了IETF(Internet Engineering Task Force)小組進(jìn)一步完善和發(fā)布HTTP。
HTTP是應(yīng)用層協(xié)議,同其他應(yīng)用層協(xié)議一樣,是為了實(shí)現(xiàn)某一類(lèi)具體應(yīng)用的協(xié)議,并由某一運(yùn)行在用戶(hù)空間的應(yīng)用程序來(lái)實(shí)現(xiàn)其功能。HTTP是一種協(xié)議規(guī)范,這種規(guī)范記錄在文檔上,為真正通過(guò)HTTP進(jìn)行通信的HTTP的實(shí)現(xiàn)程序。HTTP是基于B/S架構(gòu)進(jìn)行通信的,而HTTP的服務(wù)器端實(shí)現(xiàn)程序有httpd、nginx等,其客戶(hù)端的實(shí)現(xiàn)程序主要是Web瀏覽器,例如Firefox、Internet Explorer、Google Chrome、Safari、Opera等,此外,客戶(hù)端的命令行工具還有elink、curl等。Web服務(wù)是基于TCP的,因此為了能夠隨時(shí)響應(yīng)客戶(hù)端的請(qǐng)求,Web服務(wù)器需要監(jiān)聽(tīng)在80/TCP端口。這樣客戶(hù)端瀏覽器和Web服務(wù)器之間就可以通過(guò)HTTP進(jìn)行通信了。
HTTP誕生之初主要是應(yīng)用于WEB端內(nèi)容獲取,那時(shí)候內(nèi)容還不像現(xiàn)在這樣豐富,排版也沒(méi)那么精美,用戶(hù)交互的場(chǎng)景幾乎沒(méi)有。對(duì)于這種簡(jiǎn)單的獲取網(wǎng)頁(yè)內(nèi)容的場(chǎng)景,HTTP表現(xiàn)得還算不錯(cuò)。但隨著互聯(lián)網(wǎng)的發(fā)展和WEB2.0的誕生,更多的內(nèi)容開(kāi)始被展示(更多的圖片文件),排版變得更精美(更多的CSS),更復(fù)雜的交互也被引入(更多的JS)。用戶(hù)打開(kāi)一個(gè)網(wǎng)站首頁(yè)所加載的數(shù)據(jù)總量和請(qǐng)求的個(gè)數(shù)也在不斷增加。今天絕大部分的門(mén)戶(hù)網(wǎng)站首頁(yè)大小都會(huì)超過(guò)2M,請(qǐng)求數(shù)量可以多達(dá)100個(gè)。另一個(gè)廣泛的應(yīng)用是在移動(dòng)互聯(lián)網(wǎng)的客戶(hù)端app,不同性質(zhì)的app對(duì)HTTP的使用差異很大。對(duì)于電商類(lèi)app,加載首頁(yè)的請(qǐng)求也可能多達(dá)10多個(gè)。對(duì)于微信這類(lèi)IM,HTTP請(qǐng)求可能僅限于語(yǔ)音和圖片文件的下載,請(qǐng)求出現(xiàn)的頻率并不算高。
HTTP報(bào)文由從客戶(hù)機(jī)到服務(wù)器的請(qǐng)求和從服務(wù)器到客戶(hù)機(jī)的響應(yīng)構(gòu)成。請(qǐng)求報(bào)文格式如下:
請(qǐng)求行 - 通用信息頭 - 請(qǐng)求頭 - 實(shí)體頭 - 報(bào)文主體
請(qǐng)求行以方法字段開(kāi)始,后面分別是URL字段和HTTP協(xié)議版本字段,并以CRLF結(jié)尾。SP是分隔符。除了在最后的CRLF序列中CF和LF是必需的之外,其他都可以不要。有關(guān)通用信息頭,請(qǐng)求頭和實(shí)體頭方面的具體內(nèi)容可以參照相關(guān)文件。
應(yīng)答報(bào)文格式如下:
狀態(tài)行 - 通用信息頭 - 響應(yīng)頭 - 實(shí)體頭 - 報(bào)文主體
狀態(tài)碼元由3位數(shù)字組成,表示請(qǐng)求是否被理解或被滿(mǎn)足。原因分析是對(duì)原文的狀態(tài)碼作簡(jiǎn)短的描述,狀態(tài)碼用來(lái)支持自動(dòng)操作,而原因分析用來(lái)供用戶(hù)使用??蛻?hù)機(jī)無(wú)需用來(lái)檢查或顯示語(yǔ)法。有關(guān)通用信息頭,響應(yīng)頭和實(shí)體頭方面的具體內(nèi)容可以參照相關(guān)文件。