從輸入域名到瀏覽器展現(xiàn)段化,整個(gè)過(guò)程發(fā)生了什么嘁捷?
本文語(yǔ)法參考
- Markdown - 官網(wǎng)地址:
http://markdown.cn/#paragraphs-and-line-breaks
本文參考資料 :
- https://www.html5rocks.com/en/tutorials/internals/howbrowserswork
- 網(wǎng)絡(luò)各大技術(shù)博客,論壇 - - -
過(guò)程簡(jiǎn)單概括為
1.輸入域名
2.域名解析
3.服務(wù)器處理
4.網(wǎng)站處理
5.瀏覽器處理
6.繪制網(wǎng)頁(yè)
詳細(xì)過(guò)程
1.輸入域名
我們平時(shí)輸入的域名只是為了方便記憶而誕生的一個(gè)URL的"代名詞"显熏,實(shí)際URL比域名的范圍要大一些雄嚣,那么URL是什么呢?他是統(tǒng)一資源的定位符喘蟆,用于定位互聯(lián)網(wǎng)上的資源现诀,URL是Uniform Resource Location的縮寫(xiě),譯為“統(tǒng)一資源定位符”履肃。通俗地說(shuō)仔沿,URL是Internet上用來(lái)描述信息資源的字符串,主要用在各種WWW客戶程序和服務(wù)器程序上尺棋,特別是著名的Mosaic封锉。采用URL可以用一種統(tǒng)一的格式來(lái)描述各種信息資源绵跷,包括文件、服務(wù)器的地址和目錄等成福。 URL的格式URL的格式由下列三部分組成: - 第一部分: 協(xié)議(或稱為服務(wù)方式)碾局; - 第二部分: 存有該資源的主機(jī)IP地址(有時(shí)也包括端口號(hào),為了方便記憶常用域名代替IP地址)奴艾; - 第三部分: 主機(jī)資源的具體地址净当。如目錄和文件名等。 第一部分和第二部分之間用“://”符號(hào)隔開(kāi)蕴潦,第二部分和第三部分用“/”符號(hào)隔開(kāi)像啼。第一部分和第二部分是不可缺少的,第三部分有時(shí)可以省略潭苞。 例如:輸入 http://www.baidu.com,其中http就是協(xié)議忽冻,這個(gè)協(xié)議還可以是、http、https、ftp某饰、file協(xié)議等等,baidu.com是域名湖笨。那么端口號(hào)又去哪了呢?因?yàn)閔ttp協(xié)議默認(rèn)的端口號(hào)是80蹦骑。也就是說(shuō)我們輸入的實(shí)際是http://www.baidu.com:80赶么,但由于默認(rèn)的關(guān)系,輸入http://www.baidu.com:80和http://www.baidu.com是一樣的脊串。然后我們由百度引擎繼續(xù)搜索一個(gè)問(wèn)題辫呻,這是在域名的后面會(huì)以/xxx的形式給出一個(gè)網(wǎng)址,這個(gè)”/“后面的就是資源路徑琼锋,就是你需要找的資源的具體路徑放闺。
2.域名解析
輸入域名后,DNS(域名系統(tǒng))把域名解析成IP地址缕坎,首先怖侦,瀏覽器會(huì)查找瀏覽器緩存,如果沒(méi)有找到就會(huì)從系統(tǒng)緩存Hosts文件中查找是否有該域名和對(duì)應(yīng)IP谜叹,系統(tǒng)中hosts沒(méi)有的話匾寝,就繼續(xù)往上的路由器緩存中找,如果還是沒(méi)有荷腊,就再上一級(jí)艳悔,在ISP DNS(本地名稱服務(wù)器緩存)中找。如果本地名稱服務(wù)器都找不到女仰,則會(huì)繼續(xù)往上查找直到從根域名服務(wù)器找到對(duì)應(yīng)IP猜年。 DNS服務(wù)器 [圖片上傳失敗...(image-42d516-1539498778562)] DNS解析過(guò)程
3.服務(wù)器處理
當(dāng)客戶端的 HTTP 請(qǐng)求準(zhǔn)備好后乔外,瀏覽器會(huì)在傳輸層發(fā)起一條到達(dá)服務(wù)器的 TCP 連接床三,位于傳輸層的TCP協(xié)議為傳輸報(bào)文提供可靠的字節(jié)流服務(wù)。它為了方便傳輸杨幼,將大塊的數(shù)據(jù)分割成以報(bào)文段為單位的數(shù)據(jù)包進(jìn)行管理撇簿,并為它們編號(hào),方便服務(wù)器接收時(shí)能準(zhǔn)確地還原報(bào)文信息差购。TCP協(xié)議通過(guò)“三次握手”等方法保證傳輸?shù)陌踩煽克奶薄!叭挝帐帧钡倪^(guò)程是歹撒,發(fā)送端先發(fā)送一個(gè)帶有SYN(synchronize)標(biāo)志的數(shù)據(jù)包給接收端莲组,在一定的延遲時(shí)間內(nèi)等待接收的回復(fù)诊胞。接收端收到數(shù)據(jù)包后暖夭,傳回一個(gè)帶有SYN/ACK標(biāo)志的數(shù)據(jù)包以示傳達(dá)確認(rèn)信息。接收方收到后再發(fā)送一個(gè)帶有ACK標(biāo)志的數(shù)據(jù)包給接收端以示握手成功撵孤。在這個(gè)過(guò)程中迈着,如果發(fā)送端在規(guī)定延遲時(shí)間內(nèi)沒(méi)有收到回復(fù)則默認(rèn)接收方?jīng)]有收到請(qǐng)求,而再次發(fā)送邪码,直到收到回復(fù)為止裕菠。 (引用簡(jiǎn)書(shū) 卐鑫卍 http://www.reibang.com/p/d616d887953a)
1
4.網(wǎng)站處理
服務(wù)接收到客戶端發(fā)送的HTTP請(qǐng)求后,服務(wù)器上的的 http 監(jiān)聽(tīng)進(jìn)程會(huì)得到這個(gè)請(qǐng)求闭专,然后一般情況下會(huì)啟動(dòng)一個(gè)新的子進(jìn)程去處理這個(gè)請(qǐng)求奴潘,同時(shí)父進(jìn)程繼續(xù)監(jiān)聽(tīng)。http 服務(wù)器首先會(huì)查看重寫(xiě)規(guī)則影钉,然后如果請(qǐng)求的文件是真實(shí)存在画髓,例如一些圖片,或 html平委、css奈虾、js 等靜態(tài)文件,則會(huì)直接把這個(gè)文件返回廉赔,如果是一個(gè)動(dòng)態(tài)的請(qǐng)求肉微,那么會(huì)根據(jù) url 重寫(xiě)模塊的規(guī)則,把這個(gè)請(qǐng)求重寫(xiě)到一個(gè) rest 風(fēng)格的 url 上蜡塌,然后根據(jù)動(dòng)態(tài)語(yǔ)言的腳本碉纳,來(lái)決定調(diào)用什么類型的動(dòng)態(tài)文件腳本解釋器來(lái)處理這個(gè)請(qǐng)求。 我們以 php 語(yǔ)言為例來(lái)說(shuō)的話馏艾,請(qǐng)求到達(dá)一個(gè) php 的 mvc 框架之后村象,框架首先應(yīng)該會(huì)初始化一些環(huán)境的參數(shù)笆环,例如遠(yuǎn)端 ip,請(qǐng)求參數(shù)等等厚者,然后根據(jù)請(qǐng)求的 url 送到一個(gè)路由器類里面去匹配路由躁劣,路由由上到下逐條匹配,一旦遇到 url 能夠匹配的上库菲,而且請(qǐng)求的方法也能夠命中的話账忘,那么請(qǐng)求就會(huì)由這個(gè)路由所定義的處理方法去處理。 請(qǐng)求進(jìn)入處理函數(shù)之后熙宇,如果客戶端所請(qǐng)求需要瀏覽的內(nèi)容是一個(gè)動(dòng)態(tài)的內(nèi)容鳖擒,那么處理函數(shù)會(huì)相應(yīng)的從數(shù)據(jù)源里面取出數(shù)據(jù),這個(gè)地方一般會(huì)有一個(gè)緩存烫止,例如 memcached 來(lái)減小 db 的壓力蒋荚,如果引入了 orm 框架的話,那么處理函數(shù)直接向 orm 框架索要數(shù)據(jù)就可以了馆蠕,由 orm 框架來(lái)決定是使用內(nèi)存里面的緩存還是從 db 去取數(shù)據(jù)期升,一般緩存都會(huì)有一個(gè)過(guò)期的時(shí)間,而 orm 框架也會(huì)在取到數(shù)據(jù)回來(lái)之后互躬,把數(shù)據(jù)存一份在內(nèi)存緩存中的播赁。 orm 框架負(fù)責(zé)把面向?qū)ο蟮恼?qǐng)求翻譯成標(biāo)準(zhǔn)的 sql 語(yǔ)句,然后送到后端的 db 去執(zhí)行吼渡,db 這里以 mysql 為例的話容为,那么一條 sql 進(jìn)來(lái)之后,db 本身也是有緩存的寺酪,不過(guò) db 的緩存一般是用 sql 語(yǔ)言 hash 來(lái)存取的坎背,也就是說(shuō),想要緩存能夠命中寄雀,除了查詢的字段和方法要一樣以外得滤,查詢的參數(shù)也要完全一模一樣才能夠使用 db 本身的查詢緩存,sql 經(jīng)過(guò)查詢緩存器咙俩,然后就會(huì)到達(dá)查詢分析器耿戚,在這里,db 會(huì)根據(jù)被搜索的數(shù)據(jù)表的索引建立情況阿趁,和 sql 語(yǔ)言本身的特點(diǎn)膜蛔,來(lái)決定使用哪一個(gè)字段的索引,值得一提的是脖阵,即使一個(gè)數(shù)據(jù)表同時(shí)在多個(gè)字段建立了索引皂股,但是對(duì)于一條 sql 語(yǔ)句來(lái)說(shuō),還是只能使用一個(gè)索引命黔,所以這里就需要分析使用哪個(gè)索引效率最高了呜呐,一般來(lái)說(shuō)就斤,sql 優(yōu)化在這個(gè)點(diǎn)上也是很重要的一個(gè)方面。 sql 由 db 返回結(jié)果集后蘑辑,再由 orm 框架把結(jié)果轉(zhuǎn)換成模型對(duì)象洋机,然后由 orm 框架進(jìn)行一些邏輯處理,把準(zhǔn)備好的數(shù)據(jù)洋魂,送到視圖層的渲染引擎去渲染绷旗,渲染引擎負(fù)責(zé)模板的管理,字段的友好顯示副砍,也包括負(fù)責(zé)一些多國(guó)語(yǔ)言之類的任務(wù)衔肢。對(duì)于一條請(qǐng)求在 mvc 中的生命周期,可以參考這里豁翎,臨摹了一個(gè) PHP MVC 框架角骤,在視圖層把頁(yè)面準(zhǔn)備好后,再?gòu)膭?dòng)態(tài)腳本解釋器送回到 http 服務(wù)器心剥,由 http 服務(wù)器把這些正文加上一個(gè)響應(yīng)頭邦尊,封裝成一個(gè)標(biāo)準(zhǔn)的 http 響應(yīng)包,再通過(guò) tcp ip 協(xié)議刘陶,送回到客戶機(jī)瀏覽器胳赌。 (引用:卐鑫卍 http://www.reibang.com/p/d616d887953a) 簡(jiǎn)單來(lái)說(shuō)這兩步就是服務(wù)器就收指令后牢撼,通過(guò)后臺(tái)處理后返回信息(題主小白匙隔,只能這么理了,后期來(lái)完善)
ku
5.瀏覽器處理
Html字符串被瀏覽器接受后被一句句讀取解析熏版,解析到link標(biāo)簽后重新發(fā)送請(qǐng)求獲取CSS纷责,解析到SCRIPT標(biāo)簽后發(fā)送請(qǐng)求獲取JS,并執(zhí)行代碼撼短,解析到IMG標(biāo)簽后發(fā)送請(qǐng)求獲得圖片資源再膳。 ###6.繪制網(wǎng)頁(yè)### 瀏覽器根據(jù)HTML,CSS計(jì)算得到的渲染樹(shù)曲横,繪制到屏幕上喂柒。 學(xué)到后面再來(lái)補(bǔ)充,看完一些資料才發(fā)現(xiàn)這個(gè)坑真的太大了禾嫉。灾杰。。