HTTP
我們知道技術一般源于人們的需求與愿望,HTTP也是這樣產生的。人們想在互聯網上分享信息,他們就得想出一個辦法來傳輸這些信息。最后他們想出了一些交流信息的流程,列出了在互聯網傳輸信息的規(guī)則,經過不斷的修改、總結,這些東西形成了一個協(xié)議,他們把它命名為 HyperText Transfer Protocol,簡稱HTTP,翻譯成中文是超文本傳輸協(xié)議。
HTTP規(guī)定了客戶端和服務端之間的傳輸規(guī)則。

為了解釋得清楚些,我摘抄了維基百科中關于HTTP的描述:
超文本傳輸協(xié)議
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯網上應用最為廣泛的一種網絡協(xié)議。設計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。通過HTTP或者HTTPS協(xié)議請求的資源由統(tǒng)一資源標識符(Uniform Resource Identifiers,URI)來標識。
HTTP的發(fā)展是萬維網協(xié)會(World Wide Web Consortium,W3C)和互聯網工程任務組(Internet Engineering Task Force,IETF)合作的結果,(他們)最終發(fā)布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定義了HTTP協(xié)議中現今廣泛使用的一個版本——HTTP 1.1。
2014年12月互聯網工程任務組(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小組將HTTP/2標準提議遞交至IESG進行討論[1],于2015年2月17日被批準。[2] HTTP/2標準于2015年5月以RFC 7540正式發(fā)表,替換HTTP 1.1成為HTTP的實現標準。
協(xié)議概述
HTTP是一個客戶端終端(用戶)和服務器端(網站)請求和應答的標準(TCP)。通過使用Web瀏覽器、網絡爬蟲或者其它的工具,客戶端發(fā)起一個HTTP請求到服務器上指定端口(默認端口為80)。我們稱這個客戶端為用戶代理程序(user agent)。應答的服務器上存儲著一些資源,比如HTML文件和圖像。我們稱這個應答服務器為源服務器(origin server)。在用戶代理和源服務器中間可能存在多個“中間層”,比如代理服務器、網關或者隧道(tunnel)。
盡管TCP/IP協(xié)議是互聯網上最流行的應用,HTTP協(xié)議中,并沒有規(guī)定必須使用它或它支持的層。事實上,HTTP可以在任何互聯網協(xié)議上,或其他網絡上實現。HTTP假定其下層協(xié)議提供可靠的傳輸。因此,任何能夠提供這種保證的協(xié)議都可以被其使用。因此也就是其在TCP/IP協(xié)議族使用TCP作為其傳輸層。
通常,由HTTP客戶端發(fā)起一個請求,創(chuàng)建一個到服務器指定端口(默認是80端口)的TCP連接。HTTP服務器則在那個端口監(jiān)聽客戶端的請求。一旦收到請求,服務器會向客戶端返回一個狀態(tài),比如"HTTP/1.1 200 OK",以及返回的內容,如請求的文件、錯誤消息、或者其它信息。
簡單總結一下上面的解釋,
- HTTP是互聯網上應用最為廣泛的一種網絡協(xié)議,設計最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法,萬維網協(xié)會(World Wide Web Consortium,W3C)和互聯網工程任務組(Internet Engineering Task Force,IETF)合作不斷發(fā)展改進了HTTP,之后HTTP有了好幾個版本。
- HTTP是基于TCP的,由HTTP客戶端發(fā)起一個請求,會創(chuàng)建一個到服務器指定端口(默認80端口)的TCP連接,HTTP服務器會在那個端口監(jiān)聽客戶端的請求。一旦收到請求,服務器會向客戶端返回一個狀態(tài)(如"HTTP/1.1 200 OK")以及返回的內容(如請求的文件、錯誤消息、或者其它信息)。
如果想對HTTP有詳細一點的了解,推薦這里的一篇博客。
HTTP的版本
HTTP作為互聯網中使用最廣泛的網絡協(xié)議,肯定是不斷改進的結果。而改進的動力簡單來說就是對傳輸速度的追求。
在不斷的改進中,HTTP存在有以下幾個版本:HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2。
同樣我們看看維基百科的介紹:
0.9
已過時。只接受GET一種請求方法,沒有在通訊中指定版本號,且不支持請求頭。由于該版本不支持POST方法,因此客戶端無法向服務器傳遞太多信息。
HTTP/1.0
這是第一個在通訊中指定版本號的HTTP協(xié)議版本,至今仍被廣泛采用,特別是在代理服務器中。
HTTP/1.1
持久連接被默認采用,并能很好地配合代理服務器工作。還支持以管道方式在同時發(fā)送多個請求,以便降低線路負載,提高傳輸速度。
HTTP/1.1相較于HTTP/1.0協(xié)議的區(qū)別主要體現在:
緩存處理
帶寬優(yōu)化及網絡連接的使用
錯誤通知的管理
消息在網絡中的發(fā)送
互聯網地址的維護
安全性及完整性
HTTP/2
當前版本,于2015年5月作為互聯網標準正式發(fā)布。
HTTP/0.9是HTTP的第一個版本,現在已經過時,為了改進協(xié)議,之后相繼有了HTTP/1.0、HTTP/1.1。1.0和1.1并存了很長時間,HTTP/1.1是目前主流版本。2015年發(fā)布了HTTP/2.0,這個也是這兩年討論比較多的技術了,因為它相對于HTTP/1.x來說有非常大的進步,優(yōu)化了HTTP/1.x很多問題,不過作為下一代的HTTP協(xié)議,需要很長一段的時間才會普及。
在HTTP/2.0出現之前,為了優(yōu)化HTTP/1.x的各種問題,還出現了一種HTTP兼容協(xié)議,叫SPDY,由Google發(fā)起的,Chrome、Opera、Firefox以及Amazon Silk等瀏覽器都提供了支持。其實,http2.0也是以SPDY為原型進行討論和標準化的。為了給http2.0讓路,google已決定在2016年不再繼續(xù)支持SPDY開發(fā),但在http2.0出生之前,SPDY已經有了相當規(guī)模的應用,作為一個過渡方案恐怕在還將一段時間內繼續(xù)存在。 關于http2.0以及SPDY更多的了解,可以參考這篇文章。
HTTPS
超文本傳輸安全協(xié)議(英語:Hyper Text Transfer Protocol over Secure Socket Layer,縮寫HTTPS。也被稱為HTTP over TLS,HTTP over SSL或HTTP Secure)。
簡單來說HTTPS就是安全增強版的HTTP,是HTTP協(xié)議與加密協(xié)議的結合,使HTTP的協(xié)議數據在傳輸過程中更加安全。因為原先互聯網上使用的 HTTP(這里說的是HTTP/1.x,HTTP/2.0不會再用明文) 協(xié)議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。 所以網景公司(Netscape)在1994年創(chuàng)建了HTTPS。
上面說到的加密協(xié)議叫SSL,是英文Secure Sockets Layer的縮寫,中文叫“安全套接層”,也是由網景公司設計的,所以上面說HTTPS也被稱為HTTP over SSL。
到了1999年,SSL 因為應用廣泛,已經成為互聯網上的事實標準。IETF 就把 SSL 標準化了。標準化之后的名稱改為 TLS(是“Transport Layer Security”的縮寫),中文叫做“傳輸層安全協(xié)議”。很多相關的文章都把這兩者并列稱呼(SSL/TLS),因為這兩者可以視作同一個東西的不同階段。
HTTPS將HTTP協(xié)議數據包放到SSL/TSL層加密后,在TCP/IP層組成IP數據報去傳輸,以此保證傳輸數據的安全;而對于接收端,在SSL/TSL將接收的數據包解密之后,將數據傳給HTTP協(xié)議層,就是普通的HTTP數據。

接下來了解下SSL/TLS協(xié)議。首先了解下對稱加密和非對稱加密,對稱加密就是將你要傳輸的內容用一個密鑰加密起來,發(fā)送方和都要知道這個密鑰,用它來加密解密。但使用對稱加密需要給對方傳這個密鑰,在互聯網上傳輸這個密鑰很容易被截取。所以就有了非對稱加密,這種加密指的是可以生成一對密鑰 (k1, k2)。凡是 k1 加密的數據,k1 自身不能解密,而需要 k2 才能解密;凡是 k2 加密的數據,k2 不能解密,需要 k1 才能解密。
SSL/TLS協(xié)議的做法是把這兩者結合:
- 假如A與B要傳輸信息,那么A可以使用非對稱加密生成一對密鑰 (k1, k2),然后將k1發(fā)給B, k2自己保留;
- B收到k1后先自己使用對稱加密生成一個key, 然后使用k1將這個key加密傳給A;
- A收到密文后使用k2將其解密,至此,A和B已經完成了key的傳輸,之后他們就可以使用這個key按對稱加密的方式傳輸信息。
因為在傳輸過程中只暴露了k1,要解密需要知道k2,所以就算有人竊取到傳輸的信息,也無法解密。
但SSL/TLS協(xié)議不僅僅是做了這些,因為如果這樣的方式還是有方法可以破解的,有一種方法是“中間人攻擊”,它分別欺騙A和B,讓對方誤以為它是A(或者B),這樣它就可以自己定義一個key,然后欺騙A和B,讓他們誤以為已經完成了key的傳輸,然后使用這個key來傳輸信息。為了防止這種攻擊,又引入了一個叫 CA的東西。CA(Certificate Authority) 是一些非常權威的專門用于認證一個網站合法性的組織。這樣A和B在傳輸密鑰的時候就可以通過CA來判斷對方是否合法,這樣“中間人攻擊”也就無法實施。
HTTPS把對稱加密、非對稱加密和CA結合起來以保證數據安全。如果想對對稱加密和非對稱加密以及SSL/TLS要更多了解可以參考下面兩篇文章: