1. 程式人生 > >瀏覽器訪問一個網站的背後到底經歷了什麽?

瀏覽器訪問一個網站的背後到底經歷了什麽?

解析 三臺 提示 緩存dns XML 其中 說我 域名解析 option

如題,通過瀏覽器訪問一個網站的背後到底經歷了什麽?

內容來自:https://www.cnblogs.com/yangliheng/p/6112955.html

前言

來吧,隨我一起來整理下HTTP與DNS協議吧,無論你是Dev or Ops這些都是你必須要知道的基礎網絡知識,如上圖所示,我們把用戶訪問網站的流程大概分為了兩大部分:

  1. DNS(用於解析域名的IP地址)
  2. HTTP(得到IP地址之後從服務器獲取數據)

基於上面的兩個點,就讓我麽來深刻的討論下到底什麽是DNS and HTTP把。

What is DNS?

域名系統(Domain Name System,縮寫:DNS)是互聯網的一項服務。它作為將域名和IP地址相互映射的一個分布式數據庫,能夠使人更方便地訪問互聯網。
DNS使用TCP和UDP端口53。當前,對於每一級域名長度的限制是63個字符,域名總長度則不能超過253個字符。

DNS原理

如上所示,DNS實則就是把一個域名轉換成了IP(A記錄)地址(雖然這只是其中的一部分),那麽它是怎麽轉換的呢?

當用戶在瀏覽器輸入http://blog.wangwang.me,是如何得到對應服務器的IP地址呢?具體步驟如下:

  1. 瀏覽器會在本地的緩存中查找是否存在當前訪問域名的緩存,如果有就返回數據,否則就繼續第二步,通常情況下瀏覽器都會緩存網站的數據,為了就是加速訪問;
  2. 查看當前操作系統的hosts文件是否寫有IP和域名對應的關系,如果有則得到IP地址,否則繼續第三步;
  3. 通過本地的Local DNS獲取域名對應的IP地址,那麽Local DNS其實就是我們的交換機或者路由器配置的DNS,通常情況下都有兩個,一個主一個輔;
  4. Local DNS會先看緩存DNS中是否有這條記錄,如果沒有就繼續往下走,否則就返回IP地址;
  5. Local DNS會繼續請求根服務器(.),根服務器全球只有十三臺,根服務器也沒有blog.wangwang.me域名的解析,但是根有.me域名的解析,然後根就會繼續發起請求,當然只有在轉發模式下才會這麽做。
  6. 根服務器請求.me服務器有沒有blog.wangwang.me域名的解析,.me服務器服務器沒有對應的解析,但是我有wangwang.me域名的解析,然後由.me服務器繼續發起請求;
  7. .meDNS服務器問wangwang.meDNS服務器有沒有blog.wangwang.me域名的解析,wangwang.me
    DNS服務器說我有blog.wangwang.me域名的解析;
  8. wangwang.meDNS服務器把blog.wangwang.me域名解析的IP地址返回給,.meDNS服務器;
  9. .meDNS服務器把記錄返回給根服務器;
  10. 根服務器把記錄返回給Local DNS服務器
  11. Local DNS服務器會把記錄還存在DNS Cache服務器上,並且把記錄再次返回給瀏覽器;
  12. 瀏覽器得到了對應的IP地址後就向blog.wangwang.me對應的服務器發起HTTP請求;
  13. blog.wangwang.me服務器經過一些列的處理,最後把數據返回給瀏覽器,最後在頁面上展示;
  • 下面是未啟用轉發模式工作流程
  1. Local DNS服務器向服務器發起請求問有沒有blog.ansheng.me域名的解析記錄;
  2. 服務器說我沒有blog.ansheng.me域名的解析記錄,但是我有.me的解析記錄,並且把.me的解析記錄返回給Local DNS服務器;
  3. Local DNS服務器得到.me的服務器IP之後發起請求問:你有沒有blog.ansheng.me*域名的解析記錄;
  4. .me服務器說我沒有,但是我有ansheng.me域名的解析記錄,並且把IP地址返回給Local DNS服務器;
  5. Local DNS服務器得到ansheng.me的服務器IP之後又發起請求問:你有沒有blog.ansheng.me域名的解析記錄;
  6. ansheng.me的服務器說我有blog.ansheng.me域名的解析記錄,並且把對應解析的記錄返回給Local DNS服務器

不管用的是轉發模式,還是根提示,最後都是把結果返回給Local DNS服務器,由此DNS服務器再返回給客戶機。

從瀏覽器到本地DNS服務器是屬於遞歸查詢,而DNS服務器之間就是的交互查詢就是叠代查詢

通過dig命令可以很清楚的看到解析流程:

 1 [root@ansheng ~]# dig +trace blog.ansheng.me
 2  
 3 ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.1 <<>> +trace blog.ansheng.me
 4 ;; global options: +cmd
 5 . 4695 IN NS a.root-servers.net.
 6 . 4695 IN NS b.root-servers.net.
 7 . 4695 IN NS c.root-servers.net.
 8 . 4695 IN NS d.root-servers.net.
 9 . 4695 IN NS e.root-servers.net.
10 . 4695 IN NS f.root-servers.net.
11 . 4695 IN NS g.root-servers.net.
12 . 4695 IN NS h.root-servers.net.
13 . 4695 IN NS i.root-servers.net.
14 . 4695 IN NS j.root-servers.net.
15 . 4695 IN NS k.root-servers.net.
16 . 4695 IN NS l.root-servers.net.
17 . 4695 IN NS m.root-servers.net.
18 ;; Received 228 bytes from 8.8.8.8#53(8.8.8.8) in 62 ms
19  
20 me. 172800 IN NS ns.nic.me.
21 me. 172800 IN NS a2.me.afilias-nst.info.
22 me. 172800 IN NS d0.cctld.afilias-nst.org.
23 me. 172800 IN NS ns2.nic.me.
24 me. 172800 IN NS b2.me.afilias-nst.org.
25 me. 172800 IN NS c0.cctld.afilias-nst.info.
26 me. 172800 IN NS a0.cctld.afilias-nst.info.
27 me. 172800 IN NS b0.cctld.afilias-nst.org.
28 ;; Received 491 bytes from 202.12.27.33#53(202.12.27.33) in 678 ms
29  
30 ansheng.me. 86400 IN NS dns10.hichina.com.
31 ansheng.me. 86400 IN NS dns9.hichina.com.
32 ;; Received 83 bytes from 199.254.61.1#53(199.254.61.1) in 86 ms
33  
34 blog.ansheng.me. 600 IN A 104.224.139.81
35 ;; Received 49 bytes from 140.205.228.13#53(140.205.228.13) in 182 ms

What is HTTP?

超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯網上應用最為廣泛的一種網絡協議。
設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。

HTTP報文

HTTP報文有兩種:

  1. 請求報文(Request Message),客戶端向服務端發起的請求
  2. 響應報文(Response Message),服務端回應給客戶端的請求
  • 請求報文(Request Message)
報文 信息
請求行 告訴服務器我使用HTTP1.1的協議獲取(GET)/index.html這個資源
請求頭 請求頭由Key/Value組成,請求頭部分的作用是客戶端把請求的相關信息告訴服務器
空行 告訴服務器下面沒有請求頭的信息了
請求報文主體段 主體部分包含了要發給服務器的數據

  • 響應報文(Response Message)
報文 信息
起始行 協議及版本號,數字狀態碼,狀態信息
響應頭部 Key/Value組成
空行 告訴服務器下面沒有響應頭的信息了
請求報文主體段 一段字符串(例如:HTML)

在上面截圖中我們可以看到請求頭部分

 1 # 請求行
 2 GET https://www.ansheng.me/ HTTP/1.1
 3 # 請求頭
 4 Host: www.ansheng.me
 5 Connection: keep-alive
 6 Pragma: no-cache
 7 Cache-Control: no-cache
 8 Upgrade-Insecure-Requests: 1
 9 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2868.3 Safari/537.36
10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
11 Accept-Encoding: gzip, deflate, sdch, br
12 Accept-Language: zh-CN,zh;q=0.8
13 Cookie: _gat=1; _ga=GA1.2.1463852464.1476801026
14 # 因為是GET方法,所以就沒有請求報文主體

響應頭:

 1 # 起始行
 2 HTTP/1.1 200 OK
 3 # 響應頭部
 4 Server: nginx
 5 Date: Tue, 18 Oct 2016 17:22:35 GMT
 6 Content-Type: text/html; charset=utf-8
 7 Last-Modified: Sun, 02 Oct 2016 05:51:17 GMT
 8 Transfer-Encoding: chunked
 9 Connection: keep-alive
10 Vary: Accept-Encoding
11 ETag: W/"57f0a055-9fc"
12 Expires: Fri, 21 Oct 2016 17:22:35 GMT
13 Cache-Control: max-age=259200
14 Content-Encoding: gzip
15 # 空行
16  
17 # 請求報文主體段,在瀏覽器是不會亂碼的
18 2da
19    V n 0 W ; F S M, R HH Q L  ?   5 l v ? ? } y2 $ y s [ { , _s/. w? vi{
20   q 8
21  
22 *** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

瀏覽器訪問一個網站的背後到底經歷了什麽?