這是HTTP網(wǎng)絡(luò)系列的第一篇文章,。 計算機與網(wǎng)絡(luò)設(shè)備要相互通信,,必須要遵循一定的規(guī)則,我們把這種規(guī)則稱為協(xié)議,。協(xié)議會規(guī)定好誰先發(fā)起請求,,怎么尋找服務(wù)器地址,怎么獲取請求內(nèi)容,,怎么響應(yīng)請求等等,。 與互聯(lián)網(wǎng)相關(guān)的協(xié)議集合統(tǒng)稱為TCP/IP。而HTTP協(xié)議只是TCP/IP協(xié)議的一部分,。下面只會講到與HTTP相關(guān)的內(nèi)容。 大致流程 1,、URL解析 2,、DNS解析 3、HTTP連接 4,、服務(wù)器處理請求 5,、瀏覽器接受響應(yīng) 6、瀏覽器渲染頁面 01 URL解析 ●假設(shè)我們在瀏覽器輸入URL:http://www./index.html?b=1 首先瀏覽器會判斷你輸入的地址是合法的URL還是待搜索的關(guān)鍵詞,,如果是合法的URL,,則會解析出域名:www.,然后進入下一步,。 02 DNS解析 ● 在瀏覽器輸入的只是服務(wù)器域名,,ip地址才是目標(biāo)服務(wù)器的真實地址,所以為了尋址,,要先經(jīng)過DNS解析,,把域名轉(zhuǎn)化成IP地址。 03 HTTP連接 ● 解析好ip地址后,,瀏覽器會發(fā)起一條HTTP請求,,和目標(biāo)服務(wù)器建立一條連接來通信。 ● 服務(wù)器會對連接請求做出響應(yīng),,表示同意建立連接,。 04 服務(wù)器處理請求 ● 服務(wù)器根據(jù)http協(xié)議規(guī)定,從請求報文里面拿到請求的子路徑: /index.html?b=1,。如果請求的文件是真實存在的,,比如html、css,、js,、圖片等,,則直接把文件返回。否則就要走到后臺代碼的匹配路由上面,。 ● 如果走的是后臺代碼的匹配路由,,則會執(zhí)行后臺相應(yīng)的邏輯,如果邏輯里面有查詢數(shù)據(jù)庫的請求,,則會向數(shù)據(jù)庫服務(wù)器發(fā)起一條查詢數(shù)據(jù)的請求,,等待數(shù)據(jù)庫的數(shù)據(jù)返回后,最后才把數(shù)據(jù)返回給前端,。 ● 數(shù)據(jù)準(zhǔn)備好后,,服務(wù)器開始構(gòu)建響應(yīng),創(chuàng)建一條http響應(yīng)報文,,把資源信息放到響應(yīng)體里面開始返回,。 05 瀏覽器接受響應(yīng) ● http請求響應(yīng),都有一個狀態(tài)碼返回,,用來標(biāo)記這次返回的狀態(tài),。一般有以下幾種狀態(tài)碼: 200:表示成功 302:表示重定向 404:表示找不到資源 405:表示瀏覽器請求類型錯誤(比如把get請求當(dāng)作post請求來用) 500:表示服務(wù)器內(nèi)部錯誤 502:網(wǎng)關(guān)錯誤 504:timeout,表示服務(wù)器在規(guī)定時間內(nèi)沒有返回資源 瀏覽器會根據(jù)狀態(tài)碼,,做出相應(yīng)的動作,,遇到200會接受正常返回信息,開始渲染頁面,。遇到302,,則會根據(jù)http響應(yīng)頭的location字段,再次發(fā)起一次地址是location的網(wǎng)絡(luò)請求,,遇到4開頭和5開頭的錯誤,,則不會正常渲染,會提示相應(yīng)的錯誤,。 06 瀏覽器渲染頁面 不同的瀏覽器,,渲染過程也不完全相同,但是大概流程是一樣的,。 一個web前端網(wǎng)頁大概由三部分構(gòu)成,,html組成了這個網(wǎng)頁的結(jié)構(gòu),比如按鈕,,下拉框,,表格。css展示了網(wǎng)頁的樣式,,比如背景,,字體顏色大小。javascript負責(zé)執(zhí)行前端的一些事件,比如點擊事件,、懸浮事件,,還有跟后臺的交互。 1,、HTML解析 瀏覽器拿到html網(wǎng)頁后,,會利用html解析規(guī)則,一行一行地往下解析,,然后構(gòu)建成一棵DOM節(jié)點的樹,。HTML解析完成后,瀏覽器會通知DOM解析完成,。但是如果在解析html的過程中,,遇到了js代碼,會暫停解析,,等執(zhí)行完了js代碼才繼續(xù)往下解析,。 2、CSS解析 解析完html后,,開始解析css代碼,,也會構(gòu)建出一棵css的規(guī)則樹,然后把html和css結(jié)合起來,,開始渲染頁面,我們就可以看到眼前的網(wǎng)頁啦,。 3,、javascript解析執(zhí)行 如果有js代碼,則會根據(jù)js的語法進行語法解析,,按順序執(zhí)行js代碼,。 |
|