HTTP
我們知道技術(shù)一般源于人們的需求與愿望乖篷,HTTP也是這樣產(chǎn)生的响驴。人們想在互聯(lián)網(wǎng)上分享信息,他們就得想出一個(gè)辦法來(lái)傳輸這些信息撕蔼。最后他們想出了一些交流信息的流程豁鲤,列出了在互聯(lián)網(wǎng)傳輸信息的規(guī)則,經(jīng)過(guò)不斷的修改罕邀、總結(jié)畅形,這些東西形成了一個(gè)協(xié)議,他們把它命名為 HyperText Transfer Protocol诉探,簡(jiǎn)稱HTTP,翻譯成中文是超文本傳輸協(xié)議。
HTTP規(guī)定了客戶端和服務(wù)端之間的傳輸規(guī)則棍厌。
為了解釋得清楚些肾胯,我摘抄了維基百科中關(guān)于HTTP的描述:
超文本傳輸協(xié)議
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議耘纱。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法敬肚。通過(guò)HTTP或者HTTPS協(xié)議請(qǐng)求的資源由統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifiers,URI)來(lái)標(biāo)識(shí)束析。
HTTP的發(fā)展是萬(wàn)維網(wǎng)協(xié)會(huì)(World Wide Web Consortium艳馒,W3C)和互聯(lián)網(wǎng)工程任務(wù)組(Internet Engineering Task Force,IETF)合作的結(jié)果,(他們)最終發(fā)布了一系列的RFC弄慰,其中最著名的是1999年6月公布的 RFC 2616第美,定義了HTTP協(xié)議中現(xiàn)今廣泛使用的一個(gè)版本——HTTP 1.1。
2014年12月互聯(lián)網(wǎng)工程任務(wù)組(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小組將HTTP/2標(biāo)準(zhǔn)提議遞交至IESG進(jìn)行討論[1]陆爽,于2015年2月17日被批準(zhǔn)什往。[2] HTTP/2標(biāo)準(zhǔn)于2015年5月以RFC 7540正式發(fā)表,替換HTTP 1.1成為HTTP的實(shí)現(xiàn)標(biāo)準(zhǔn)慌闭。
協(xié)議概述
HTTP是一個(gè)客戶端終端(用戶)和服務(wù)器端(網(wǎng)站)請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)别威。通過(guò)使用Web瀏覽器、網(wǎng)絡(luò)爬蟲(chóng)或者其它的工具驴剔,客戶端發(fā)起一個(gè)HTTP請(qǐng)求到服務(wù)器上指定端口(默認(rèn)端口為80)省古。我們稱這個(gè)客戶端為用戶代理程序(user agent)。應(yīng)答的服務(wù)器上存儲(chǔ)著一些資源丧失,比如HTML文件和圖像衫樊。我們稱這個(gè)應(yīng)答服務(wù)器為源服務(wù)器(origin server)。在用戶代理和源服務(wù)器中間可能存在多個(gè)“中間層”利花,比如代理服務(wù)器科侈、網(wǎng)關(guān)或者隧道(tunnel)。
盡管TCP/IP協(xié)議是互聯(lián)網(wǎng)上最流行的應(yīng)用炒事,HTTP協(xié)議中臀栈,并沒(méi)有規(guī)定必須使用它或它支持的層。事實(shí)上挠乳,HTTP可以在任何互聯(lián)網(wǎng)協(xié)議上权薯,或其他網(wǎng)絡(luò)上實(shí)現(xiàn)。HTTP假定其下層協(xié)議提供可靠的傳輸睡扬。因此盟蚣,任何能夠提供這種保證的協(xié)議都可以被其使用。因此也就是其在TCP/IP協(xié)議族使用TCP作為其傳輸層卖怜。
通常屎开,由HTTP客戶端發(fā)起一個(gè)請(qǐng)求,創(chuàng)建一個(gè)到服務(wù)器指定端口(默認(rèn)是80端口)的TCP連接马靠。HTTP服務(wù)器則在那個(gè)端口監(jiān)聽(tīng)客戶端的請(qǐng)求奄抽。一旦收到請(qǐng)求,服務(wù)器會(huì)向客戶端返回一個(gè)狀態(tài)甩鳄,比如"HTTP/1.1 200 OK"逞度,以及返回的內(nèi)容,如請(qǐng)求的文件妙啃、錯(cuò)誤消息档泽、或者其它信息。
簡(jiǎn)單總結(jié)一下上面的解釋,
- HTTP是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,設(shè)計(jì)最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法馆匿,萬(wàn)維網(wǎng)協(xié)會(huì)(World Wide Web Consortium抑胎,W3C)和互聯(lián)網(wǎng)工程任務(wù)組(Internet Engineering Task Force,IETF)合作不斷發(fā)展改進(jìn)了HTTP,之后HTTP有了好幾個(gè)版本甜熔。
- HTTP是基于TCP的圆恤,由HTTP客戶端發(fā)起一個(gè)請(qǐng)求,會(huì)創(chuàng)建一個(gè)到服務(wù)器指定端口(默認(rèn)80端口)的TCP連接腔稀,HTTP服務(wù)器會(huì)在那個(gè)端口監(jiān)聽(tīng)客戶端的請(qǐng)求盆昙。一旦收到請(qǐng)求,服務(wù)器會(huì)向客戶端返回一個(gè)狀態(tài)(如"HTTP/1.1 200 OK")以及返回的內(nèi)容(如請(qǐng)求的文件焊虏、錯(cuò)誤消息淡喜、或者其它信息)。
如果想對(duì)HTTP有詳細(xì)一點(diǎn)的了解诵闭,推薦這里的一篇博客炼团。
HTTP的版本
HTTP作為互聯(lián)網(wǎng)中使用最廣泛的網(wǎng)絡(luò)協(xié)議,肯定是不斷改進(jìn)的結(jié)果疏尿。而改進(jìn)的動(dòng)力簡(jiǎn)單來(lái)說(shuō)就是對(duì)傳輸速度的追求瘟芝。
在不斷的改進(jìn)中,HTTP存在有以下幾個(gè)版本:HTTP/0.9褥琐、HTTP/1.0锌俱、HTTP/1.1、HTTP/2敌呈。
同樣我們看看維基百科的介紹:
0.9
已過(guò)時(shí)贸宏。只接受GET一種請(qǐng)求方法,沒(méi)有在通訊中指定版本號(hào)磕洪,且不支持請(qǐng)求頭吭练。由于該版本不支持POST方法,因此客戶端無(wú)法向服務(wù)器傳遞太多信息析显。
HTTP/1.0
這是第一個(gè)在通訊中指定版本號(hào)的HTTP協(xié)議版本鲫咽,至今仍被廣泛采用,特別是在代理服務(wù)器中叫榕。
HTTP/1.1
持久連接被默認(rèn)采用浑侥,并能很好地配合代理服務(wù)器工作。還支持以管道方式在同時(shí)發(fā)送多個(gè)請(qǐng)求晰绎,以便降低線路負(fù)載,提高傳輸速度括丁。
HTTP/1.1相較于HTTP/1.0協(xié)議的區(qū)別主要體現(xiàn)在:
緩存處理
帶寬優(yōu)化及網(wǎng)絡(luò)連接的使用
錯(cuò)誤通知的管理
消息在網(wǎng)絡(luò)中的發(fā)送
互聯(lián)網(wǎng)地址的維護(hù)
安全性及完整性
HTTP/2
當(dāng)前版本荞下,于2015年5月作為互聯(lián)網(wǎng)標(biāo)準(zhǔn)正式發(fā)布。
HTTP/0.9是HTTP的第一個(gè)版本,現(xiàn)在已經(jīng)過(guò)時(shí)尖昏,為了改進(jìn)協(xié)議仰税,之后相繼有了HTTP/1.0、HTTP/1.1抽诉。1.0和1.1并存了很長(zhǎng)時(shí)間陨簇,HTTP/1.1是目前主流版本。2015年發(fā)布了HTTP/2.0,這個(gè)也是這兩年討論比較多的技術(shù)了迹淌,因?yàn)樗鄬?duì)于HTTP/1.x來(lái)說(shuō)有非常大的進(jìn)步河绽,優(yōu)化了HTTP/1.x很多問(wèn)題,不過(guò)作為下一代的HTTP協(xié)議唉窃,需要很長(zhǎng)一段的時(shí)間才會(huì)普及耙饰。
在HTTP/2.0出現(xiàn)之前,為了優(yōu)化HTTP/1.x的各種問(wèn)題纹份,還出現(xiàn)了一種HTTP兼容協(xié)議苟跪,叫SPDY,由Google發(fā)起的,Chrome蔓涧、Opera件已、Firefox以及Amazon Silk等瀏覽器都提供了支持。其實(shí)元暴,http2.0也是以SPDY為原型進(jìn)行討論和標(biāo)準(zhǔn)化的篷扩。為了給http2.0讓路,google已決定在2016年不再繼續(xù)支持SPDY開(kāi)發(fā)昨寞,但在http2.0出生之前瞻惋,SPDY已經(jīng)有了相當(dāng)規(guī)模的應(yīng)用,作為一個(gè)過(guò)渡方案恐怕在還將一段時(shí)間內(nèi)繼續(xù)存在援岩。 關(guān)于http2.0以及SPDY更多的了解歼狼,可以參考這篇文章。
HTTPS
超文本傳輸安全協(xié)議(英語(yǔ):Hyper Text Transfer Protocol over Secure Socket Layer享怀,縮寫HTTPS羽峰。也被稱為HTTP over TLS,HTTP over SSL或HTTP Secure)添瓷。
簡(jiǎn)單來(lái)說(shuō)HTTPS就是安全增強(qiáng)版的HTTP,是HTTP協(xié)議與加密協(xié)議的結(jié)合梅屉,使HTTP的協(xié)議數(shù)據(jù)在傳輸過(guò)程中更加安全。因?yàn)樵然ヂ?lián)網(wǎng)上使用的 HTTP(這里說(shuō)的是HTTP/1.x鳞贷,HTTP/2.0不會(huì)再用明文) 協(xié)議是明文的坯汤,存在很多缺點(diǎn)——比如傳輸內(nèi)容會(huì)被偷窺(嗅探)和篡改。 所以網(wǎng)景公司(Netscape)在1994年創(chuàng)建了HTTPS搀愧。
上面說(shuō)到的加密協(xié)議叫SSL惰聂,是英文Secure Sockets Layer的縮寫疆偿,中文叫“安全套接層”,也是由網(wǎng)景公司設(shè)計(jì)的搓幌,所以上面說(shuō)HTTPS也被稱為HTTP over SSL杆故。
到了1999年,SSL 因?yàn)閼?yīng)用廣泛溉愁,已經(jīng)成為互聯(lián)網(wǎng)上的事實(shí)標(biāo)準(zhǔn)处铛。IETF 就把 SSL 標(biāo)準(zhǔn)化了。標(biāo)準(zhǔn)化之后的名稱改為 TLS(是“Transport Layer Security”的縮寫)拐揭,中文叫做“傳輸層安全協(xié)議”撤蟆。很多相關(guān)的文章都把這兩者并列稱呼(SSL/TLS),因?yàn)檫@兩者可以視作同一個(gè)東西的不同階段投队。
HTTPS將HTTP協(xié)議數(shù)據(jù)包放到SSL/TSL層加密后枫疆,在TCP/IP層組成IP數(shù)據(jù)報(bào)去傳輸,以此保證傳輸數(shù)據(jù)的安全敷鸦;而對(duì)于接收端息楔,在SSL/TSL將接收的數(shù)據(jù)包解密之后,將數(shù)據(jù)傳給HTTP協(xié)議層扒披,就是普通的HTTP數(shù)據(jù)值依。
接下來(lái)了解下SSL/TLS協(xié)議。首先了解下對(duì)稱加密和非對(duì)稱加密碟案,對(duì)稱加密就是將你要傳輸?shù)膬?nèi)容用一個(gè)密鑰加密起來(lái)愿险,發(fā)送方和都要知道這個(gè)密鑰,用它來(lái)加密解密价说。但使用對(duì)稱加密需要給對(duì)方傳這個(gè)密鑰辆亏,在互聯(lián)網(wǎng)上傳輸這個(gè)密鑰很容易被截取。所以就有了非對(duì)稱加密鳖目,這種加密指的是可以生成一對(duì)密鑰 (k1, k2)扮叨。凡是 k1 加密的數(shù)據(jù),k1 自身不能解密领迈,而需要 k2 才能解密彻磁;凡是 k2 加密的數(shù)據(jù),k2 不能解密狸捅,需要 k1 才能解密衷蜓。
SSL/TLS協(xié)議的做法是把這兩者結(jié)合:
- 假如A與B要傳輸信息,那么A可以使用非對(duì)稱加密生成一對(duì)密鑰 (k1, k2)尘喝,然后將k1發(fā)給B, k2自己保留;
- B收到k1后先自己使用對(duì)稱加密生成一個(gè)key, 然后使用k1將這個(gè)key加密傳給A磁浇;
- A收到密文后使用k2將其解密,至此朽褪,A和B已經(jīng)完成了key的傳輸扯夭,之后他們就可以使用這個(gè)key按對(duì)稱加密的方式傳輸信息鳍贾。
因?yàn)樵趥鬏斶^(guò)程中只暴露了k1,要解密需要知道k2,所以就算有人竊取到傳輸?shù)男畔柏遥矡o(wú)法解密交洗。
但SSL/TLS協(xié)議不僅僅是做了這些,因?yàn)槿绻@樣的方式還是有方法可以破解的橡淑,有一種方法是“中間人攻擊”构拳,它分別欺騙A和B,讓對(duì)方誤以為它是A(或者B),這樣它就可以自己定義一個(gè)key,然后欺騙A和B,讓他們誤以為已經(jīng)完成了key的傳輸,然后使用這個(gè)key來(lái)傳輸信息梁棠。為了防止這種攻擊置森,又引入了一個(gè)叫 CA的東西。CA(Certificate Authority) 是一些非常權(quán)威的專門用于認(rèn)證一個(gè)網(wǎng)站合法性的組織符糊。這樣A和B在傳輸密鑰的時(shí)候就可以通過(guò)CA來(lái)判斷對(duì)方是否合法凫海,這樣“中間人攻擊”也就無(wú)法實(shí)施。
HTTPS把對(duì)稱加密男娄、非對(duì)稱加密和CA結(jié)合起來(lái)以保證數(shù)據(jù)安全行贪。如果想對(duì)對(duì)稱加密和非對(duì)稱加密以及SSL/TLS要更多了解可以參考下面兩篇文章: