瀏覽器輸入url到顯示過程,引發出的N個問題(面試常問問題)(10+知識點,原創)

 當面試官拋出這個問題的時候,你是否信心滿滿的回答:

    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
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章