URL的域名協(xié)議
http :搜索網(wǎng)絡(luò)資源
https :加密網(wǎng)絡(luò)資源
file :本地資源
本地電腦IP
127.0.0.1
上不了網(wǎng),輸入
谷歌:8.8.8.8
國內(nèi):114.114.114.114
從URL輸入到頁面展現(xiàn)步驟
1.輸入地址
2.解析域名-瀏覽器查找域名的IP地址
3.服務(wù)器處理請(qǐng)求
4.服務(wù)器返回一個(gè)HTTP響應(yīng)
5.瀏覽器顯示HTML
6.瀏覽器處理-瀏覽器發(fā)送請(qǐng)求,獲取嵌入HTML中的資源(CSS,JS等)
1.輸入地址
http:// www. baidu.com : 8080 / script/jquery.js
(協(xié)議 -子域名 - 主域名 - 端口號(hào) - 請(qǐng)求資源地址)
2.解析域名-(1)瀏覽器查找域名的IP地址
1.瀏覽器發(fā)出請(qǐng)求后,首先解析名,查看本地硬盤的Hosts文件,是否有相對(duì)應(yīng)的規(guī)則,有就用本地Hosts文件的IP地址。
2.如果本地Hosts文件沒有相對(duì)應(yīng)的IP地址,瀏覽器會(huì)發(fā)出一個(gè) DNS請(qǐng)求到本地DNS服務(wù)器 。
3.本地DNS服務(wù)器會(huì)首先查詢它的緩存記錄,如果緩存中有這記錄,就可以直接返回結(jié)果,此過程是遞歸的方式進(jìn)行查詢。如果沒有,本地DNS服務(wù)器還要向DNS根服務(wù)器進(jìn)行查詢。
4.DNS根服務(wù)器如果沒有,就向域名服務(wù)器發(fā)出請(qǐng)求,這種過程是迭代的過程。。
5.向域名服務(wù)器發(fā)出請(qǐng)求后,這時(shí)就能收到一個(gè)域名和IP地址對(duì)應(yīng)關(guān)系,本地DNS服務(wù)器不僅要把IP地址返回給用戶電腦,還要把這個(gè)對(duì)應(yīng)關(guān)系保存在緩存中,以備下次別的用戶查詢時(shí),可以直接返回結(jié)果,加快網(wǎng)絡(luò)訪問。

DNS
DNS(Domain Name System,域名系統(tǒng)),因特網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫,能夠使用戶更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串。通過主機(jī)名,最終得到該主機(jī)名對(duì)應(yīng)的IP地址的過程叫做域名解析(或主機(jī)名解析)。
遞歸分解圖

迭代分解圖

2.解析域名-(2)瀏覽器向 web 服務(wù)器發(fā)送一個(gè) HTTP 請(qǐng)求
瀏覽器向 web 服務(wù)器發(fā)送一個(gè) HTTP 請(qǐng)求,瀏覽器會(huì)以8080端口發(fā)起TCP的連接請(qǐng)求。等連接到達(dá)服務(wù)器端口后,進(jìn)入到網(wǎng)卡,然后是進(jìn)入到內(nèi)核的TCP/IP協(xié)議棧,經(jīng)過防火墻,最終到達(dá)WEB程序,最終建立了TCP/IP的連接。
客戶端向服務(wù)器發(fā)起http請(qǐng)求的時(shí)候,會(huì)有一些請(qǐng)求信息,請(qǐng)求信息包含三個(gè)部分:(1)請(qǐng)求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1
(2)請(qǐng)求頭(Request Header)
請(qǐng)求頭包含許多有關(guān)的客戶端環(huán)境和請(qǐng)求正文的有用信息。例如,請(qǐng)求頭可以聲明瀏覽器所用的語言,請(qǐng)求正文的長度等。
(3)請(qǐng)求正文
請(qǐng)求頭和請(qǐng)求正文之間是一個(gè)空行,這個(gè)行非常重要,它表示請(qǐng)求頭已經(jīng)結(jié)束,接下來的是請(qǐng)求正文
4.服務(wù)器返回一個(gè)HTTP響應(yīng)
經(jīng)過前面的步驟,服務(wù)器收到了我們的請(qǐng)求,也處理我們的請(qǐng)求,到這一步,它會(huì)把它的處理結(jié)果返回,也就是返回一個(gè)HTPP響應(yīng)。
HTTP響應(yīng)與HTTP請(qǐng)求相似,HTTP響應(yīng)也由3個(gè)部分構(gòu)成,分別是:(1).狀態(tài)行:
狀態(tài)行由協(xié)議版本、數(shù)字形式的狀態(tài)代碼、及相應(yīng)的狀態(tài)描述,各元素之間以空格分隔。
格式: HTTP-Version Status-Code Reason-Phrase CRLF
(2).響應(yīng)頭:
響應(yīng)頭部:由關(guān)鍵字/值對(duì)組成,每行一對(duì),關(guān)鍵字和值用英文冒號(hào)":"分隔
(3).響應(yīng)正文和響應(yīng)頭之間有一行空格,表示響應(yīng)頭的信息到空格為止
5.瀏覽器顯示HTML
解析html以構(gòu)建dom樹 -> 構(gòu)建render樹 -> 布局render樹 -> 繪制render樹
瀏覽器在解析html文件時(shí),會(huì)”自上而下“加載,并在加載過程中進(jìn)行解析渲染。在解析過程中,如果遇到請(qǐng)求外部資源時(shí),如圖片、外鏈的CSS、iconfont等,請(qǐng)求過程是異步的,并不會(huì)影響html文檔進(jìn)行加載。
解析過程中,瀏覽器首先會(huì)解析HTML文件構(gòu)建DOM樹,然后解析CSS文件構(gòu)建渲染樹,等到渲染樹構(gòu)建完成后,瀏覽器開始布局渲染樹并將其繪制到屏幕上。這個(gè)過程比較復(fù)雜,涉及到兩個(gè)概念: reflow(回流)和repain(重繪)。
DOM節(jié)點(diǎn)中的各個(gè)元素都是以盒模型的形式存在,這些都需要瀏覽器去計(jì)算其位置和大小等,這個(gè)過程稱為relow;當(dāng)盒模型的位置,大小以及其他屬性,如顏色,字體,等確定下來之后,瀏覽器便開始繪制內(nèi)容,這個(gè)過程稱為repain。
頁面在首次加載時(shí)必然會(huì)經(jīng)歷reflow和repain。reflow和repain過程是非常消耗性能的,尤其是在移動(dòng)設(shè)備上,它會(huì)破壞用戶體驗(yàn),有時(shí)會(huì)造成頁面卡頓。所以我們應(yīng)該盡可能少的減少reflow和repain。
瀏覽器處理過程.png
6.瀏覽器處理
當(dāng)文檔加載過程中遇到j(luò)s文件,html文檔會(huì)掛起渲染(加載解析渲染同步)的線程,不僅要等待文檔中js文件加載完畢,還要等待解析執(zhí)行完畢,才可以恢復(fù)html文檔的渲染線程。因?yàn)镴S有可能會(huì)修改DOM,最為經(jīng)典的document.write,這意味著,在JS執(zhí)行完成前,后續(xù)所有資源的下載可能是沒有必要的,這是js阻塞后續(xù)資源下載的根本原因。所以我明平時(shí)的代碼中,js是放在html文檔末尾的。
JS的解析是由瀏覽器中的JS解析引擎完成的,比如谷歌的是V8。JS是單線程運(yùn)行,也就是說,在同一個(gè)時(shí)間內(nèi)只能做一件事,所有的任務(wù)都需要排隊(duì),前一個(gè)任務(wù)結(jié)束,后一個(gè)任務(wù)才能開始。但是又存在某些任務(wù)比較耗時(shí),如IO讀寫等,所以需要一種機(jī)制可以先執(zhí)行排在后面的任務(wù),這就是:同步任務(wù)(synchronous)和異步任務(wù)(asynchronous)。
JS的執(zhí)行機(jī)制就可以看做是一個(gè)主線程加上一個(gè)任務(wù)隊(duì)列(task queue)。同步任務(wù)就是放在主線程上執(zhí)行的任務(wù),異步任務(wù)是放在任務(wù)隊(duì)列中的任務(wù)。所有的同步任務(wù)在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧;異步任務(wù)有了運(yùn)行結(jié)果就會(huì)在任務(wù)隊(duì)列中放置一個(gè)事件;腳本運(yùn)行時(shí)先依次運(yùn)行執(zhí)行棧,然后會(huì)從任務(wù)隊(duì)列里提取事件,運(yùn)行任務(wù)隊(duì)列中的任務(wù),這個(gè)過程是不斷重復(fù)的,所以又叫做事件循環(huán)(Event loop)。
還有第三次握手協(xié)議,下次學(xué)完更新。
