一.簡(jiǎn)介
?http是基于tcp/ip傳輸協(xié)議的一個(gè)超文本,無(wú)狀態(tài)的應(yīng)用協(xié)議谁榜。設(shè)計(jì)http協(xié)議的目的是能夠方便高效的傳輸html數(shù)據(jù)。默認(rèn)用80端口。
一個(gè)www.baidu.com的過(guò)程
1.對(duì)baidu.com的網(wǎng)址進(jìn)行dns解析
2.解析出ip地址总珠,找到對(duì)應(yīng)的服務(wù)器。
3.建立tcp連接
4.通過(guò)http協(xié)議傳輸文本信息到服務(wù)器
5.服務(wù)器接收消息伊约,通過(guò)http協(xié)議返回html
6.瀏覽器解析html,并請(qǐng)求靜態(tài)資源
7.瀏覽器進(jìn)行渲染姚淆。
二.http的歷史
http最開(kāi)始是0.9版本孕蝉,只支持get
http1.0支持了很多功能?并且規(guī)范了請(qǐng)求header信息屡律。
那時(shí)候一個(gè)tcp連接就處理一個(gè)http請(qǐng)求,并且請(qǐng)求結(jié)束后斷開(kāi)tcp降淮。
這時(shí)候的缺點(diǎn)是?一個(gè)tcp只能處理一個(gè)http請(qǐng)求超埋,隨著請(qǐng)求量增加,每次建立tcp會(huì)產(chǎn)生大量網(wǎng)絡(luò)開(kāi)銷佳鳖,性能差霍殴。
http1.1的發(fā)展支持了tcp keep-alive,并且使用管道技術(shù),以前http請(qǐng)求需要等上次請(qǐng)求完成后才能發(fā)下一個(gè)請(qǐng)求系吩。運(yùn)用管道技術(shù)来庭,可以不用等上次請(qǐng)求返回再發(fā)下次請(qǐng)求。例如:
同一個(gè)tcp連接
client ->A請(qǐng)求->服務(wù)端
client->B請(qǐng)求->服務(wù)端
服務(wù)端->A回應(yīng)->client
服務(wù)端->B回應(yīng)->client
缺點(diǎn):http1.1雖然實(shí)現(xiàn)了tcp連接復(fù)用穿挨,但是如果出現(xiàn)A請(qǐng)求處理過(guò)長(zhǎng)月弛,后續(xù)的請(qǐng)求還是會(huì)進(jìn)行阻塞,也叫頭阻塞科盛。而且http1.1的頭報(bào)文每行還是會(huì)有無(wú)數(shù)據(jù)意義的換行符帽衙,浪費(fèi)網(wǎng)絡(luò)帶寬。
http2
二進(jìn)制
我們知道http1.1的頭信息編碼肯定是ASCII碼贞绵,數(shù)據(jù)傳輸可以是文本也可以是二進(jìn)制厉萝。http2是完完全全的二進(jìn)制協(xié)議傳輸。http2的二進(jìn)制數(shù)據(jù)統(tǒng)稱為幀(frame),二進(jìn)制定義幀含義,解析方便谴垫。
多工
http2是復(fù)用tcp連接章母,用的是二進(jìn)制幀傳輸,不用保證數(shù)據(jù)傳輸順序翩剪,多個(gè)請(qǐng)求可以同時(shí)請(qǐng)求胳施。
舉例來(lái)說(shuō),在一個(gè)TCP連接里面肢专,服務(wù)器同時(shí)收到了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)求剩下的部分哩盲。
這樣雙向的、實(shí)時(shí)的通信狈醉,就叫做多工廉油。
數(shù)據(jù)流
數(shù)據(jù)流不用保證順序,那就得標(biāo)記哪個(gè)數(shù)據(jù)包是哪個(gè)請(qǐng)求的苗傅,所以就需要標(biāo)記數(shù)據(jù)id抒线。規(guī)定客戶端是奇數(shù),服務(wù)端是偶數(shù)渣慕。并且可以在不斷開(kāi)tcp連接的情況下發(fā)送信號(hào)斷開(kāi)數(shù)據(jù)流嘶炭。
數(shù)據(jù)壓縮
http2也對(duì)對(duì)頭信息進(jìn)行壓縮,并且客戶端和服務(wù)端都維護(hù)了一個(gè)頭信息hash表逊桦,這樣每次傳輸只用傳索引號(hào)就行了眨猎。節(jié)省網(wǎng)絡(luò)帶寬,提供速度强经。
服務(wù)器主動(dòng)推送
對(duì)于瀏覽器解析服務(wù)器返回的html后睡陪,需要請(qǐng)求靜態(tài)資源。http2考慮到瀏覽器可能會(huì)去請(qǐng)求靜態(tài)資源匿情,所以在返回html的時(shí)候兰迫,主動(dòng)吧靜態(tài)資源推送給瀏覽器。
三.https
?https是為了保證傳輸數(shù)據(jù)的安全性提出的對(duì)于http加密的方式码秉。實(shí)際上是在http傳輸過(guò)程中加了一層SSL逮矛,是對(duì)tcp數(shù)據(jù)包的加密。
https的請(qǐng)求流程
1.瀏覽器把自己支持的加密算法转砖,ssl版本號(hào)發(fā)給服務(wù)端
2.服務(wù)端接受后向客戶端發(fā)送加密算法须鼎,ssl版本號(hào)確認(rèn)是否支持鲸伴。
服務(wù)端把證書(shū)和公鑰都發(fā)給瀏覽器
3.瀏覽器驗(yàn)證證書(shū)是否ok,成功后晋控,隨機(jī)生成一個(gè)預(yù)見(jiàn)秘鑰汞窗,并用公鑰對(duì)其加密發(fā)送服務(wù)端。
4.服務(wù)端接收到加密后預(yù)見(jiàn)秘鑰后用CA的私鑰對(duì)其解密赡译,解密后仲吏,計(jì)算出會(huì)話秘鑰。
5.客戶端也自己計(jì)算出會(huì)話秘鑰蝌焚。
6.服務(wù)端計(jì)算完后就通知客戶端可以用會(huì)話秘鑰傳輸數(shù)據(jù)了裹唆。