當我們在瀏覽器的地址欄中輸入一個URL:www.baidu.com,具體發(fā)生了什么?
1.對網(wǎng)址進行DNS域名解析,得到對應的ip地址;
2.根據(jù)這個ip,找到對應的服務器,建立TCP連接(三次握手);
(TCP是比http更底層的傳輸層協(xié)議)
3.TCP連接之后,發(fā)起http請求;
4.http響應返回回來html代碼,瀏覽器接收到html代碼;
5.瀏覽器解析html代碼,并請求html代碼中的一些資源(js文件、圖片、css文件等)
6.瀏覽器渲染html;
7.服務器關閉連接? tcp、http連接
DNS如何解析域名?
瀏覽器自身的域名緩存查找,沒找到就到操作系統(tǒng)的域名緩存查找,沒找到就到hosts緩存查找(自己可以更改映射),沒找到就去域名服務器查找。
瀏覽器如何解析html代碼,請求代碼中的資源,渲染至頁面?
例如:下載index.html文件=》瀏覽器解析html,同時下載js,css,圖片等文件=》html生成DOM樹,css生成CSSOM樹=》合成render樹=》計算元素的位置、尺寸等(這是一次回流)=》根據(jù)位置、尺寸等信息,進行一次繪制(重繪),進行display屬性,渲染完頁面
因為js是單線程的,執(zhí)行代碼是從上至下的,瀏覽器的解析是異步的,可以一邊解析html代碼,一邊請求js文件,但是如果遇到了js文件,則會將解析暫時掛起,因為js代碼中可能會存在對dom的操作,可能會引起重繪和回流。