本文通過(guò)比喻的方式介紹了什么是HTTP,并闡述了從HTTP/1.0到HTTP/3各個(gè)版本的區(qū)別和特點(diǎn),值得一看。以下是原文:
周末一大早,我正在電腦前面瀏覽一些技術(shù)網(wǎng)站,突然女朋友大喊起來(lái):哇,杭州又下大雪啦,快來(lái)看啊。我并沒(méi)有理她,于是她跑過(guò)來(lái)拉我。
?圖,雪后杭州
由這次下雪將要介紹的HTTP和RPC也有點(diǎn)關(guān)系,都是通信方式。
什么是HTTP協(xié)議
HTTP是HyperTextTransferProtocol的縮寫,中文翻譯為超文本傳輸協(xié)議。他是一種用于分布式、協(xié)作式和超媒體信息系統(tǒng)的應(yīng)用層協(xié)議。HTTP是萬(wàn)維網(wǎng)的數(shù)據(jù)通信的基礎(chǔ)。
說(shuō)的簡(jiǎn)單點(diǎn),其實(shí)HTTP協(xié)議主要就是用來(lái)進(jìn)行客戶端和服務(wù)器之間進(jìn)行通信的標(biāo)準(zhǔn)協(xié)議。HTTP主要規(guī)定了客戶端如何與服務(wù)器建立鏈接、客戶端如何從服務(wù)器請(qǐng)求數(shù)據(jù)、服務(wù)器如何響應(yīng)請(qǐng)求,以及最后連接如何關(guān)閉。
當(dāng)我們?cè)跒g覽器中輸入一個(gè)url,如http://www.taobao.com,然后按下回車,一直到頁(yè)面顯示淘寶網(wǎng)的首頁(yè)的過(guò)程就是一次HTTP的網(wǎng)絡(luò)通信。
這次通信過(guò)程中,我們查看淘寶使用的電腦就是客戶端,而搭建淘寶網(wǎng)的那些計(jì)算機(jī)機(jī)器就是服務(wù)器。
?這個(gè)過(guò)程有點(diǎn)像老板通過(guò)***給員工下達(dá)命令。當(dāng)我們?cè)跒g覽器輸入網(wǎng)址并按下回車之后,共發(fā)生了以下四件事:
1、建立連接:老板撥通手下員工的***
2、進(jìn)行請(qǐng)求:老板提出自己的要求
3、響應(yīng):?jiǎn)T工應(yīng)答老板的請(qǐng)求
4、關(guān)閉連接:掛斷***
建立連接
老板找出自己公司的總機(jī)***號(hào)并撥通,員工接聽(tīng)***的過(guò)程就是建立連接。
根據(jù)用戶輸入的URL地址,通過(guò)DNS、負(fù)載均衡等技術(shù)找到一臺(tái)服務(wù)器,客戶端與服務(wù)器的80端口建立一個(gè)TCP鏈接。
進(jìn)行請(qǐng)求
***被接通之后,老板可能要求某個(gè)具體員工來(lái)進(jìn)行接聽(tīng),并且會(huì)對(duì)該員工下達(dá)一些命令,比如幫他取個(gè)快遞,幫他預(yù)訂個(gè)***,幫他收購(gòu)一家公司等。這個(gè)過(guò)程就進(jìn)行請(qǐng)求(request)。
客戶端向服務(wù)器發(fā)送消息,請(qǐng)求URL中指定的頁(yè)面,要求執(zhí)行指定的操作。
老板對(duì)員工下達(dá)的命令中,可以分為很多種,比如有些命令只是簡(jiǎn)單的事情詢問(wèn)、而有些命令則要求員工執(zhí)行某些決定,如收購(gòu)公司等。
同樣的,HTTP的請(qǐng)求***也有很多種,主要的有GET、POST、HEAD等。
響應(yīng)
員工在接收到老板下單的命令后,需要對(duì)該命令做出回應(yīng)。比如直接告知老板他接下來(lái)的行程,幫老板預(yù)訂好***后告訴他已經(jīng)預(yù)訂成功等。這個(gè)過(guò)程就是響應(yīng)(response)
服務(wù)器向客戶端發(fā)送響應(yīng)。響應(yīng)以狀態(tài)碼開(kāi)頭。常見(jiàn)的狀態(tài)碼有:200、302、404、500等。
HTTP狀態(tài)碼由三個(gè)十進(jìn)制數(shù)字組成,第一個(gè)十進(jìn)制數(shù)字定義了狀態(tài)碼的類型,后兩個(gè)數(shù)字沒(méi)有分類的作用。HTTP狀態(tài)碼共分為5種類型:
分類分類描述1**信息,服務(wù)器收到請(qǐng)求,需要請(qǐng)求者繼續(xù)執(zhí)行操作2**成功,操作被成功接收并處理3**重定向,需要進(jìn)一步的操作以完成請(qǐng)求4**客戶端錯(cuò)誤,請(qǐng)求包含語(yǔ)法錯(cuò)誤或無(wú)法完成請(qǐng)求5**服務(wù)器錯(cuò)誤,服務(wù)器在處理請(qǐng)求的過(guò)程中發(fā)生了錯(cuò)誤
關(guān)閉連接
老板在下達(dá)完命令,并且員工給予響應(yīng)之后,雙方會(huì)掛斷***。這個(gè)過(guò)程就是關(guān)閉連接。
客戶端或服務(wù)端都可以關(guān)閉連接。每個(gè)請(qǐng)求都是用一個(gè)單獨(dú)的網(wǎng)絡(luò)連接。
特別的是:服務(wù)器不回記憶前面一次連接或者其結(jié)果,這種不記憶過(guò)去請(qǐng)求的協(xié)議被稱為無(wú)狀態(tài)(stateless)協(xié)議。
?上圖就是一次淘寶網(wǎng)的HTTP請(qǐng)求的過(guò)程。其中顯示了request(請(qǐng)求)和response(響應(yīng))的所有信息。
HTTP協(xié)議的迭代
前面我們把HTTP通信比喻成打***,嚴(yán)格一點(diǎn)來(lái)說(shuō),HTTP/2更像是現(xiàn)在的打***。HTTP協(xié)議主要的版本有3個(gè),分別是HTTP/1.0、HTTP/1.1和HTTP/2。
HTTP/1.0
1996年5月,HTTP/1.0版本發(fā)布,為了提高系統(tǒng)的效率,HTTP/1.0規(guī)定瀏覽器與服務(wù)器只保持短暫的連接,瀏覽器的每次請(qǐng)求都需要與服務(wù)器建立一個(gè)TCP連接,服務(wù)器完成請(qǐng)求處理后立即斷開(kāi)TCP連接,服務(wù)器不跟蹤每個(gè)客戶也不記錄過(guò)去的請(qǐng)求。
這種方式就好像我們打***的時(shí)候,只能說(shuō)一件事兒一樣,說(shuō)完之后就要掛斷,想要說(shuō)另外一件事兒的時(shí)候就要重新?lián)艽?**。
HTTP/1.0中瀏覽器與服務(wù)器只保持短暫的連接,連接無(wú)法復(fù)用。也就是說(shuō)每個(gè)TCP連接只能發(fā)送一個(gè)請(qǐng)求。發(fā)送數(shù)據(jù)完畢,連接就關(guān)閉,如果還要請(qǐng)求其他資源,就必須再新建一個(gè)連接。
我們知道TCP連接的建立需要三次握手,是很耗費(fèi)時(shí)間的一個(gè)過(guò)程。所以,HTTP/1.0版本的性能比較差。
HTTP/1.1
為了解決HTTP/1.0存在的缺陷,HTTP/1.1于1999年誕生。相比較于HTTP/1.0來(lái)說(shuō),最主要的改進(jìn)就是引入了持久連接。所謂的持久連接即TCP連接默認(rèn)不關(guān)閉,可以被多個(gè)請(qǐng)求復(fù)用。
由于之前打一次***只能說(shuō)一件事兒,效率很低。后來(lái)人們提出一種想法,就是***打完之后,先不直接掛斷,而是持續(xù)一小段時(shí)間,這一小段時(shí)間內(nèi),如果還有事情溝通可以再次進(jìn)行溝通。
客戶端和服務(wù)器發(fā)現(xiàn)對(duì)方一段時(shí)間沒(méi)有活動(dòng),就可以主動(dòng)關(guān)閉連接。或者客戶端在最后一個(gè)請(qǐng)求時(shí),主動(dòng)告訴服務(wù)端要關(guān)閉連接。
HTTP/1.1版還引入了管道機(jī)制(pipelining),即在同一個(gè)TCP連接里面,客戶端可以同時(shí)發(fā)送多個(gè)請(qǐng)求。這樣就進(jìn)一步改進(jìn)了HTTP協(xié)議的效率。
?
也就是說(shuō),現(xiàn)在打***,一個(gè)***里面可以吩咐多件事兒了。但是對(duì)于執(zhí)行者來(lái)說(shuō),還是需要按照順序,先執(zhí)行完一件事兒以后再執(zhí)行另外一件事兒。
有了持久連接和管道,大大的提升了HTTP的效率。但是服務(wù)端還是順序執(zhí)行的,效率還有提升的空間。
HTTP/2
HTTP/2是HTTP協(xié)議自1999年HTTP1.1發(fā)布后的首個(gè)更新,主要基于SPDY協(xié)議。
HTTP/2為了解決HTTP/1.1中仍然存在的效率問(wèn)題,HTTP/2采用了多路復(fù)用。即在一個(gè)連接里,客戶端和瀏覽器都可以同時(shí)發(fā)送多個(gè)請(qǐng)求或回應(yīng),而且不用按照順序一一對(duì)應(yīng)。能這樣做有一個(gè)前提,就是HTTP/2進(jìn)行了二進(jìn)制分幀,即HTTP/2會(huì)將所有傳輸?shù)男畔⒎指顬楦〉南⒑蛶╢rame),并對(duì)它們采用二進(jìn)制格式的編碼。
也就是說(shuō),老板可以同時(shí)下達(dá)多個(gè)命令,員工也可以收到了A請(qǐng)求和B請(qǐng)求,于是先回應(yīng)A請(qǐng)求,結(jié)果發(fā)現(xiàn)處理過(guò)程非常耗時(shí),于是就發(fā)送A請(qǐng)求已經(jīng)處理好的部分,接著回應(yīng)B請(qǐng)求,完成后,再發(fā)送A請(qǐng)求剩下的部分。A請(qǐng)求的兩部分響應(yīng)在組合到一起發(fā)給老板。
?
而這個(gè)負(fù)責(zé)拆分、組裝請(qǐng)求和二進(jìn)制幀的一層就叫做二進(jìn)制分幀層。
除此之外,還有一些其他的優(yōu)化,比如做Header壓縮、服務(wù)端推送等。
Header壓縮就是壓縮老板和員工之間的對(duì)話。
服務(wù)端推送就是員工事先把一些老板可能詢問(wèn)的事情提現(xiàn)發(fā)送到老板的手機(jī)(緩存)上。這樣老板想要知道的時(shí)候就可以直接讀取短信(緩存)了。
目前,主流的HTTP協(xié)議還是HTTP/1.1和HTTP/2。并且各大網(wǎng)站的HTTP/2的使用率也在逐年增加。
HTTP-over-QUIC
據(jù)國(guó)際互聯(lián)網(wǎng)工程任務(wù)組(TheInternetEngineeringTaskForce,簡(jiǎn)稱IETF)消息,HTTP-over-QUIC實(shí)驗(yàn)性協(xié)議將被重命名為HTTP/3,并有望成為HTTP協(xié)議的第三個(gè)正式版本。
QUIC(QuickUDPInternetConnections)是Google推出的一個(gè)項(xiàng)目,旨在降低基于TCP通訊的Web延遲。QUIC非常類似TCP+TLS+SPDY,但是基于UDP實(shí)現(xiàn)的。
這種通信方式有點(diǎn)像現(xiàn)在我們使用的微信語(yǔ)言,在通話之前,老板和下屬之間并沒(méi)有直接的建立可靠連接,即不需要撥通***,而是拿起微信,直接通過(guò)語(yǔ)音直接下達(dá)了命令。
?HTTP/3使用UDP代替了TCP,UDP是一個(gè)非連接的協(xié)議,傳輸數(shù)據(jù)之前源端和終端不建立連接。UDP信息包的標(biāo)題很短,對(duì)系統(tǒng)資源的要求比TCP要低。并且UDP是使用最大努力交付,即不保證可靠交付。
我們經(jīng)常使用的“ping”命令的原理就是向?qū)Ψ街鳈C(jī)發(fā)送UDP數(shù)據(jù)包,然后對(duì)方主機(jī)確認(rèn)收到數(shù)據(jù)包,如果數(shù)據(jù)包是否到達(dá)的消息及時(shí)反饋回來(lái),那么網(wǎng)絡(luò)就是通的。
至于,這種基于QUIC的HTTP協(xié)議究竟未來(lái)發(fā)展如何,目前只能拭目以待了。
下面是一張大圖,通過(guò)圖解來(lái)介紹HTTP/1.0、HTTP/1.1、HTTP/2.0(SDPY)和HTTPoverQUIC(HTTP/3)
?
HTTPS
HTTPS是HypertextTransferProtocolSecure的縮寫,翻譯為超文本傳輸安全協(xié)議。HTTPS經(jīng)由HTTP進(jìn)行通信,但利用SSL/TLS來(lái)加密數(shù)據(jù)包。
HTTPS就像是加密***,通過(guò)一些手段來(lái)加密通話內(nèi)容的。他是基于普通***的,但是又不是普通的***,更不是普通***的升級(jí)版。
所以,HTTP和HTTPS是兩個(gè)不同的協(xié)議。
HTTP的URL是由“http://”起始與默認(rèn)使用端口80,而HTTPS的URL則是由“https://”起始與默認(rèn)使用端口443。
HTTP不是安全的,而且攻擊者可以通過(guò)監(jiān)聽(tīng)和中間人攻擊等手段,獲取網(wǎng)站帳戶和敏感信息等。HTTPS的設(shè)計(jì)可以防止前述攻擊,在正確配置時(shí)是安全的。
美國(guó)民主與技術(shù)中心CDT首席技術(shù)專家JosephHall表示:"使用HTTPS,你的互聯(lián)網(wǎng)服務(wù)供應(yīng)商不會(huì)知道你在網(wǎng)站上干了些什么,即使是***和間諜也不能辦到。"
所以,目前已經(jīng)有很多網(wǎng)站都在使用HTTPS協(xié)議了,包括全球最大的程序員交友網(wǎng)站:github!我說(shuō)的是github,不是***hub哦,雖然他也是https的。
文章來(lái)源于網(wǎng)絡(luò);
PS:本文的特殊形式只是為了更加通俗易懂的講解知識(shí)。