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