對 Web 請求過程的理解

當我們從瀏覽器輸入某個域名(如:http://www.baidu.com ),到服務(wù)器返回結(jié)果給瀏覽器為止,這個過程究竟發(fā)生了什么,又涉及到了哪些技術(shù)。本文談?wù)勛约簩@一過程的理解。

1. B/S 網(wǎng)絡(luò)總體結(jié)構(gòu)

目前 B/S 網(wǎng)絡(luò)的總體架構(gòu)大概如下圖所示:

圖 1. B/S 網(wǎng)絡(luò)架構(gòu)圖

當一個用戶在瀏覽器輸入 http://www.baidu.com 這個 URL 時,首先瀏覽器會請求 DNS 把這個域名解析成對應(yīng)的 IP 地址 ,然后根據(jù)這個 IP 地址找到對應(yīng)的服務(wù)器,向目標服務(wù)器發(fā)起一個 get 請求,由這個目標服務(wù)器決定返回什么數(shù)據(jù)資源給訪問的用戶。在這個過程中,服務(wù)器端還有很多復(fù)雜的業(yè)務(wù)邏輯:服務(wù)器可能不止一臺,到底有哪臺服務(wù)器來處理這個請求,這需要一個負載均衡設(shè)備來平均分配所有的用戶請求;還有請求的數(shù)據(jù)可能存在分布式緩存里,也可能存在靜態(tài)文件里,還有可能存在數(shù)據(jù)庫;當數(shù)據(jù)返回給瀏覽器時,瀏覽器發(fā)現(xiàn)含有一些靜態(tài)資源時,瀏覽器又會發(fā)起另外的 HTTP 請求,而這些請求很可能會在 CDN 上,CDN 服務(wù)器又會處理這些請求。這個過程中的每一個細節(jié)都會決定這個請求是否成功。

2. 如何發(fā)起一個 HTTP 請求

發(fā)起一個 HTTP 請求和建立一個 Socket 連接的區(qū)別不大,只不過 outputStream.write 寫的二進制數(shù)據(jù)格式要符合 HTTP。瀏覽器在建立 Socket 連接之前,必須根據(jù)地址欄輸入的 URL 的域名 DNS 解析出 IP 地址,再根據(jù)這個 IP 地址和默認的80端口遠程服務(wù)器建立 Socket 連接,然后瀏覽器根據(jù)這個 URL 組裝成一個 get 類型的 HTTP 請求頭,通過 outputStream.write 發(fā)送到目標服務(wù)器,服務(wù)器等待 inputStream.read 返回數(shù)據(jù),最后斷開這個連接。

3. 如何解析 HTTP

這里只介紹下常用的 HTTP 請求頭、響應(yīng)頭、狀態(tài)碼以及緩存機制。

請求頭 說明
Accept-Charset 用于指定客戶端接受的字符集
Accept-Encoding 用于指定可接受的內(nèi)容編碼,如 Accept-Encoding:gzip.deflate
Accept-Language 用于指定一種自然語言,如 Accept-Language:zh-cn
Host 用于指定被請求資源的 Internet 主機和端口號,如 Host:www.baidu.com
User-Agent 客戶端將它的操作系統(tǒng)、瀏覽器和其他屬性告訴服務(wù)器
Connection 當前連接是否保持,如:Connection:Keep-Alive
響應(yīng)頭 說明
Server 使用的服務(wù)器名稱,如 Server:Apache/1.3.6(Unix)
Content-Type 用來指明發(fā)送給接受者的實體正文的媒體類型,如 Content-Type:text/html;charset=GBK
Content-Language 描述了資源所用的自然語言,與 Accept-Language 對應(yīng)
Content-Encoding 與請求報頭 Accept-Encoding 對應(yīng),告訴瀏覽器服務(wù)端采用的是什么壓縮編碼
Content-Length 指明實體正文的長度,用以志杰方式存儲的十進制數(shù)字來表示
Keep-Alive 保持連接的時間,如:Keep-Alive: timeout=5, max=120
狀態(tài)碼 說明
200 客戶端請求成功
302 臨時跳轉(zhuǎn),跳轉(zhuǎn)的地址通過 Location 指定
400 客戶端請求有語法錯誤,不能被服務(wù)器識別
403 服務(wù)器收到請求,但是拒絕提供服務(wù)
404 請求的資源不存在
500 服務(wù)器發(fā)生不可預(yù)期的錯誤
緩存設(shè)置 說明
Cache-Control 請求字段優(yōu)先級較高,使用如 Cache-Control: no-cache
Pragma 和 Cache-Control 作用類似,最常用的是 Pragma: no-cache
Expires Expires 后面跟著一個日期和時間,超過這個時間緩存的內(nèi)容將失效
Last-Modified 服務(wù)器上的資源最后修改時間
Etag 服務(wù)端給每個頁面分配一個唯一的編號,通過編號來區(qū)分當前頁面是否是最新的

4. DNS 域名解析的過程

DNS 域名解析的大致過程如下圖所示:

圖 2. DNS 域名解析

1. 瀏覽器會檢查緩存中是否有該域名對應(yīng)的 IP 地址解析結(jié)果,如果緩存中有,這個解析過程就將結(jié)束。
  2. 如果用戶的瀏覽器緩存中沒有,瀏覽器會查找操作系統(tǒng)緩存中是否有這個域名對應(yīng)的 DNS 解析結(jié)果。
  3. 如果用戶操作系統(tǒng)緩存中沒有,操作系統(tǒng)會把這個域名發(fā)送給 LDNS,也就是本地區(qū)的域名服務(wù)器。
  4. 如果 LDNS 仍然沒有命中,就直接到 Root Server 域名服務(wù)器請求解析。
  5. 根域名服務(wù)器返回給本地域名服務(wù)器一個所查詢域的主域名服務(wù)器(gTLD Server)地址。
  6. 本地域名服務(wù)器(LDNS)再向上一步返回的 gTLD 服務(wù)器發(fā)送請求。
  7. 接受請求的 gTLD 服務(wù)器查找并返回此域名對應(yīng)的 Name Server 域名服務(wù)器地址,這個 Name Server 通常就是你注冊的域名服務(wù)器。
  8. Name Server 域名服務(wù)器會查詢存儲的域名和 IP 的映射關(guān)系表,在正常情況下都根據(jù)域名得到目標 IP 記錄,連同一個 TTL 指返回給 DNS Server 域名服務(wù)器。
  9. 返回該域名對應(yīng)的 IP 和 TTL 值,LDNS 會緩存這個域名和 IP 的對應(yīng)關(guān)系,緩存的時間由 TTL 值控制。
  10. 把解析的結(jié)果返回給用戶,用戶根據(jù) TTL 值緩存在本地系統(tǒng)緩存中,域名解析過程到此結(jié)束。

5. 幾種域名解析方式

  • A 記錄:A 代表的是 Address,用來指定域名對應(yīng)的 IP 地址。
  • MX 記錄:表示的是 Mail Exchange,就是可以將某個域名下的郵件服務(wù)器指向自己的 Mail Server。
  • CNAME 記錄:全稱是 Canonical Name(別名解析),就是可以為一個域名設(shè)置一個或者多個別名。
  • NS 記錄:為某個域名指定 DNS 解析服務(wù)器。
  • TXT 記錄:為某個主機名或域名設(shè)置說明。

6. 何謂 CDN

CDN 也就是內(nèi)容分布網(wǎng)絡(luò)(Content Delivery Network),目的就是使用戶可以就近取得所需的內(nèi)容,提高用戶訪問網(wǎng)絡(luò)的響應(yīng)速度。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容