
HTTP
一、HTTP協議
http協議,是超文本傳輸協議,此協議是基于TCP/IP的協議,是互聯網上應用最為廣泛的一直網絡協議是一種無狀態協議,默認端口為80,。設計HTTP的最初目的是為了提供一種發布和接受HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源標識符(URI)來標識。
通常HTTP消息包括客戶機向服務器的請求消息和服務器向客戶機的響應消息。這兩種類型的消息由一個起始行,一個或者多個頭域,一個指示頭域結束的空行和可選的消息體組成。HTTP的頭域包括通用頭,請求頭,響應頭和實體頭四個部分。每個頭域由一個域名,冒號(:)和域值三部分組成。域名是大小寫無關的,域值前可以添加任何數量的空格符,頭域可以被擴展為多行,在每行開始處,使用至少一個空格或制表符。
二、各版本的http對比
1、HTTP/0.9
HTTP 0.9是第一個版本的HTTP協議,1991年發布。它的組成極其簡單,只允許客戶端發送GET這一種請求,且不支持MIME類型和請求頭。由于沒有協議頭,造成了HTTP 0.9協議只支持一種內容,即純文本。不過網頁仍然支持用HTML語言格式化,同時無法插入圖片。
HTTP 0.9具有典型的無狀態性,每個事務獨立進行處理,事務結束時就釋放這個連接。由此可見,HTTP協議的無狀態特點在其第一個版本0.9中已經成型。一次HTTP 0.9的傳輸首先要建立一個由客戶端到Web服務器的TCP連接,由客戶端發起一個請求,然后由Web服務器返回頁面內容,然后連接會關閉。如果請求的頁面不存在,也不會返回任何錯誤碼。
2、HTTP/1.0
HTTP/1.0是在1996年發布,在原來HTTP/0.9的版本上添加了許多方法,各種HTTP首部,以及對多媒體對象的處理,是請求和響應消息的協議版本。除了GET命令,還引入了POST命令。HTTP的請求和回應格式也變了,除了數據部分,每次通信都必須包含頭信息(HTTP Header),用來描敘一些元數據。相對于HTTP/0.9,HTTP/1.0也支持了MIME,使HTTP協議擴大了處理的數據類型,支持對多媒體流信息的處理。
雖然,HTTP/1.0相對于HTTP/0.9有了革命性的改變,但HTTP/1.0依然有一些缺點,主要就是每個TCP連接只能發生一個請求,發送數據完畢之后連接就會自動關閉,如果還要再請求其他的資源,就要再創建一個連接。有些瀏覽器為了解決這個問題,用了一個非標準的Connection頭部,也就是Keep-Alive模式(Connection:Keep-Alive)來避免了重新建立連接。但這個不是標準頭部,各個瀏覽器和服務器實現可能不一致,因此不是根本解決辦法。
3、HTTP/1.1
HTTP/1.1在1999年正式發布,是目前用得最廣泛的協議版本。
HTTP1.1在HTTP1.0的基礎上實現的一次飛躍,主要的改進集中在性能、安全、數據類型處理等方面提出Server端緩沖 對象的概念,是減少網絡上相同類型內容的反復傳送,提高訪問速度。默認的是Keep-Alive模式(持久連接),提高了性能。同時還增加了以下功能
- Host協議頭: 在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機名。但隨著虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機,并且它們共享一個IP地址。因此,Host頭的引入就很有必要了。
- Range分段請求: 請求頭中,指定第一個字節的位置和最后一個字節的位置。用于告訴服務器自己想取對象的哪部分。如果服務器能夠正常響應的話,服務器會返回 206 Partial Content 的狀態碼及說明。如果不能處理這種Range的話,就會返回整個資源以及響應狀態碼為 200 OK。
- 分塊傳輸編碼(chucked):該編碼將實體分塊傳送并逐塊標明長度,直到長度為0塊表示傳輸結束, 這在實體長度未知時特別有用(比如由數據庫動態產生的數據)
- 緩存處理等:HTTP/1.1在1.0的基礎上加入了一些cache的新特性,新增更為強大的Cache-Control頭。
- 請求的流水線處理:在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。例如,一個包含有許多圖像的網頁文件的多個請求和應答可以在一個連接中傳輸,但每個單獨網頁文件的請求和應答仍需要使用各自的連接。HTTP/1.1還允許客戶端不用等待上一次請求結果的返回,就可以發出下一次請求,但服務器端必須按照請求的先后順序一次返回響應的結果,以保證客戶端能夠區分出每次請求的響應內容。
4、HTTP/2
HTTP/2是最新的HTTP協議,與2015年5月發布,谷歌、IE11以及火狐等瀏覽器已經支持HTTP/2協議了。
注意是HTTP/2而不是HTTP/2.0,因為IEFT(互聯網工程任務組)認為HTTP/2已經很成熟了,沒有必要再發布子版本了,以后要是有重大改動就直接發布HTTP/3。而HTTP/2與HTTP/1.1也存在著挺大的差別,下面我們來看看HTTP/2獨有的特性。
1、二進制協議
我們都知道,HTTP/1.1是超文本傳輸協議,而HTTP/2是采用二進制協議。相比 HTTP/1.1 的純文本數據,二進制數據一個顯而易見的好處是:更小的傳輸體積。這就意味著更低的負載。二進制的幀也更易于解析而且不易出錯,純文本幀在解析的時候還要考慮處理空格、大小寫、空行和換行等問題,而二進制幀就不存在這個問題。
消息頭和消息體均采用二進制格式,并成為幀(Frame)。目前有10個Frame,由Type字段來區分,各個Frame都有自己的二進制格式,都封裝在Frame Payload中。其中有兩個重要的Frame:Header Frame(Type=0x1)和Date Frame(Type=0x0),分別對應HTTP/1.1中的消息頭(Header)和消息體(Body),由此可見語義并沒有太大變化,而是文本格式變成二進制的Frame。兩者的轉換關系如下圖:

此外,HTTP/2中還有流(Stream)和消息(Message)的概念,通過Strame Identifier(流ID)字段來標識,流ID一樣的是同一個流,流中包含消息,這個消息對于HTTP/1.x的請求消息或者響應消息,消息是通過幀來傳輸的,響應消息比較大時,可能由多個Data Frame來傳輸
2、多路復用
每個http2連接上傳輸的幀都關聯到一個“流”。流是一個邏輯上的結合,一個獨立的,雙向的幀序列。它在客戶端和服務器端中間通過http2連接進行幀交換。每個單獨的http2連接都可以包含多個并發的流,任何一端都可以交錯地插入幀。流既可以被客戶端/服務器端單方面的建立、使用,也可以被雙方共享。同時,兩邊都可以關閉流。
也就是說,在一個TCP連接里,客戶端和服務器端都可以同時發生多個請求或者響應,對于HTTP/1.x來說各個請求和響應都是有嚴格的次序要求的,而在HTTP/2中,不用按照次序一一對應,而且并發的多個請求或者響應中任何一個請求阻塞了不會影響其他的請求或者響應,這樣也就避免了"隊頭阻塞"。
3、頭部壓縮
HTTP是無狀態協議。簡而言之,這意味著每個請求必須要攜帶服務器需要的所有細節,而不是讓服務器保存住之前請求的元數據。因為http2沒有改變這個范式,所以它也需要這樣(攜帶所有細節),因此 HTTP 請求的頭部需要包含用于標識身份的數據比如 cookies和User Agent,而這些數據的量也在隨著時間增長。每一個請求的頭部都包含這些大量的重復數據,無疑是一種很大的負擔。對請求頭部進行壓縮,將會大大減輕這種負擔,尤其對移動端來說,性能提高非常明顯。
而HTTP/2則是采樣HPACK格式進行壓縮傳輸,而HPACK簡單的說,就是使用2個索引表(靜態索引表和動態索引表)來把頭部映射到索引值,并對不存在的頭部使用 huffman 編碼,并動態緩存到索引,從而達到壓縮頭部的效果。也就是說客戶端和服務器端都需要維護一個索引表,相同的消息頭只要發送索引號,從而提高效率和速度。
具體關于HPACK的介紹請參考: http://www.jianshu.com/p/f44b930cfcac
4.服務器推送
服務器推送就是說在HTTP/2中服務器未經請求可以直接把資源推送給客戶。而在HTTP/1.1中,對服務器請求一個頁面,等頁面解析之后會再去請求和這個頁面有關的css或者js等資源。而HTTP/2則是在響應了某個頁面進行請求之后,會順便把和這個頁面有關的css和js等資源推送到到瀏覽器,當瀏覽器解析了響應的頁面之后發現要請求的有關這個頁面的一些css和js等資源就已經在本地之后,就會直接引用,而不會說再次去請求服務器。這就節省了兩次請求所花的網絡時間,大大提高了網絡性能和用戶體驗。
三、HTTPS
超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼等。
為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,并為瀏覽器和服務器之間的通信加密。其主要用途如下:
1.認證用戶和服務器,確保數據發送到正確的客戶機和服務器
2.加密數據以防止數據中途被竊取
3.維護數據的完整性,確保數據在傳輸過程中不被改變。
SSL存在三個特性:
1.機密性:SSL使用密鑰加密通信數據
2.可靠性:服務器和客戶都會被認證,客戶的認證是可選的
3.完整性:SSL協議會對傳輸的數據進行完整性檢查
HTTPS和HTTP的區別主要為以下四點:
一、https協議需要到ca申請證書,一般免費證書很少,需要交費。
二、http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
三、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
四、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。