瀏覽器輸入url 按下回車發(fā)生了什么

瀏覽器輸入url 按下回車發(fā)生了什么?

耗時的角度分析:


  1. DNS 查詢
  2. TCP 連接
  3. HTTP 請求及響應
  4. 服務器響應
  5. 客戶端渲染

DNS查詢


  • DNS(Domain Name System, 域名系統(tǒng))
  • 是域名和IP地址相互映射的一個分布式數據庫
  • DNS 查詢就是將域名轉換成 IP 的過程
  • DNS Prefetch 瀏覽器會對其IP進行緩存,有效縮短了DNS的解析時間
  • 自動解析: 當遇到a標簽,自動將href中的域名解析為IP地址。但是HTTPS頁面中不會自動解析。
  • 手動解析:
// 希望在HTTPS頁面開啟自動解析功能時
<meta http-equiv="x-dns-prefetch-control" content="on">
// 希望在HTTP頁面關閉自動解析功能時,添加如下標記:
<meta http-equiv="x-dns-prefetch-control" content="off">
// 讓瀏覽器預取"http://XXXX.com"的解析
<link rel="dns-prefetch"  />

TCP 連接


一個TCP連接可以同時發(fā)送幾個HTTP請求?

  • HTTP/1.1中,單個TCP連接,在同一時間只能處理一個http請求,雖然存在Pipelining技術支持多個請求同時發(fā)送,但存在很多問題無法解決,瀏覽器默認關閉,所以認為是不支持同時多個請求。
  • HTTP2提供了多路傳輸功能,多個http請求,可以同時在同一個TCP連接中進行傳輸。

瀏覽器與服務器建立一個TCP連接后,是否會在完成一個http請求后斷開?什么條件下會斷開?

  • HTTP/1.1將 Connection 寫入了標準,默認值為 keep-alive 。除非強制設置為Connection: close 才會在請求后關閉TCP連接

瀏覽器http請求的并發(fā)性是如何體現的?并發(fā)請求的數量有沒有限制?

  • 頁面資源請求時,瀏覽器會同時和服務器建立多個TCP連接,在同一個TCP連接上順序處理多個HTTP請求。
  • 瀏覽器的并發(fā)性體現在可以建立多個TCP連接,來支持多個http同時請求。
  • Chrome瀏覽器最多允許對同一個域名Host建立6個TCP連接,不同的瀏覽器有所區(qū)別。

HTTP 請求及響應


HTTP?

  • 他就是計算機通過網絡進行通信的規(guī)則,是一個基于請求與響應,無狀態(tài)的,應用層的協議,?;赥CP/IP協議傳輸數據。

HTTP請求報文?

  • 一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求數據4個部分組成

請求頭部?

請求頭 說明
Host 接受請求的服務器地址 IP:端口 或 域名
User-Agent 請求的應用程序名稱
Connection 連接形式 Connection:Keep-Alive
Accept-Charset 通知服務器可以發(fā)送的編碼格式
Accept-Encoding 通知服務器可以發(fā)送的數據壓縮格式
Accept-Language 通知服務器可以發(fā)送的語言

post的請求報文

POST  /index.php HTTP/1.1    請求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  請求頭
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
  空行
username=admin&password=123456  請求數據

  • 請求頭部的最后會有一個空行,表示請求頭部結束,接下來為請求數據,這一行非常重要,必不可少。

為什么要TCP三次握手,四次揮手?

  • 客戶端和服務器通過三次握手建立了TCP連接以后,TCP的斷開連接,這里就有了的“四次分手”
  • 為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。

服務器響應


響應報文的

HTTP/1.1 200 OK  // 狀態(tài)行
Date: Sun, 17 Mar 2013 08:12:54 GMT  // 響應頭部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

image

空行 // 表示結束
<html>  響應數據
<head>
<title>HTTP響應<title>
</head>
<body>
'你好'
</body>
</html>

客戶端渲染


解析過程

js修改dom結構或樣式 -> 計算style -> layout(重排) -> paint(重繪) -> composite(合成)

  1. Html Parser 解析 html 構建 Dom Tree
  2. Css Parser 解析 css 構建 CSS Rule Tree
  3. 解析完成后,瀏覽器引擎會通過DOM Tree 和 CSS Rule Tree 來構造 Rendering Tree
  4. 最后通過調用操作系統(tǒng)Native GUI的API繪制。

WebKit CSS 解析器

image.png

#head .warp div span { color: 'red' }

  • 以上代碼瀏覽器會按照從右向左的順序去讀取選擇器
  • display:none 不會被放在渲染樹中 visibility: hidden 會被放入渲染樹

JS解析

  • 比較有名的有 Chrome 的 V8 引擎,可以引入事件循環(huán)進行分析
  • 對JavaScript文本代碼通過詞法和語法分析形成抽象語法樹
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容