從 URL 輸入到頁面展現(xiàn)發(fā)生了什么

基本概念

URL(Uniform Resource Location)統(tǒng)一資源定位符 : 俗稱網(wǎng)頁地址, 是因特網(wǎng)上標(biāo)準(zhǔn)的資源地址(Address), 用于定位互聯(lián)網(wǎng)上的資源炕檩。

IP(Internet Protocol) : 網(wǎng)絡(luò)之間互聯(lián)的協(xié)議, 鏈接互聯(lián)網(wǎng)的每一臺設(shè)備都有且只有一個IP地址鹰椒,用來標(biāo)識自己锈津。

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

從URL輸入到頁面展示的過程

1、輸入地址

當(dāng)我們開始在瀏覽器中輸入網(wǎng)址的時候铃绒,瀏覽器其實就已經(jīng)在智能的匹配可能的 URL了鸽照,他會從歷史記錄、書簽等地方颠悬,找到已經(jīng)輸入的字符串可能對應(yīng)的 URL矮燎,然后給出智能提示,讓你可以補(bǔ)全URL地址赔癌。對于 chrome 瀏覽器诞外,他甚至?xí)苯訌木彺嬷邪丫W(wǎng)頁展示出來,就是說灾票,你還沒有按下 enter峡谊,頁面就出來了。

2刊苍、瀏覽器查找域名的ip地址

瀏覽器的第一步是通過訪問的域名找出其IP地址既们,DNS查找過程如下:

  • 查詢?yōu)g覽器本身DNS緩存中是否有域名相關(guān)的信息
  • 查詢本機(jī)的host文件中是否有域名相關(guān)的信息
  • 查詢離本地最近的路由器中DNS的緩存中是否有域名相關(guān)的信息
  • 查詢ISP(互聯(lián)網(wǎng)服務(wù)提供商,例如電信,移動)中的DNS服務(wù)器中是否有目標(biāo)域名的信息
  • 查詢根域名服務(wù)器是否有目標(biāo)域名的信息,如果沒有,則傳至子域名服務(wù)器進(jìn)行查詢, 以此遞推班缰,直到找到了IP地址為止贤壁。
3、瀏覽器向 web 服務(wù)器發(fā)送一個 HTTP 請求

拿到域名對應(yīng)的IP地址之后埠忘,瀏覽器會以一個隨機(jī)端口(1024<端口<65535)向服務(wù)器的WEB程序(常用的有httpd,nginx等)80端口發(fā)起TCP的連接請求脾拆。這個連接請求到達(dá)服務(wù)器端后(這中間通過各種路由設(shè)備馒索,局域網(wǎng)內(nèi)除外),進(jìn)入到網(wǎng)卡名船,然后是進(jìn)入到內(nèi)核的TCP/IP協(xié)議棧(用于識別該連接請求绰上,解封包,一層一層的剝開)渠驼,還有可能要經(jīng)過Netfilter防火墻(屬于內(nèi)核的模塊)的過濾蜈块,最終到達(dá)WEB程序,最終建立了TCP/IP的連接迷扇。

建立了TCP連接之后,發(fā)起一個http請求蜓席。一個典型的 http request header 一般需要包括請求的方法厨内,例如 GET 或者 POST 等雏胃,不常用的還有 PUT 和 DELETE 、HEAD方仿、OPTION以及 TRACE 方法兼丰,一般的瀏覽器只能發(fā)起 GET 或者 POST 請求唆缴。

拓展知識

1)TCP三次握手

第一次握手:客戶端將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個值為seq=J的數(shù)據(jù)包到服務(wù)器面徽,客戶端進(jìn)入SYN_SENT狀態(tài)趟紊,等待服務(wù)端確認(rèn)霎匈;

第二次握手:服務(wù)端收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道客戶端請求建立連接铛嘱,服務(wù)端將標(biāo)志位SYN和ACK都置為1,ack=J+1球匕,隨機(jī)產(chǎn)生一個值seq=K亮曹,并將該數(shù)據(jù)包發(fā)送給客戶端以確認(rèn)連接請求照卦,服務(wù)端進(jìn)入SYN_RCVD狀態(tài)役耕。

第三次握手:客戶端收到確認(rèn)后趟卸,檢查ack是否為J+1锄列,ACK是否為1邻邮,如果正確則將標(biāo)志位ACK置為1,ack=K+1丹泉,并將該數(shù)據(jù)包發(fā)送給服務(wù)端摹恨,服務(wù)端檢查ack是否為K+1晒哄,ACK是否為1肪获,如果正確則連接建立成功较木,客戶端和服務(wù)端進(jìn)入ESTABLISHED狀態(tài)青柄,完成三次握手,隨后客戶端與服務(wù)端之間可以開始傳輸數(shù)據(jù)了泳赋。

2)為什需要三次握手祖今?

《計算機(jī)網(wǎng)絡(luò)》第四版中講“三次握手”的目的是“為了防止已失效的連接請求報文段突然又傳送到了服務(wù)端,因而產(chǎn)生錯誤”耍目。

書中的例子是這樣的邪驮,“已失效的連接請求報文段”的產(chǎn)生在這樣一種情況下:client發(fā)出的第一個連接請求報文段并沒有丟失毅访,而是在某個網(wǎng)絡(luò)結(jié)點長時間的滯留了喻粹,以致延誤到連接釋放以后的某個時間才到達(dá)server草巡。本來這是一個早已失效的報文段查乒。但server收到此失效的連接請求報文段后玛迄,就誤認(rèn)為是client再次發(fā)出的一個新的連接請求棚亩。于是就向client發(fā)出確認(rèn)報文段,同意建立連接嘹屯。

假設(shè)不采用“三次握手”州弟,那么只要server發(fā)出確認(rèn),新的連接就建立了掏婶。由于現(xiàn)在client并沒有發(fā)出建立連接的請求雄妥,因此不會理睬server的確認(rèn)老厌,也不會向server發(fā)送數(shù)據(jù)枝秤。但server卻以為新的運輸連接已經(jīng)建立淀弹,并一直等待client發(fā)來數(shù)據(jù)薇溃。這樣,server的很多資源就白白浪費掉了干奢。采用“三次握手”的辦法可以防止上述現(xiàn)象發(fā)生痊焊。例如剛才那種情況,client不會向server的確認(rèn)發(fā)出確認(rèn)忿峻。server由于收不到確認(rèn)薄啥,就知道client并沒有要求建立連接」渖校”垄惧。主要目的防止server端一直等待,浪費資源绰寞。

3)TCP四次揮手

第一次揮手:Client發(fā)送一個FIN到逊,用來關(guān)閉Client到Server的數(shù)據(jù)傳送,Client進(jìn)入FIN_WAIT_1狀態(tài)滤钱。

第二次揮手:Server收到FIN后件缸,發(fā)送一個ACK給Client已艰,確認(rèn)序號為收到序號+1(與SYN相同涩笤,一個FIN占用一個序號)锰茉,Server進(jìn)入CLOSE_WAIT狀態(tài)。

第三次揮手:Server發(fā)送一個FIN,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)。

第四次揮手:Client收到FIN后腾务,Client進(jìn)入TIME_WAIT狀態(tài)启昧,接著發(fā)送一個ACK給Server,確認(rèn)序號為收到序號+1田炭,Server進(jìn)入CLOSED狀態(tài)瞬矩,完成四次揮手惭蹂。

4)為什么建立連接是三次握手,而關(guān)閉連接卻是四次揮手呢航缀?

這是因為服務(wù)端在LISTEN狀態(tài)下皇型,收到建立連接請求的SYN報文后唬格,把ACK和SYN放在一個報文里發(fā)送給客戶端喊积。而關(guān)閉連接時,當(dāng)收到對方的FIN報文時奢方,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對方了擒权,所以己方可以立即close袱巨,也可以發(fā)送一些數(shù)據(jù)給對方后愉老,再發(fā)送FIN報文給對方來表示同意現(xiàn)在關(guān)閉連接咒林,因此欢瞪,己方ACK和FIN一般都會分開發(fā)送。

4贫贝、服務(wù)器的永久重定向響應(yīng)

服務(wù)器給瀏覽器響應(yīng)一個301永久重定向響應(yīng)狰贯,這樣瀏覽器就會訪問“http://www.facebook.com/” 而非"http://facebook.com/" 。

為什么服務(wù)器一定要重定向而不是直接發(fā)會用戶想看的網(wǎng)頁內(nèi)容呢赏廓?

其中一個原因跟搜索引擎排名有 關(guān)涵紊。你看,如果一個頁面有兩個地址幔摸,就像"http://www.igoro.com/" 和"http://igoro.com/"摸柄, 搜索引擎會認(rèn)為它們是兩個網(wǎng)站,結(jié)果造成每一個的搜索鏈接都減少從而降低排名既忆。而搜索引擎知道301永久重定向是 什么意思驱负,這樣就會把訪問帶www的和不帶www的地址歸到同一個網(wǎng)站排名下。

還有一個是用不同的地址會造成緩存友好性變差患雇。當(dāng)一個頁面有好幾個名字時跃脊,它可能會在緩存里出現(xiàn)好幾次。

5苛吱、瀏覽器跟蹤重定向地址

現(xiàn)在酪术,瀏覽器知道了“http://www.facebook.com/” 才是要訪問的正確地址,所以它會發(fā)送另一個獲取請求翠储。

6绘雁、服務(wù)器處理請求

web server接受用戶的請求,并返回代碼彰亥。web server 擔(dān)任管控的角色咧七,對于不同用戶發(fā)送的請求,會結(jié)合配置文件任斋,把不同請求委托給服務(wù)器上處理對應(yīng)請求的程序進(jìn)行處理(例如CGI腳本继阻,JSP腳本耻涛,servlets,ASP腳本瘟檩,服務(wù)器端JavaScript抹缕,或者一些其它的服務(wù)器端技術(shù)等)。

7墨辛、服務(wù)器返回一個 HTTP 響應(yīng)

經(jīng)過前面6個步驟卓研,服務(wù)器收到了我們的請求,也處理了我們的請求睹簇,到這一步奏赘,它會把它的處理結(jié)果返回,也就是返回一個HTTP響應(yīng)太惠。

8磨淌、瀏覽器顯示 HTML

在瀏覽器沒有完整接受全部HTML文檔時,它就已經(jīng)開始顯示頁面了凿渊,瀏覽器是如何把頁面呈現(xiàn)在屏幕上的呢梁只?就是瀏覽器解析的一個過程,
對應(yīng)就是html頁面加載埃脏、解析搪锣、渲染的工作。

  1. 加載
    瀏覽器對一個html頁面的加載順序是從上而下的彩掐,并在加載過程并行進(jìn)行解析渲染處理构舟。在這個過程中遇到link標(biāo)簽、image標(biāo)簽佩谷、script標(biāo)簽時旁壮,瀏覽器會再次向服務(wù)器發(fā)送請求獲取css文件、圖片資源谐檀、js文件抡谐,并執(zhí)行js代碼,同步進(jìn)行加載解析桐猬。
  2. 解析麦撵、渲染
    解析的過程,其實就是生成解析樹溃肪,即dom樹免胃。dom樹是由dom元素及屬性節(jié)點組成,加上css解析的樣式對象和js解析后的動作實現(xiàn)惫撰。而渲染羔沙,就是將DOM樹進(jìn)行可視化表示。
  3. 繪制網(wǎng)頁
    瀏覽器通過上面步驟計算得到渲染樹厨钻,是DOM樹的可視化表示扼雏,構(gòu)建渲染樹使頁面以正確的順序繪制出來坚嗜,遵循一定的渲染規(guī)則,經(jīng)過一系列的渲染工作诗充,實現(xiàn)網(wǎng)站頁面的繪制苍蔬,由此最終完成了頁面展示。
9蝴蜓、瀏覽器發(fā)送請求獲取嵌入在 HTML 中的資源(如圖片碟绑、音頻、視頻茎匠、CSS格仲、JS等等)

其實這個步驟可以并列在步驟8中,在瀏覽器顯示HTML時诵冒,它會注意到需要獲取其他地址內(nèi)容的標(biāo)簽抓狭。這時,瀏覽器會發(fā)送一個獲取請求來重新獲得這些文件造烁。比如我要獲取外圖片,CSS午笛,JS文件等惭蟋,類似于下面的鏈接:

圖片:http://static.ak.fbcdn.net/rsrc.php/z12E0/hash/8q2anwu7.gif
CSS式樣表:http://static.ak.fbcdn.net/rsrc.php/z448Z/hash/2plh8s4n.css
JavaScript 文件:http://static.ak.fbcdn.net/rsrc.php/zEMOA/hash/c8yzb6ub.js

這些地址都要經(jīng)歷一個和HTML讀取類似的過程。所以瀏覽器會在DNS中查找這些域名药磺,發(fā)送請求告组,重定向等等...

不像動態(tài)頁面,靜態(tài)文件會允許瀏覽器對其進(jìn)行緩存癌佩。有的文件可能會不需要與服務(wù)器通訊木缝,而從緩存中直接讀取。服務(wù)器的響應(yīng)中包含了靜態(tài)文件保存的期限 信息围辙,所以瀏覽器知道要把它們緩存多長時間我碟。還有,每個響應(yīng)都可能包含像版本號一樣工作的ETag頭(被請求變量的實體值)姚建,如果瀏覽器觀察到文件的版本 ETag信息已經(jīng)存在矫俺,就馬上停止這個文件的傳輸。

參考資料

http://www.cnblogs.com/xianyulaodi/p/6547807.html
http://blog.csdn.net/wdzxl198/article/details/11265475
http://www.cnblogs.com/wenanry/archive/2010/02/25/1673368.html
http://www.cnblogs.com/zhaobw/p/6580241.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掸冤,一起剝皮案震驚了整個濱河市厘托,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稿湿,老刑警劉巖铅匹,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異饺藤,居然都是意外死亡包斑,警方通過查閱死者的電腦和手機(jī)流礁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舰始,“玉大人崇棠,你說我怎么就攤上這事⊥杈恚” “怎么了枕稀?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谜嫉。 經(jīng)常有香客問我萎坷,道長,這世上最難降的妖魔是什么沐兰? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任哆档,我火速辦了婚禮,結(jié)果婚禮上住闯,老公的妹妹穿的比我還像新娘瓜浸。我一直安慰自己,他們只是感情好比原,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布插佛。 她就那樣靜靜地躺著,像睡著了一般量窘。 火紅的嫁衣襯著肌膚如雪雇寇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天蚌铜,我揣著相機(jī)與錄音锨侯,去河邊找鬼。 笑死冬殃,一個胖子當(dāng)著我的面吹牛囚痴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播造壮,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渡讼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耳璧?” 一聲冷哼從身側(cè)響起成箫,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旨枯,沒想到半個月后蹬昌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡攀隔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年皂贩,在試婚紗的時候發(fā)現(xiàn)自己被綠了栖榨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡明刷,死狀恐怖婴栽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辈末,我是刑警寧澤愚争,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挤聘,受9級特大地震影響轰枝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜组去,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一鞍陨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧从隆,春花似錦诚撵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艾杏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盅藻,已是汗流浹背购桑。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留氏淑,地道東北人勃蜘。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像假残,于是被迫代替她去往敵國和親缭贡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容