第四章 資源加載和網(wǎng)絡(luò)棧

WebKit資源加載機(jī)制

1. 資源

WebKit資源類型

HTML支持的類型主要包括:HTML担忧、JavaScript、CSS樣式表坯癣、圖片瓶盛、SVG、CSS Shader示罗、視頻音頻和字幕惩猫、字體類型和XSL樣式表。


資源類型前面加“Cached”字樣鹉勒,其實(shí)這是因?yàn)樾蕟?wèn)題而引入的緩存機(jī)制帆锋,所有對(duì)資源的額請(qǐng)求都會(huì)先獲取緩存中的信息,以決定是否向服務(wù)器提出資源請(qǐng)求禽额。

2. 資源緩存

資源的緩存機(jī)制

資源的緩存機(jī)制是提高資源使用效率的有效方法锯厢。它的基本思想是建立一個(gè)資源的緩沖池,當(dāng)WebKit需要請(qǐng)求資源的時(shí)候脯倒,先從資源池中查找是否存在相應(yīng)的資源实辑。如果有,WebKit則取出使用藻丢,如果沒(méi)有剪撬,WebKit創(chuàng)建一個(gè)新的CachedResource子類的對(duì)象,并發(fā)送真正的請(qǐng)求給服務(wù)器悠反,WebKit收到資源之后將其設(shè)置到該資源類的對(duì)象中去残黑,以便于緩存后下次使用。這里緩存指的是內(nèi)存緩存斋否。


WebKit從資源池中查找資源的關(guān)鍵字是URL

3. 資源加載器

資源加載器分為三種:

  1. 針對(duì)每種資源類型的特定加載器梨水,特點(diǎn)是僅加載某一特定類型資源。
  2. 資源緩存機(jī)制的資源加載器茵臭,特點(diǎn)是所有特定加載器都共享它來(lái)查找并插入緩存資源疫诽。
  3. 通用的資源加載器,是在WebKit需要從網(wǎng)絡(luò)或者文件系統(tǒng)獲取資源的時(shí)候使用旦委,該類只負(fù)責(zé)數(shù)據(jù)的獲取奇徒,被特定加載器共享。

4. 過(guò)程

因?yàn)閺木W(wǎng)絡(luò)獲取資源是一個(gè)非常耗時(shí)的過(guò)程缨硝,通常一些資源的加載是異步執(zhí)行的摩钙,也就是說(shuō)資源的獲取和加載不會(huì)阻礙當(dāng)前WebKit的渲染過(guò)程,例如:圖片查辩、CSS文件腺律。但是也存在阻礙主線程的渲染過(guò)程的資源奕短,例如:JavaScript代碼文件宜肉。


因?yàn)橹骶€程被阻礙了匀钧,后面的解析工作沒(méi)辦法繼續(xù)往下進(jìn)行,所以對(duì)于HTML網(wǎng)頁(yè)中后面使用的資源也沒(méi)辦法知道并發(fā)送下載請(qǐng)求谬返。這時(shí)之斯,WebKit會(huì)啟動(dòng)另外一個(gè)線程去遍歷后面的HTML網(wǎng)頁(yè),收集需要的資源URL遣铝,然后發(fā)送請(qǐng)求佑刷,這樣可以避免被阻礙。

5. 資源的生命周期

資源池中的資源聲明周期是什么呢酿炸?資源池不能無(wú)限大瘫絮,必須要使用相應(yīng)的機(jī)制來(lái)替換其中的資源,從而加入新的資源填硕。它采用的是LRU(Least Recent Used最近最少使用)算法麦萤。


WebKit的做法是,首先判斷資源是否在資源池中扁眯,如果是壮莹,那么發(fā)送一個(gè)HTTP請(qǐng)求給服務(wù)器,說(shuō)明該資源在本地的一些信息姻檀,例如該資源什么時(shí)間修改的命满,服務(wù)器則根據(jù)該信息作判斷,如果沒(méi)有更新绣版,服務(wù)器則發(fā)送回狀態(tài)碼304胶台,表明無(wú)需更新,那么直接利用資源池中原來(lái)的資源杂抽;否則诈唬,WebKit申請(qǐng)下載最新的資源內(nèi)容。

網(wǎng)絡(luò)棧

WebKit網(wǎng)絡(luò)棧.png

1. 代理

2. 域名解析(DNS)

一般在建立TCP連接之前要解析域名默怨,為了考慮效率讯榕,使用HostCache類來(lái)保存解析后的域名,最多時(shí)會(huì)有多達(dá)1000個(gè)的域名和地址映射關(guān)系會(huì)被存儲(chǔ)起來(lái)匙睹。


如果想要了解當(dāng)前域名解析詳情和HostCache中的信息愚屁,可以通過(guò)在Chrome瀏覽器的地址欄中輸入chrome://net-internals/#dns來(lái)查看。

3. 磁盤(pán)本地緩存

可以通過(guò)在地址欄輸入chrome://view-http-cache/來(lái)查看這些項(xiàng)痕檬。

索引文件和數(shù)據(jù)文件的磁盤(pán)索引結(jié)構(gòu)

4. Cookie機(jī)制

根據(jù)Cookie的時(shí)效性可以將Cookie分成兩種類型:

  1. 第一種是會(huì)話型Cookie(Session Cookie)霎槐,這些Cookie只是保存在內(nèi)存中,當(dāng)瀏覽器退出的時(shí)候即清除這些Cookie梦谜。
  2. 第二種是持續(xù)型Cookie(Persistent Cookie)丘跌,也就是當(dāng)瀏覽器退出的時(shí)候袭景,仍然保留Cookie的內(nèi)容。該類型的Cookie有一個(gè)有效期闭树,在有效期內(nèi)耸棒,每次訪問(wèn)該Cookie所屬域的時(shí)候,都需要將該Cookie發(fā)送給服務(wù)器报辱,這樣服務(wù)器能夠有效追蹤用戶的行為与殃。

5. 安全機(jī)制

HTTP是一種使用明文來(lái)傳輸數(shù)據(jù)的應(yīng)用層協(xié)議。構(gòu)建在SSL之上的HTTPS提供了安全的網(wǎng)絡(luò)傳輸機(jī)制碍现,現(xiàn)已被廣泛應(yīng)用在網(wǎng)絡(luò)上幅疼。

6. 高性能網(wǎng)絡(luò)棧

Chromium 的網(wǎng)絡(luò)模塊有兩個(gè)重要的目標(biāo),其一就是安全昼接,其二就是速度爽篷。

  1. DNS預(yù)取和TCP預(yù)取連接(Preconnect)
  1. 一次DNS查詢的平均時(shí)間大概是60~120ms之間或者更長(zhǎng),而TCP的三次握手時(shí)間大概也是幾十毫秒或者更長(zhǎng)慢睡。Chromium采用DNS預(yù)取和TCP預(yù)連接逐工。
  2. 可以顯示指定預(yù)取哪些域名來(lái)讓Chromium解析,具體做法如下:<link rel="dns-prefetch" href="http://this-is-a-dns-preftch-example.com">
  3. 還有在用戶地址中輸入地址后一睁,候選項(xiàng)同輸入的地址很匹配的時(shí)候钻弄,在用戶橋下回車鍵獲取該網(wǎng)頁(yè)之前,Chromium已經(jīng)開(kāi)始使用DNS預(yù)取技術(shù)解釋該域名了者吁。
  4. 可以在地址欄輸入chrome://dns/查看Chromium的DNS預(yù)取的域名窘俺。
  1. HTTP管線化(Pipelining)
  1. HTTP管線化技術(shù)是一項(xiàng)同時(shí)將多個(gè)HTTP請(qǐng)求一次性提交給服務(wù)器的技術(shù),因此無(wú)需等待服務(wù)器的回復(fù)复凳,因?yàn)樗赡軐⒍鄠€(gè)HTTP請(qǐng)求填充在一個(gè)TCP數(shù)據(jù)包內(nèi)瘤泪。
  2. 管線化需要通過(guò)永久連接(Persistent Connection)完成,并且只有GET和HEAD等請(qǐng)求可以進(jìn)行管線化育八,使用場(chǎng)景有很大的限制对途。
使用HTTP管線化進(jìn)行請(qǐng)求和回復(fù)
  1. SPDY
  1. SPDY就是為了解決網(wǎng)絡(luò)延遲和安全性問(wèn)題。根據(jù)Google的官方數(shù)據(jù)髓棋,使用SPDY協(xié)議的服務(wù)器和客戶端可以將網(wǎng)絡(luò)加載的時(shí)間減少64%实檀,在HTTP2.0的草案中將引入SPDY協(xié)議,將其作為基礎(chǔ)來(lái)編寫(xiě)按声。


    SPDY所處的層次.png

7. 高效的資源使用策略

  1. DNS和TCP連接
  1. 減少鏈接的重定向
  2. 利用DNS預(yù)取機(jī)制
  3. 搭建支持SPDY協(xié)議的服務(wù)器
  4. 避免錯(cuò)誤的鏈接請(qǐng)求
  1. 資源的數(shù)量
  1. 在HTML網(wǎng)頁(yè)中內(nèi)嵌小型的資源膳犹,也就是當(dāng)資源比較小的時(shí)候,開(kāi)發(fā)者可以將它們直接放在網(wǎng)頁(yè)中签则,可能的資源如CSS须床、JavaScript和圖片等。
  2. 合并一些資源渐裂,例如CSS豺旬、JavaScript和圖片钠惩。
  1. 資源的數(shù)據(jù)量
  1. 使用瀏覽器本地磁盤(pán)緩存機(jī)制限嫌。
  2. 啟用資源的壓縮技術(shù)霎肯,比如圖片資源拧晕,可以使用zip壓縮技術(shù)泽疆,然后在HTTP消息頭中說(shuō)明該資源經(jīng)過(guò)壓縮。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末美尸,一起剝皮案震驚了整個(gè)濱河市罩锐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌求泰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件计盒,死亡現(xiàn)場(chǎng)離奇詭異渴频,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)北启,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)卜朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人咕村,你說(shuō)我怎么就攤上這事场钉。” “怎么了懈涛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵逛万,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我批钠,道長(zhǎng)宇植,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任埋心,我火速辦了婚禮指郁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拷呆。我一直安慰自己闲坎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布茬斧。 她就那樣靜靜地躺著腰懂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啥供。 梳的紋絲不亂的頭發(fā)上悯恍,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音伙狐,去河邊找鬼涮毫。 笑死瞬欧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罢防。 我是一名探鬼主播艘虎,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咒吐!你這毒婦竟也來(lái)了野建?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恬叹,失蹤者是張志新(化名)和其女友劉穎候生,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绽昼,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唯鸭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硅确。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片目溉。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖菱农,靈堂內(nèi)的尸體忽然破棺而出缭付,到底是詐尸還是另有隱情,我是刑警寧澤循未,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布陷猫,位于F島的核電站,受9級(jí)特大地震影響只厘,放射性物質(zhì)發(fā)生泄漏烙丛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一羔味、第九天 我趴在偏房一處隱蔽的房頂上張望河咽。 院中可真熱鬧,春花似錦赋元、人聲如沸忘蟹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)媚值。三九已至,卻和暖如春护糖,著一層夾襖步出監(jiān)牢的瞬間褥芒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锰扶,地道東北人献酗。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坷牛,于是被迫代替她去往敵國(guó)和親罕偎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容