當面試官拋出這個問題的時候,你是否信心滿滿的回答:
1)域名dns解析
2)解析成ip之後建立與服務器的連接(三次握手)
3)與服務器建立連接之後,發送請求,
4)服務器接受請求之後,處理請求並完成響應
5)瀏覽器的接受數據和頁面渲染,構建DOM樹
6)關閉tcp連接(四次揮手)
如果我們再擴展一下。深入一下步奏:
1) 你瞭解dns的解析過程嗎?步驟是怎麼樣的?
2) DNS查詢的順序是怎麼樣的
2) 3次握手是怎麼樣的?
3) 4次揮手又是什麼?
4) dns的解析發生在哪一個物理層?
5) 服務器接受請求頭部信息包括什麼?
6) 服務端返回數據的形式是什麼?
7) TCP 有什麼特性?
8) TCP與UDP的區別是什麼?
9) http1.0跟http1.1, http2.0有什麼區別?
10)服務器建立連接時,是否有緩存機制?
11)如果服務器判斷不同的頁面,發生在哪個階段?
12)構建DOM樹的過程是怎麼樣的?
13)html樹跟css樹是怎麼樣結合成dom樹的?
14)服務器響應的數據返回包括什麼?
知識點普及
說明:以下爲個人原創手寫彙總,如有解釋錯誤,請指出。如覺得還行,點個贊鼓勵一下吧。
包含以下內容:
1)dns模塊(解析過程,查詢方式,優化方式)
2)http模塊( http狀態碼, 請求方法, http/https/http 1.1/http2.0)
3)網絡協議(各個應用層的作用)
4)TCP/UDP的特點
5) 瀏覽器的緩存機制
6) 瀏覽器接受返回數據到html後的解析過程,如何優化
7) 迴流和重繪(是什麼?怎麼引起?如何優化?)
1.DNS模塊
1.1 dns解析過程
1.首先會查詢hosts文件是否,有對應的網址映射關係。如果有,優先採取。
2.查找本地DNS解析器緩存, 如果有,取本地緩存。
3.如果hosts與本地DNS解析器緩存都沒有相應的網址映射關係,首先會找TCP/ip參數中設置的首選DNS服務器,
在此我們叫它本地DNS服務器,此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,
則返回解析結果給客戶機,完成域名解析,此解析具有權威性。
4.如果要查詢的域名,不由本地DNS服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個IP地址映射,
完成域名解析,此解析不具有權威性。
5.如果上面都失敗,則查看是否採用了轉發模式,
如果未用轉發模式,往上一級域名,重複上面的動作,進行查詢,直至找到www . qq .com主機。
6.如果用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析
,上一級服務器如果不能解析,或找根DNS或把轉請求轉至上上級,以此循環。
不管是本地DNS服務器用是是轉發,還是根提示,最後都是把結果返回給本地DNS服務器,
由此DNS服務器再返回給客戶機。
1.2 dns查詢方式
1.遞歸查詢:也就是DNS客戶端送出查詢要後,如果DNS服務器內沒有需要的數據
,則DNS服務知器會代替客戶端向其他的DNS服務順查詢。
2.循環查詢:一般DNS服務器與DNS服務器之間的查詢屬於這種查詢方式。
當第一臺DNS服務器在向第2臺DNS服務器提出查詢要求後,
如果第2臺DNS服務器內沒有所需要的數據,
則它會提供第3臺DNS服務器的IP地址給第1臺
3.反向查詢:可以讓DNS客戶端利用IP地址查詢其主機名稱。
從客戶端到本地DNS服務器是屬於遞歸查詢,而DNS服務器之間就是的交互查詢就是迭代查詢。
1.3 dns的優化方式
本文給於兩個優化方案:
1.TTL,我們的域名可以設置,TTL的重新連接時間,如只有一部主機,可設置長一些。如有多部主機,可設置短一點。
因爲這個時間是解析時間,多部主機時,設置短,當一個主機鏈接時間長,可快速連接另外一部主機。
2.負載均衡
CDN瞭解一下,同個原理。 此優化,比較費錢。
2. http模塊
2.1 http狀態碼
個人覺得快速定位對應的錯誤問題,具體可不詳細記住。
1xx: 協議處理中狀態,還需後續操作
2xx: 成功狀態
3xx: 重定向狀態,資源位置發生變動,需要重新請求
4xx: 請求報文有誤
5xx: 服務器端錯誤
有興趣可看具體:
https://www.cnblogs.com/xflonga/p/9368993.html
2.2 http請求方法
http1.0 只支持GET, POST
http1.1 OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT
簡單的普及一下:
HEAD: 可簡單理解跟get一致,但是無法
OPTIONS: 返回服務器針對特定資源所支持的HTTP請求方法,也可以利用向web服務器發送‘*’的請求來測試服務器的功能性
PUT: 向指定資源位置上傳其最新內容
DELETE: 請求服務器刪除Request-URL所標識的資源
TRACE: 回顯服務器收到的請求,主要用於測試或診斷
CONNECT: HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。
2.3 http跟https的區別
1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443。
4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
關鍵詞:收費,安全,端口,長連接
2.4 http 1.0 http1.1 http2.0的區別與特性
以下具體可以寫一篇文章了,本文列出簡介
http1.0 超文本 傳輸 協議
http1.1 持久連接(長連接)、節約帶寬、HOST域、管道機制、分塊傳輸編碼
http2.0 多路複用、服務器推送、頭信息壓縮、二進制協議等
3.網絡協議
標準的網絡協議有OSI有七層模型,TCP/IP把會話層,表示層,應用層,合併爲應用層。
實際上TCP/IP只有四層結構, 模擬模型爲五層, 即實際'數據鏈路層''跟'物理層'合併。
各個層的作用:
應用層:報文(message),一般指完整的信息,傳輸層實現報文交付,位於應用層的信息分組稱爲報文;
傳輸層:報文段(segment),組成報文的每個分組;
網絡層:分組(packet)是網絡傳輸中的二進制格式單元,數據包(datapacket)
是TCP/IP通信協議傳輸中的數據單位;通過網絡傳輸的數據基本單元,包含一個報頭和數據本身,
其中報頭描述了數據的目的地及其與其他數據之間的關係,可以理解爲數據傳輸的分組
,我們將通過網絡傳輸的基本數據單元稱爲數據報(Datagram);
鏈路層:幀(frame),數據鏈路層的協議數據單元,爲了保證數據的可靠傳輸,把用戶數據封裝成幀;
物理層:PDU(bit),協議數據單元;
各個層次之間的交互:
當瀏覽器輸入鏈接時,首先客戶端進入應用層
1.(應用層階段)主要處理兩個事情。
1)處理報文,如請求參數,請求hash值,請求域名,請求頭等進行將解析。
2)DNS解析。
找多對應的mac地址。(具體可看上述DNS解析)
2.(傳輸層階段)3個重點
1)建立端口到端口的關係
2)TCP/UDP協議(具體文章有單獨介紹)
3)此時會把報文切成N個報文段
3.(網絡層階段)
關鍵詞:ARP協議, IP協議
IP協議:分 ipv4 / ipv6
ARP協議:
簡單來說,就是通過廣播的形式,將'數據包'發送出去。
4.(數據鏈路層)
傳輸層生成的報文段,要轉移給物理層。
關鍵詞:以太網, mac地址
以太網協議:
數據包稱爲 幀,幀由 標頭 和 數據 兩部分組成
5.(物理層階段)
物理手段,網線,光纖,無線 等。跟硬件有關。
4.TCP/UDP的特點
4.1 UDP
1.面向無連接
2.不可靠性
3.高效
UDP 的頭部開銷小,只有八字節,相比 TCP 的至少二十字節要少得多
4.傳輸方式
支持一對多,多對多,多對一的方式,也就是說 UDP 提供了單播,多播,廣播的功能。
4.2 TCP
1.TCP頭部包含:
序列號:Sequence number,這個序號保證了 TCP 傳輸的報文都是有序的,
對端可以通過序號順序的拼接報文
確認序號:cknowledgement Number,
這個序號表示數據接收端期望接收的下一個字節的編號是多少,同時也表示上一個序號的數據已經收到
窗口大小:Window Size,表示還能接收多少字節的數據,用於流量控制
2. 建立連接需要三次握手,斷開連接需要四次握手(SYN/ACK )
3. 滑動窗口解決了數據的丟包、順序不對和流量控制問題
4. 擁塞窗口實現了對流量的控制,保證在全天候環境下最優的傳遞數據
5.瀏覽器的緩存機制
1)Expires
通過判斷髮送時間,判斷資源是否在緩存存在
基於http 1.0, http1.1用cache-contro
屬於強緩存
2)Cache-contro
通過有效期判斷緩存存在
屬於強緩存
3)Last-Modified/If-Modified-Since
web服務器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。
屬於協商緩存
4)Etag/If-None-Match
精確到秒級的協商緩存
屬於協商緩存
6.瀏覽器接受返回數據到html後的解析過程
6.1 過程
1) 首先,根據頂部定義的DTD類型進行對應的解析方式
渲染進程內部是多線程的,網頁的解析將會被交給內部的GUI渲染線程處理
渲染線程中的HTML解釋器,將HTML網頁和資源從字節流解釋轉換成字符流
2) 再通過詞法分析器將字符流解釋成詞
之後經過語法分析器根據詞構建成節點,最後通過這些節點組建一個DOM樹
這個過程中,如果遇到的DOM節點是 JS 代碼,就會調用 JS引擎 對 JS代碼進行解釋執行,
此時由 JS引擎 和 GUI渲染線程 的互斥,GUI渲染線程 就會被掛起,渲染過程停止,
如果 JS 代碼的運行中對DOM樹進行了修改,那麼DOM的構建需要從新開始
3)如果節點需要依賴其他資源,圖片/CSS等,就會調用網絡模塊的資源加載器來加載它們,
它們是異步的,不會阻塞當前DOM樹的構建
4)如果遇到的是 JS 資源URL(沒有標記異步),則需要停止當前DOM的構建,
直到JS 的資源加載並被 JS引擎執行後才繼續構建DOM對於CSS,
CSS解釋器會將CSS文件解釋成內部表示結構,生成CSS規則樹
5)然後合併CSS規則樹和DOM樹,生成 Render渲染樹,也叫呈現樹
6)最後對 Render樹進行佈局和繪製,並將結果通過IO線程傳遞給瀏覽器控制進程進行顯示
6.2 優化(只針對渲染)
1).html加載優化策略
哪些需要同步加載,哪些需要異步加載。首屏要的數據是什麼,優先加載。
2).圖片的優化
評估,壓縮,精靈圖等
3).css優化
壓縮,異步,合併。
4)細節
少用table佈局,儘量少操作dom,dom樹避免太深,class讀取樣式
7. 迴流和重繪
是什麼
當渲染樹節點因爲大小邊距等問題發生改變而需要重建的過程,叫做 迴流 (Reflow)
元素髮生的改變只是影響了元素的一些外觀之類的時候 ( 例如,背景色,邊框顏色,文字顏色等 ),此時只需要應用新樣式繪製這個元素就可以了,稱之爲 重繪 (Repaint)
迴流怎麼引起
1)頁面渲染初始化
2)DOM結構改變,比如刪除了某個節點
3)render樹變化,比如減少了 padding ( 內邊距 )
4)窗口 resize 事件觸發時
5)某些 JS 屬性,引發迴流,很多瀏覽器會對迴流做優化,等到數量足夠時做一次批處理迴流, 但除了 render樹 的直接變化,當獲取一些屬性時,瀏覽器爲了獲得正確的值也會觸發迴流,這樣使得瀏覽器優化無效
如何優化
1)使用 translate 替代 top
2)使用 visibility 替換 display: none ,因爲前者只會引起重繪,後者會引發迴流(改變了佈局)
3)儘量算出結果再去重繪
把 DOM 離線後修改,比如:先把 DOM 給 display:none (有一次 Reflow),然後你修改 100 次,然後再把它顯示出來
4)動畫實現的速度的選擇,動畫速度越快,迴流次數越多,也可以選擇使用 requestAnimationFrame