備注:
因為文章太長,所以將它分為三部分,本文是第一部分。
第一部分:深入淺出經典面試題:從瀏覽器中輸入URL到頁面加載發生了什么 - Part 1
第二部分:深入淺出經典面試題:從瀏覽器中輸入URL到頁面加載發生了什么 - Part 2
第三部分:深入淺出經典面試題:從瀏覽器中輸入URL到頁面加載發生了什么 - Part 3
背景
“從瀏覽器中輸入URL到頁面加載的發生了什么“,這是一道經典的面試題,涉及到的知識面非常多,但作為一個自認為對網絡知識掌握的比較好的老碼農來說,回答這個問題自然不在話下。如果這道題目如果在面試出現,對我來說就是送分題啊。盡管如此,我還是願意花一些時間根據我自己的理解回答一下這個題目,看我自己到底掌握的有多深,同時也把自己的知識梳理一下。
這讓我想起另外一件往事,這道題有點類似於“在手機上瀏覽器上輸入一個URL,手機做了一些什么”,我當時學習通信里的核心網時就給自己提出過這個問題。
我非常願意將這個面試題的答案共享出來,一是希望得到大家的意見,二是也希望對那些不是特別熟的人起到一些幫助。
因為文章較長,我將它們分為三大部份,后面會提供該文章的完整PDF版本,供大家下載。
從本文里學到什么?
正如前面所說,這篇文章涉及到的知識面非常豐富,我相信您絕對可以從本文里學到很多基礎知識,還有一些高級話題。
- DNS的解析原理,常用命令,端口等
- TCP/IP模型,三次握手,四次揮手。
- HTTP/HTTPS的原理和解析。
- 瀏覽器render一個頁面
- Web安全性問題
- 抓包,分析TCP模型,三次握手,SSL/TLS,讓學起來不再枯燥。
- 其他一些高級話題。
自認為是目前寫的最詳細的一篇文章了,因為里面有理論,有實戰,應該會起到一個比較好的效果。
總概: 幾大步驟
總的來說,當你輸入在瀏覽器里輸入一個URL到頁面加載,發生的順序如下:
- DNS查詢
- TCP連接
- 發送HTTP請求
- Server處理HTTP請求並返回HTTP報文
- 瀏覽器解析並render頁面
- HTTP連接斷開
DNS查詢
DNS解析流程
假設輸入的URL是包含域名的,那肯定會涉及到DNS解析。當然,如果URL僅僅是IP,那就不會涉及到DNS的。域名的出現是為了方便記憶,因為域名比IP好記。我們這里假設URL包含域名。
解析的步驟大致如下圖:

DNS的優化



DNS負載均衡
DNS Record(記錄)
記錄類型
|
含義簡介
|
A(Address)
|
指定域名對應的IPv4地址
|
AAAA
|
指定域名對應的IPv6地址
|
NS(Name Server)
|
指定該域名由哪個DNS服務器來進行解析
|
MX(Mail Exchanger)
|
郵件交換記錄,用於電子郵件系統發郵件時根據收信人的地址后綴來定位郵件服務器
|
CNAME
|
別名記錄,多個域名映射到同一台計算機(如同一主機提供mail和www服務)
|
TXT
|
主機名或域名的說明
|
TTL(Time-To-Live)
|
DNS服務器中保存的時間
|
PTR
|
將一個主機地址映射到對應的域名
|
HINFO
|
說明映射到特定 DNS 主機名的 CPU 類型和操作系統類型
|
DNS常用命令和工具
[warren]$ dig
; <<>> DiG 9.9.5-3ubuntu0.16-Ubuntu <<>>
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57775
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 16265 IN NS a.root-servers.net.
. 16265 IN NS c.root-servers.net.
. 16265 IN NS j.root-servers.net.
. 16265 IN NS b.root-servers.net.
. 16265 IN NS i.root-servers.net.
. 16265 IN NS d.root-servers.net.
. 16265 IN NS k.root-servers.net.
. 16265 IN NS f.root-servers.net.
. 16265 IN NS l.root-servers.net.
. 16265 IN NS h.root-servers.net.
. 16265 IN NS m.root-servers.net.
. 16265 IN NS g.root-servers.net.
. 16265 IN NS e.root-servers.net.
;; Query time: 0 msec
;; SERVER: 208.113.157.202#53(208.113.157.202)
;; WHEN: Thu Nov 29 18:04:06 PST 2018
;; MSG SIZE rcvd: 239
|
dig
www.jd.com
; <<>> DiG 9.10.6 <<>> www.jd.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2675
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.jd.com. IN A
;; ANSWER SECTION:
www.jd.com. 300 IN CNAME www.jd.com.gslb.qianxun.com.
www.jd.com.gslb.qianxun.com. 300 IN CNAME www.jdcdn.com.
www.jdcdn.com. 300 IN A 61.174.55.1
;; Query time: 3 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Fri Nov 30 10:07:37 CST 2018
;; MSG SIZE rcvd: 106
|
nslookup www.jd.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
www.jd.com canonical name = www.jd.com.gslb.qianxun.com.
www.jd.com.gslb.qianxun.com canonical name = www.jdcdn.com.
Name: www.jdcdn.com
Address: 61.174.55.1
|
DNS抓包分析





