HTTP是一個簡單的請求-響應(yīng)協(xié)議,它通常運行在來TCP之上。它指定了客戶端可能發(fā)送給服務(wù)器什么樣的消息以及得到什么樣的響應(yīng)。請求和響應(yīng)消息的頭以ASCII碼形式給出;而消息內(nèi)容則具有一個類似MIME的格式。這個簡單模型是早期Web成功的有功之臣,因為它使得開發(fā)和部署是那么的直截了當(dāng)。
萬維網(wǎng)WWW(world wide web)發(fā)源于歐洲日內(nèi)瓦量子物理實驗室CERN,正是WWW技術(shù)的出現(xiàn)使得因特網(wǎng)得以超乎想象的速度迅猛發(fā)展。這項基于TCP/IP的技術(shù)在短短的十年時間內(nèi)迅速成為已經(jīng)發(fā)展了幾十年的Internet上的規(guī)模最大的信息系統(tǒng),它的成功歸結(jié)于它的簡單、實用。在WWW的背后有一系列的協(xié)議和標(biāo)準(zhǔn)支持它完成如此動人的工作,這就是Web協(xié)議族,其中就包括HTTP超文本傳輸協(xié)議。
在1990年,HTTP就成為WWW的支撐協(xié)議。當(dāng)時由其創(chuàng)始人WWW之父蒂姆·貝納斯·李(TimBemers—Lee)提出,隨后WWW聯(lián)盟(WWW Consortium)成立,組織了IETE(Internet Engineering Task Force)小組進一步完善和發(fā)布HTTP協(xié)議。
HTTP是應(yīng)用層協(xié)議,同其他應(yīng)用層協(xié)議一樣,是為了實現(xiàn)某一類具體應(yīng)用的協(xié)議,并由某一運行在用戶空間的應(yīng)用程序來實現(xiàn)其功能。HTTP是一種協(xié)議規(guī)范,這種規(guī)范記錄在文檔上,為真正通過HTTP協(xié)議進行通信的HTTP的實現(xiàn)程序。
HTTP協(xié)議是基于C/S架構(gòu)進行通信的,而HTTP協(xié)議的服務(wù)器端實現(xiàn)程序有httpd、nginx等,其客戶端的實現(xiàn)程序主要是Web瀏覽器,例如Firefox、InternetExplorer、Google chrome、Safari、Opera等,此外,客戶端的命令行工具還有elink、crul等。Web服務(wù)是基于TCP的,因此為了能夠隨時響應(yīng)客戶端的請求,Web服務(wù)器需要監(jiān)聽在80/TCP端口。這客戶端瀏覽器和Web服務(wù)器之間就可以通過HTTP協(xié)議進行通信了。
HTTP 發(fā)展階段
0.9
0.9協(xié)議是適用于各種數(shù)據(jù)信息的簡潔快速協(xié)議,但是遠不能滿足日益發(fā)展的各種應(yīng)用的需要。0.9協(xié)議就是一個交換信息的無序協(xié)議,僅僅限于文字。由于無法進行內(nèi)容的協(xié)商,在雙發(fā)的握手和協(xié)議中,并有規(guī)定雙發(fā)的內(nèi)容是什么,也就是圖片是無法顯示和處理的。
1.0
到了1.0協(xié)議階段,也就是在1982年,TimBerners-Lee提出了HTTP/1.0。在此后的不斷豐富和發(fā)展中,HTTP/1.0成為最重要的面向事務(wù)的應(yīng)用層協(xié)議。該協(xié)議對每一次請求/響應(yīng)建立并拆除一次連接。其特點是簡單、易于管理,所以它符合了大家的需要,得到了廣泛的應(yīng)用。
1.1
在1.0協(xié)議中,雙方規(guī)定了連接方式和連接類型,這已經(jīng)極大擴展了HTTP的領(lǐng)域,但對于互聯(lián)網(wǎng)最重要的速度和效率,并沒有太多的考慮。畢竟,作為協(xié)議的制定者,當(dāng)時也沒有想到HTTP協(xié)議會有那么快的普及速度。
關(guān)于HTTP1.1協(xié)議的具體內(nèi)容可以參考RFC 2616。
2.0
HTTP2.0的前世是HTTP1.0和HTTP1.1。雖然之前僅僅只有兩個版本,但這兩個版本所包含的協(xié)議規(guī)范之龐大,足以讓任何一個有經(jīng)驗的工程師為之頭疼。網(wǎng)絡(luò)協(xié)議新版本并不會馬上取代舊版本。實際上,1.0和1.1在之后很長的一段時間內(nèi)一直并存,這是由于網(wǎng)絡(luò)基礎(chǔ)設(shè)施更新緩慢所決定的。
關(guān)于HTTP2.0協(xié)議的具體內(nèi)容可以參考RFC 7540。
HTTP 應(yīng)用場景
HTTP誕生之初主要是應(yīng)用于WEB端內(nèi)容獲取,那時候內(nèi)容還不像現(xiàn)在這樣豐富,排版也沒那么精美,用戶交互的場景幾乎沒有。對于這種簡單的獲取網(wǎng)頁內(nèi)容的場景,HTTP表現(xiàn)得還算不錯。但隨著互聯(lián)網(wǎng)的發(fā)展和WEB2.0的誕生,更多的內(nèi)容開始被展示(更多的圖片文件),排版變得更精美(更多的CSS),更復(fù)雜的交互也被引入(更多的jS)。用戶打開一個網(wǎng)站首頁所加載的數(shù)據(jù)總量和請求的個數(shù)也在不斷增加。
今天絕大部分的門戶網(wǎng)站首頁大小都會超過2M,請求數(shù)量可以多達100個。另一個廣泛的應(yīng)用是在移動互聯(lián)網(wǎng)的客戶端APP,不同性質(zhì)的APP對HTTP的使用差異很大。對于電商類APP,加載首頁的請求也可能多達10多個。對于微信這類IM,HTTP請求可能僅限于語音和圖片文件的下載,請求出現(xiàn)的頻率并不算高。
HTTP 工作原理
HTTP是基于客戶/服務(wù)器模式,且面向連接的。典型的HTTP事務(wù)處理有如下的過程:
(1)客戶與服務(wù)器建立連接;
(2)客戶向服務(wù)器提出請求;
(3)服務(wù)器接受請求,并根據(jù)請求返回相應(yīng)的文件作為應(yīng)答;
(4)客戶與服務(wù)器關(guān)閉連接。
客戶與服務(wù)器之間的HTTP連接是一種一次性連接,它限制每次連接只處理一個請求,當(dāng)服務(wù)器返回本次請求的應(yīng)答后便立即關(guān)閉連接,下次請求再重新建立連接。這種一次性連接主要考慮到WWW服務(wù)器面向的是Internet中成干上萬個用戶,且只能提供有限個連接,故服務(wù)器不會讓一個連接處于等待狀態(tài),及時地釋放連接可以大大提高服務(wù)器的執(zhí)行效率。
HTTP是一種無狀態(tài)協(xié)議,即服務(wù)器不保留與客戶交易時的任何狀態(tài)。這就大大減輕了服務(wù)器記憶負擔(dān),從而保持較快的響應(yīng)速度。HTTP是一種面向?qū)ο蟮膮f(xié)議。允許傳送任意類型的數(shù)據(jù)對象。它通過數(shù)據(jù)類型和長度來標(biāo)識所傳送的數(shù)據(jù)內(nèi)容和大小,并允許對數(shù)據(jù)進行壓縮傳送。當(dāng)用戶在一個HTML文檔中定義了一個超文本鏈后,瀏覽器將通過TCPl/P協(xié)議與指定的服務(wù)器建立連接。
從技術(shù)上講是客戶在一個特定的TCP端口(端口號一般為80)上打開一個套接字。如果服務(wù)器一直在這個周知的端口上傾聽連接,則該連接便會建立起來。然后客戶通過該連接發(fā)送一個包含請求方法的請求塊。
HTTP規(guī)范定義了7種請求方法,每種請求方法規(guī)定了客戶和服務(wù)器之間不同的信息交換方式,常用的請求方法是GET和POST。服務(wù)器將根據(jù)客戶請求完成相應(yīng)操作,并以應(yīng)答塊形式返回給客戶,最后關(guān)閉連接。