瀏覽器地址欄裏輸入URL後的全過程

什麼是URL

URL統一資源定位符(Uniform Resource Locator),是資源標識最多見的形式。URL描述了一臺特定服務器上某資源的特定位置。它們能夠明確說明如何從一個精確、固定的位置獲取資源。瀏覽器

URL說明了協議、服務器和本地資源。緩存

而瀏覽器都是基於HTTP協議,而HTTP是個應用層的協議。HTTP無需操心網絡通訊的具體細節都交給了TCP/IP
TCP:性能優化

  • 無差錯的數據傳輸。
  • 按序傳輸(數據老是按照發送的順序到達)。
  • 未分段的數據流(能夠在任意時刻將數據發送出去)。

HTTP協議位於TCP的上層。HTTP使用TCP來傳輸其報文數據。服務器

HTTP

解析URL

當用戶輸入一個完整的URL以後,瀏覽器就開始解析URL的構成,以便於查找資源地址,大多數URL的語法通用格式以下:網絡

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
複製代碼

基本上沒有哪一個URL包含了全部這些組件。URL最重要的3個部分是方案scheme,主機host和路徑path
若是URL中不包含port,瀏覽器會默認使用80端口進行訪問。post

DNS域名解析

什麼是DNS?

DNS( Domain Name System)是「域名系統」的英文縮寫,DNS是應用層協議,事實上他是爲其餘應用層協議工做的,包括不限於HTTP和SMTP以及FTP,用於將用戶提供的主機名解析爲ip地址。性能

DNS 查詢的過程以下圖所示。 優化

  • 在瀏覽器中輸入www.qq.com 域名,操做系統會先檢查本身本地的hosts文件是否有這個網址映射關係,若是有,就先調用這個IP地址映射,完成域名解析。spa

  • 若是hosts裏沒有這個域名的映射,則查找本地DNS解析器緩存,是否有這個網址映射關係,若是有,直接返回,完成域名解析。操作系統

  • 若是hosts與本地DNS解析器緩存都沒有相應的網址映射關係,首先會找TCP/ip參數中設置的首選DNS服務器,在此咱們叫它本地DNS服務器,此服務器收到查詢時,若是要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具備權威性。

  • 若是要查詢的域名,不禁本地DNS服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個IP地址映射,完成域名解析,此解析不具備權威性。

  • 若是本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,若是未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS服務器收到請求後會判斷這個域名(.com)是誰來受權管理,並會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息後,將會聯繫負責.com域的這臺服務器。這臺負責.com域的服務器收到請求後,若是本身沒法解析,它就會找一個管理.com域的下一級DNS服務器地址(http://qq.com)給本地DNS服務器。當本地DNS服務器收到這個地址後,就會找http://qq.com域服務器,重複上面的動做,進行查詢,直至找到www.qq.com主機。

  • 若是用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器若是不能解析,或找根DNS或把轉請求轉至上上級,以此循環。不論是本地DNS服務器用是是轉發,仍是根提示,最後都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。

從客戶端到本地DNS服務器是屬於遞歸查詢,而DNS服務器之間就是的交互查詢就是迭代查詢。

創建TCP鏈接

TCP根據不一樣的當前狀態(常規或加星)所發送的內容:

常規狀態 說 明 發 送 加 星 狀 態 發 送
CLOSED 關閉 RST, ACK
LISTEN 監聽鏈接請求(被動打開)
SYN_SENT 已發出SYN (主動打開) SYN SYN_SENT* SYN, FIN
SYN_RCVD 已經發出和收到SYN;等待ACK SYN, ACK SYN_RCVD* SYN, FIN, ACK
ESTABLISHED 鏈接已經創建(數據傳輸) ACK ESTABLISHED* SYN, ACK
CLOSE_WAIT 收到FIN,等待應用程序關閉 ACK CLOSE_WAIT* SYN, FIN
FIN_WAIT_1 已經關閉,發出FIN;等待ACK和FIN FIN, ACK FIN_WAIT_1 SYN, FIN, ACK
CLOSING 兩端同時關閉;等待ACK FIN, ACK CLOSING* SYN, FIN, ACK
LAST_ACK 收到FIN已經關閉;等待ACK FIN, ACK LAST_ACK* SYN, FIN, ACK
FIN_WAIT_2 已經關閉;等待FIN ACK
TIME_WAIT 主動關閉後長達2 M S L的等待狀態 ACK

TCP中定義了7個擴展狀態,這些擴展狀態都稱爲加星狀態。它們分別是:SYN_SENT*SYN_RCVD*ESTABLISHED *CLOSE_WAIT *LAST_ACK *FIN_WAIT_1 *CLOSING *

TCP輸入的處理順序

TCP協議收到報文段時,對其中所攜帶的各類控制信息 ( SYNFINACKURGRST 標誌,還可能有數據和選項 )的處理順序不是隨意的,也不是各類實現能夠自行決定的。

CLOSED狀態到SYN_SENT狀態的變遷就標明發送了一個SYN報文段。在圖中則沒有采用這種標記方法,而是在每一個狀態框中標出處於該狀態時要發送的報文段類型。例如,當處於SYN_RECV狀態時,要發出一個帶有 SYN 的報文段,其中還包括對所收到SYN的確認( ACK )。而當處於CLOSE_WAIT狀態時,要發出 對所收到FIN的確認( ACK )。

咱們之因此要這樣作是由於,在TCP協議中咱們常常須要處理可能形成屢次狀態變遷的 報文段。因而在處理一個報文段時,重要的是處理完報文段後鏈接所處的最終狀態,由於它決定了應答的內容。而若是不使用TCP協議,每收到一個報文段一般至多隻引發一次狀態 變遷,只有在收到SYN/ACK報文段時纔是例外。

三次握手

客戶端和服務器之間創建鏈接須要通過三次確認的階段,咱們稱之爲TCP的三次握手。

第一次

客戶端發送一個syn報文,設置發送序號爲X,客戶端進入SYN_SENT狀態,等待服務器迴應。

第二次

服務端收到syn報文,可是服務端必須肯定客戶端的syn(ack= X + 1), 所以服務端也要發送一個syn=Y給客戶端進行確認,表示服務端已經收到客戶端的請求。
服務端須要發送ack+syn給客戶端,此時服務器進入SYN_RECV狀態。

第三次

客戶端收到服務器的syn+ack包,向服務器發送確認包ack(ack=Y+1),此包發送完畢,客戶端和服務器進入ESTABLISHEDTCP鏈接成功)狀態,完成三次握手。

舉個例子

好比你走在路上,發現前面有你的朋友向你走過來,你向你朋友揮手(第一次握手)。

你朋友看見了你向他打招呼,可是你朋友由於距離你太遠,並不肯定是不是跟他打招呼的,所以,你朋友用手指了下本身,並向你示意(第二次握手)。

你看見了你朋友的表情和動做,你須要給你朋友一個確定,此時,你點頭示意(第三次握手)。

此時你和你朋友互相聊天(TCP已鏈接)。

四次揮手

因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。

這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。

首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。

  • TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送。
  • 服務器收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。
  • 服務器關閉客戶端的鏈接,發送一個FIN給客戶端。
  • 客戶端發回ACK報文確認,並將確認序號設置爲收到序號加1。

揮手例子

你和你朋友聊天,聊着聊着,忽然想起來女友鑰匙丟了,你是回家開門的,如今耽誤了半小時了,嚇得冷汗都出來了,一想起榴蓮。。。

這個時候,你趕忙跟你朋友說了狀況,你說你立刻得回去了,下次再聊(第一次揮手)。

你朋友聽了,以爲也是得趕忙回去,就跟你說你趕忙回去吧。(第二次揮手)。

而後,你朋友走了,並向你揮手作別(第三次揮手)。

你看見你朋友跟你作別,你一樣也跟你朋友作別(第四次揮手)。

回去以後,你就須要玩玩你的榴蓮了。

頁面渲染

查看下篇文章 瀏覽器渲染原理(性能優化之如何減小重排和重繪)

最後

參考文章:

一、HTTP權威指南。

二、DNS原理及其解析過程【精彩剖析】

三、TCP-IP詳解卷

相關文章
相關標籤/搜索