經過從輸入url到頁面顯示這一整個運行過程,梳理如下相關知識點javascript
http1.1
, http2.0
,https
, TCP/UDP
,網絡架構
,緩存
瀏覽器進程&線程
,渲染機制
,跨域
,安全(XSS,CSRF)
主要是把知識成體系的創建起來css
線程與進程html
併發與並行前端
同步與異步vue
阻塞與非阻塞java
瀏覽器的進程和線程node
用戶輸入 (輸入解析
)react
檢查緩存(強緩存和協商緩存
)nginx
DNS解析(IP反查
,DNS緩存
)git
創建TCP鏈接(三次握手
,UDP
,網絡架構
,等待tcp隊列
)
創建TLS鏈接 (HTTPS
)
發起http請求(http1.0
,http1.1
, http2.0
,請求行
,請求頭
,請求體
)
服務器處理請求
服務器響應請求(響應行
,響應頭
,響應體
,狀態碼
)
斷開TCP鏈接(四次分手
)
渲染開始(從進程的角度講
,中間有一個導航流程
,)
構建dom樹
樣式解析計算(css阻塞問題
,結構化,屬性標準化,元素樣式具體化(繼承,層疊,特指)
)
建立佈局樹(建立可見元素的佈局樹
,計算節點位置
,優化(重繪,重排相關)
)
分層,生成分層樹(緣由
,分層條件
)
生成繪製列表,交給合成線程
合成線程將圖層分爲圖塊,光刪化將圖塊變成位圖(分圖塊緣由
)
合成線程發送繪製圖塊命令,給瀏覽器進程
瀏覽器生成頁面,顯示到顯示器上
進程
線程
關係
關鍵區別是否同時同時就是並行
同步和異步關注的是消息通訊機制
關鍵區別 主動等,仍是被通知
阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.
關鍵區別結果返回前,可不能夠作別的
從輸入url到頁面顯示這一整個運行過程,瀏覽器進程和線程是必不可少的角色,先來了解下他們
瀏覽器線程與進程關係圖以下
GUI渲染線程:
JS引擎線程
事件觸發線程
是屬於瀏覽器,用來控制事件循環,
當js執行如setTImeout,等異步代碼,會將染污添加到事件線程中
對應事件符合條件被觸發時改線程會把事件添加到待處理隊列的隊尾,等待js引擎的處理
js是單線程的關係,待處理隊列中的事件都得排隊等待js引擎處理
js引擎線程只負責執行看病,事件觸發線程幫他掛號,排隊
定時觸發器線程
就是setINterval,setTimeout所在線程
瀏覽器的定時計數器,並非由js引擎計數的,(js引擎單線程,處於阻塞狀態會影響計時的準確性)
經過單獨線程計時,並觸發定時(計時完畢後,添加到事件隊列,等待js引擎空閒後執行)
w3c規定,setTimeout 低於4ms 時間間隔的都算爲4ms
定時觸發器線程,幫助計時
異步http請求線程
XMR鏈接後,瀏覽器新開一個線程請求
檢測到狀態變動,設有回調函數,異步線程產生狀態變動事件,就將回調再放入事件隊列中,等待js引擎執行
在瀏覽器中打開一個頁面,會開啓幾個進程
但有其它狀況
若是頁面中有iframe的話,iframe也會運行在單獨的進程中
若是頁面有插件,插件也須要開啓一個單獨的進程
若是瀏覽器中裝了擴展,一個擴展對應一個進程
若是兩個頁面屬於同一站點,而且從a頁面中打開b頁面,那麼他們會公用一個渲染進程
瀏覽器進程
會根據URL規則進行斷定解析,baidu.com
則補充協議 https://www.baidu.com/
瀏覽器進程
會經過進程間通訊(IPC)把 URL 請求發送至網絡進程
,網絡進程
接收到 URL 請求後,發起URL請求流程, 構建請求行信息,網絡進程
會查找本地緩存是否緩存了該資源。若是有緩存資源且緩存有效,那麼直接返回資源給瀏覽器進程
;若是在緩存中沒有查找到資源,那麼直接進入網絡請求流程那麼若是纔會有緩存且斷定緩存有效呢
緩存分爲強緩存和協商緩存
http1.0 資源最後修改時間(服務器在響應請求時,會告訴瀏覽器資源的最後修改時間)
缺點:
【1】資源被修改,時間變了,但實際內容沒變
【2】短期頻繁修改,秒如下級別沒法捕捉
if-Modified-Since: 再次請求時會利用此屬性攜帶Last-Modified時間,用於服務資源比較
if-Unmodified-Since: 從某個時間點算起, 是否文件沒有被修改,使用的是相對時間,不須要關心客戶端和服務端的時間誤差,利用它實現斷點續傳功能的判斷
優先級
強緩存 > 協商緩存 高版本 > 低版本
TCP
連接,OSI七層 | 網絡五層 | TCP/IP四層 |
---|---|---|
應用層 | 應用層 | 應用層 |
表示層 | ||
會話層 | ||
傳輸層 | 傳輸層 | 傳輸層 |
網絡層 | 網絡層 | 網絡層 |
數據鏈路層 | 數據鏈路層 | 數據鏈路層 |
物理層 | 物理層 | - |
應用層 HTTP
生成http請求報文 數據包發送
傳輸層 TCP/UDP
報文分割,打上標記及端口號 數據包送達具體應用
網絡層 IP
增長做爲通訊目的地的mac地址 數據包送達主機
SYN
是同步,ACK
是應答seq
是同步序列號,ack
是應答號,SYN
報文,並指明客戶端的初始化序列號 ISN(c)
。此時客戶端處於 SYN_SEND
狀態。SYN
報文以後,會以本身的 SYN 報文做爲應答,而且也是指定了本身的初始化序列號 ISN(s)
,同時會把客戶端的 ISN + 1
做爲 ACK
的值,表示本身已經收到了客戶端的 SYN,此時服務器處於 SYN_REVD
的狀態。establised
狀態。establised
狀態,此時,雙方以創建起了連接。'Client' 'Server'
【1】SYN(seq=ISN(c))
`SYN_SEND` --------------------->
同步已發送
【2】SYN + ACK(seq=ISN(s),ack=ISN(c)+1)
`establised` <--------------------- `SYN_REVD`
已鏈接 同步接收
【3】ACK(ack=ISN(s)+1)
---------------------> `establised`
已鏈接
複製代碼
若是是HTTPS
請求還要創建TLS
連接
HTTPS連接和HTTP連接都創建在TCP協議之上
HTTP請求 = TCP握手
HTTPS請求 = TCP握手 + TLS握手
https簡單說就是對數據傳輸加密,保證安全
HTTP + 加密 + 認證 + 完整性保護
= HTTPS
HTTP 協議與 TCP/IP 協議中間 加了一層HTTPS協議,HTTP -> TLS -> TCP -> IP
HTTPS採用共享密鑰加密
與公開密鑰加密
混合加密機制,保證處理速度和安全性
對稱加密
,加密解密相同密鑰非對稱加密方式
加密對稱加密的密鑰
,公鑰傳給客戶端用來加密,私鑰服務端本身留着解密第三方認證機構
,SSL
是一種安全傳輸協議,TLS
是SSL v3.0的升級版,目前全部的HTTPS都是用的是TLS借用【HTTP圖解】中的過程(描述簡化)
支持的SSL的指定版本
、加密組件列表
(所使用的加密算法及密匙長度等)。http1.1
, http2.0
)複用連接
Keep-Alive
持久化連接,只要瀏覽器或者服務器沒有明確斷開鏈接,那麼該TCP鏈接會一直保持,因此處理完一個請求以後,能夠用來處理下個http請求管線化
並行
發送多個請求, 不須要等待響應再發送下一個請求,隊頭堵塞
(某個請求由於某些緣由沒有及時返回,那麼就會阻塞後面的全部請求)問題緩存處理
Entity tag
,If-Unmodified-Since
, If-Match
, If-None-Match
(此處可看緩存
)帶寬優化及網絡鏈接的使用
range頭域
,它容許只請求資源的某個部分
,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和鏈接。錯誤通知的管理
Host頭處理
下降延遲,針對HTTP高延遲的問題,SPDY優雅的採起了多路複用(multiplexing)。多路複用經過多個請求stream共享一個tcp鏈接的方式,解決了HOL blocking的問題,下降了延遲同時提升了帶寬的利用率。
請求優先級
header壓縮
SPDY
使用通用的DEFLATE
算法HTTPS加密
服務端推送
二進制格式
多路複用
http2.0
雖然依然遵循請求-響應模式,但客戶端發送多個請求和服務端給出多個響應的順序不受限制,這樣既避免了"隊頭堵塞",又能更快獲取響應。header壓縮
HPACK
算法服務端推送
跨域
,XSS
,CSRF
)CORS
解決nginx
控制負載均衡跨域是因爲瀏覽器的同源策略
同源策略 出於對瀏覽器安全考慮,防止收到XSS,CSRF攻擊,協議+域名+端口有一個不一樣,則是非同源
同源限制策略
jsonp
跨域數據交互協議<script>、<img>、<iframe>
爲了遠端js知道須要調用的函數,且可能會調用不少數據對象,對應不一樣的函數
js腳本就不能寫死,咱們動態生成js腳本,利用傳參的不一樣,來區分調用
跨域資源共享(Cross-origin resource sharing)
對那些可能對服務器數據產生反作用的 HTTP 請求方法 瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request), 從而獲知服務端是否容許該跨域請求 服務器確認容許以後,才發起實際的 HTTP 請求
不會觸發CORS預檢的請求稱爲簡單請求
GET,POST,HEAD
不得人爲設置其餘首部字段
content-type
僅限( text/plain
multipart/form-data
application/x-www-form-urlencoded
)
普通跨域請求:服務端設置 Access-control-allow-origin
攜帶cookie跨域請求:
location / {
add_header Access-Control-Allow-Origin *;
}
複製代碼
原理:
同源策略是瀏覽器的安全策略,不是http協議的一部分,服務器端調用接口, 不會執行js腳本,不須要同源策略,也就不存在跨域問題
實現:
nginx配置
server{
listen 81;
server_name www.a.com;
locaton / {
proxy_pass https://b.com
add_header Access-Control-Allow-Origin http://a.com; #當前端只跨域不帶cookie時,可爲*
add_header Access-Control-Allow-Credentials true;
}
}
複製代碼
原理:
cookieDomainRewrite
修改響應頭中cookie 中域名,實現當前域cookie寫入websocket是H5新協議,實現瀏覽器與服務器全雙工通訊,同時容許跨域,
使用socket.io(websocket原生封裝)
postMessage
是h5 XHR的API,是跨域操做的window屬性之一 解決
應用 postMessage(data, origin) data: 須要傳遞的數據 JSON.String() 部分瀏覽器只支持字符串 origin: 協議+ 域名 + 端口 能夠 *
傳遞任意窗口
iframe.contentWindow.postMessage
僅限子域不一樣跨域 兩個頁面強制設置 document.domain 爲基礎主域,就實現了同域
a與b不一樣域,b是a的iframe ,a能傳給b ,但b沒法傳a,
利用c,c與a是同域,且c是b的iframe,b 傳給c, c再傳給a
實現了a與b跨域雙向通訊,
原理: a與b跨域通訊,經過c來實現,不一樣域之間利用iframe的location.hash傳值, c與a同域,因此c可經過parent.parent訪問a頁面全部對象。
實現: a -> b -> c -> a
原理:window.name 屬性 再不一樣頁面,甚至不一樣域名,加載以後依然存在,並支持 較大存儲(2MB)
a,b跨域, b是a的iframe, 實現:
經過在 有安全漏洞的web網站註冊用戶的瀏覽器上 運行非法的HTML標籤或Javascript進行的一種攻擊
本質是:惡意代碼未通過濾,瀏覽器沒法分辨,致使惡意代碼被執行
數據庫
,由服務端
取出,插入在html
執行URL
,由服務端
取出,插入在html
執行數據庫/客戶端/URL
,前端JavaScript
取出, 插入在JavaScript
執行DOM型 XSS屬於前端安全漏洞,其餘兩種屬於後端安全漏洞
明確渲染內容的類別,幫助瀏覽器分辨是文本(.innerText
),屬性(.setAttribute
)或是樣式(.style
),用對應的方法去渲染
適用於內部管理項目
對 HTML 作充分轉義
適用於要求性能,SEO的對外項目
當心使用 .innerHtml
,.outerHtml
,document.write()
, 不要把不可信數據插入html 儘可能使用.textCotent
,.setAttribute()
若是用vue/react框架,當心使用v-html
/dangerouslySetInnerHTML
, 也可減小XSS隱患
如下都能把字符串做爲代碼運行,當心使用:
location
,onclick
,onload
,onmouseover
等<a>
標籤的屬性eval()
,setTimeout
,setInterval()
等Content Security Policy (CSP)內容安全策略
內容長度控制,防止複雜攻擊
驗證碼,防止腳本提交
HTTP-only Cookie, 禁止js讀取cookie
誘導受害者進入第三方網站,向被攻擊網站發起請求,利用受害者在被攻擊網站獲取的註冊憑證(cookie),繞事後臺驗證,以此冒充用戶對被攻擊網站執行某項操做。
本質:冒充用戶,發起請求,執行惡意操做(憑證也不能證實請求是用戶主動想要發起的)
特色
<img href="http...">
<form action="http..."></form>
<a href="http...">
針對CSRF特色
做出專門預防
同源檢測
判斷請求是否來自外域,利用請求的header屬性origin
和 referer
缺點:
referrerpolicy="no-referrer
阻止外域請求時,須要過濾掉正常的外戰請求(例如百度搜索,友好連接)
Token
用戶登陸時,服務端返回 token,以後的請求都攜帶token,用以辨別正常請求和攻擊請求
缺點:
自動
帶上token, 若是存在XSS漏洞,攻擊者仍是能夠寫腳本(XSS)獲取token,進而進行CSRF攻擊雙重Cookie
與token原理大體相同,
用戶訪問網站時,服務端向請求域注入一個cookie,隨機字符,以後的請求都攜帶cookie,用以辨別正常請求和攻擊請求
優勢:
缺點:
沒法大規模應用
samesite cookie 屬性
根源解決問題,改進http協議,set-cookie響應頭添加samesite屬性
Samesite=Strict 嚴格模式:非本域請求不會攜帶此cookie
Samesite=Lax 寬鬆模式:第三方請求,且同時是GET請求,能夠攜帶
缺點:
不成熟,有待發展
安全測試
,行爲監控
,上傳文件&內容校驗
,提高網站安全性響應信息
, 狀態碼
)網絡進程
開始解析響應頭
HTTP
請求2XX 成功
3XX 重定向
4XX 客戶端錯誤
5XX 服務器錯誤
四次揮手
)TCP
連接通訊的雙方均可釋放鏈接,雙方都處於 establised 狀態,假如是客戶端先發起關閉請求
FIN
報文,指定序列號 此時客戶端處於FIN_WAIT1
狀態。ACK
報文,且把客戶端的序列號值 + 1 做爲 ACK 報文的序列號值,代表已經收到客戶端的報文了,此時服務端處於 CLOSE_WAIT
狀態。FIN
報文,且指定一個序列號。此時服務端處於 LAST_ACK
的狀態。TIME_WAIT
狀態。等待計時器設置的兩倍的最長報文段(MSL)時間
,以確保服務端收到本身的 ACK 報文以後纔會進入 CLOSED
狀態CLOSED
狀態'Client' 'Server'
【1】FIN seq=u
`FIN_WAIT1` --------------------->
【2】ACK,ack=u+1,seq=v
`FIN_WAIT2` <--------------------- `CLOSE_WAIT`
【3】FIN,ACK,seq=w,ack=u+1
`TIME_WAIT` <--------------------- `LAST_ACK`
【4】ACK ack=w+1, seq=u+1
`2MSL close` ---------------------> `close`
複製代碼
第二次揮手完成後,TCP鏈接處於半關閉狀態(客戶端再也不向服務器發送數據),服務器若發送數據,客戶端仍然接受。
爲何鏈接的時候是三次握手,關閉的時候倒是四次握手
Server
端收到FIN
報文時,可能數據尚未傳輸完成,而不會當即關閉連接,ACK
,傳輸完成在發起FIN
,故須要四步握手等待2MSL (最長報文壽命)
要確保服務器收到了ACK
報文,沒有收到的話,會從新發 FIN
,客戶端再次收到 FIN 報文以後,就知道以前的 ACK 報文丟失了,而後再次發送 ACK 報文。
渲染進程
瀏覽器進程
將網絡進程
接收到的 HTML 數據提交給渲染進程
HTML
轉換爲瀏覽器可以理解的結構DOM樹
css阻塞問題
,結構化
,屬性標準化
,元素樣式具體化(繼承,層疊,特指)
))繼承
,層疊
,特指
,優先級由低到高
繼承,某些父節點樣式是能夠繼承給子節點的,例如,文本屬性,color
,font-size
例如字體顏色
層疊,定義瞭如何合併來自多個源的屬性值的算法,多個來源,優先級由低到高
特指, 選擇器優先級,由高到低,I-C-E, ID,class,element
建立可見元素的佈局樹
,計算節點位置
,優化(重繪,重排)
)DOM
樹中可見元素的幾何位置DOM
或CSS
,就會致使重繪和重排優化 減小重排和重繪
瀏覽器:
瀏覽器大多經過隊列機制更新佈局,瀏覽器把修改操做放在隊列中,必定時間後執行後纔會清空隊列,
但若是獲取佈局信息,避免隊列中有影響這些屬性或方法返回值的操做,瀏覽器會直接強制清空隊列,觸發重排與重繪保證正確的返回值
即避免使用獲取佈局信息的方法或屬性,他們會強制渲染刷新隊列
CSS
GPU加速
requestAnimationFrame
GPU加速
requestAnimationFrame requestAnimationFrame採用系統時間間隔, 保持最佳繪製效率,不會由於間隔時間太短,形成過分繪製,增長開銷; 也不會由於間隔時間太長,使用動畫卡頓不流暢,讓各類網頁動畫效果可以有一個統一的刷新機制,從而節省系統資源,提升系統性能,改善視覺效果
生成單獨圖層的條件
擁有具備3D變換的CSS屬性
視頻解碼的<video>
節點
<canvas>
節點
CSS3動畫
CSS加速屬性的元素(will-change)
注意:建立一個單獨圖層的時,佔用的內存也會大大增長
圖層
(當前屏幕沒法徹底顯示)劃分爲圖塊
,柵格化
將圖塊變成位圖, 柵格化過程
會使用 GPU
來加速生成總的來講兩個部分:請求資源
和頁面渲染
請求資源
URL
, 瀏覽器解析斷定爲URL
,根據規則進行補全DNS
解析 反查域名,還會有DNS
緩存HTTPS
請求還要先創建TLS
連接TCP
連接, 三次握手HTTP
請求頁面渲染
DOM
樹styleSheets