系列文章持續更新中
吊打面試官 | 當我們打開網頁時,瀏覽器究竟做了什麼?
這個題目主要考察面試者對整個計算機網絡的理解。涉及的知識面非常廣泛,協議、軟件、安全、硬件、高併發、高可用等等。
回答要點
-
瀏覽器做了哪些事情。
-
內核協議棧做了哪些事情。
-
web服務器相關話題。
-
CDN加速網絡服務。
下面我們就上面4個點分別說明。
1.瀏覽器做了哪些事情
當輸入https://www.baidu.com/index.html,瀏覽器進行URL解析,首先會看https,就知道我們要訪問的是web服務器,www.baidu.com是web服務器名字,後面index.html就是數據源路徑和文件名。
根據上面的解析結果生成HTTP請求消息。
GET /index.html HTTP/1.1 <!-- 請求行 -->
User-Agent: curl/7.29.0
Host: www.baidu.com
Accept: */*
<!-- 空行 -->
發送請求後,會得到服務器的響應消息。
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 2443
Content-Type: text/html<!-- 空行 -->
<html>
<!-- ........省略...... -->
</html>
瀏覽器生成了HTTP請求後,需要操作系統來把數據發送出去,內核協議棧用的是IP,並不是域名,所以要進行域名(DNS)解析。web瀏覽器中其實就是gethostbyname ("www.baidu.com"),就可以獲得IP地址。
gethostbyname函數內部實現就是生成DNS查詢消息,發送UDP查詢消息到DNS服務器,得到DNS服務器的響應,從響應消息中取出IP。這裏需要注意,我們要去DNS服務器查詢信息,需要知道DNS服務器的IP地址,所以要配置正確。國內移動、電信、聯通的通用DNS:114.114.114.114。
DNS系統是三層樹狀、分佈式服務。
目前全球有13組根域名服務器,又有幾百臺鏡像,保證一定能被訪問得到。有了這個系統,我們查詢域名www.baidu.com對應的IP,按照如下順序:
-
訪問根域名服務器,它告訴我們com域名服務器地址。
-
訪問com域名服務器,它告訴我們baidu.com域名服務器的地址。
-
訪問baidu.com域名服務器,得到www.baidu.com的地址。
我們爲了加速域名解析,也可以在自己公司內部搭建DNS服務器,緩存域名對應的IP。其實我們操作系統也會緩存曾經訪問過的域名。當然,我們還可以在操作系統的hosts文件中,記錄域名對應的IP地址。如果在這些地方能夠找到ip地址,就避免了遠程訪問DNS服務器,加快了DNS解析過程,也減輕了DNS服務器的壓力。
得到了目標機器IP地址,瀏覽器就可以用socket,委託內核幫我們發送數據了,代碼如下:
int fd = socket(AF_INET, SOCK_STREAM, 0);
connect(fd, 服務器地址);
while ( 1 ) {
write(fd, http請求數據);
read(fd,服務器響應的數據)
}
close(fd);
瀏覽器拿到服務器的響應數據,解析報文,對於HTML文件,調用排版引擎、js引擎等來處理,然後在瀏覽器展示。
當然,如果近期訪問過的網頁,很有可能緩存在本地,這樣再次訪問,就不需要去服務器拿數據,直接訪問本地緩存數據,可以降低服務器的壓力,提高響應速度。
2.內核協議棧做了哪些事情
因爲HTTP協議底層用的是TCP協議,所以要經過三次握手進行連接,傳送數據,最後四次揮手斷開連接。
內核協議棧主要是將應用層HTTP請求按照TCP/IP協議棧的要求,經過層層封裝後成幀,然後將報文的類似0101001串轉換成電信號發送出去。
這裏要注意MAC頭部的目標機器MAC,是下一跳機器的MAC,如果當前機器沒有緩存,就需要ARP廣播,先得到去往目標機器的下一跳機器的MAC,這樣才能逐跳轉發。還有,局域網的IP地址也不能在公網上使用,所以在出網關的時候,IP地址通過NAT轉換成公網地址。
3.企業web服務器相關話題招聘
目標服務器得到了客戶端的HTTP請求,如果找到相應的資源文件,組成HTTP響應報文,將資源發送回來,如果沒有找到,就會給客戶端返回404錯誤。
目標網站的服務器對外表現是一個IP,爲了能夠扛住高併發,內部往往是一套非常複雜的架構,入口有負載均衡設備,比如四層的LVS和七層的Nginx,後面有許多服務器構成一個集羣。
負載均衡服務器先訪問內存級的緩存,比如redis,把頻繁訪問的數據緩存幾秒到幾分鐘,減輕後端服務器的壓力。如果緩存沒有相應的數據,再把請求轉發給應用服務器,應用服務器如果需要數據,再訪問後端的數據庫服務器。爲了提高數據庫併發能力,可以做成讀寫分離,目前主流的數據庫都實現了這個功能。
4.CDN加速網絡服務
互聯網雖然是一個大網,其實它由好多個小網組成,各個小網又相互連通,比如電信、移動、聯通,各自是一個網絡,它們之間需要聯通。
小的網絡內部很流暢,網絡之間只有很少的聯通點。如果網站在中國移動,筆記本在中國聯通,那麼就必須跨網傳輸。大量的用戶去搶這個聯通點,就會帶來網絡壓力,產生比較大的延遲。另外,每過一個網絡節點,都需要停頓一下,二層、三層的解析轉發,也會帶來延遲。爲了解決這種上網速度慢的問題,CDN就出現了。
CDN中文名稱是內容分發網絡,它主要解決的問題是就近訪問的問題。CDN分發源站的內容,也就是把源站的內容緩存在各個節點上。用戶上網就不直接訪問源站的內容,而是訪問距離它最近的一個CDN節點,術語叫邊緣節點,其實就是緩存了源站的內容,就是源站的一個代理服務器,避免遠距離訪問源站,實現網絡加速。
CDN裏面緩存的數據,主要是html、圖片、視頻等靜態資源。動態資源往往都需要源站實時生成,緩存也沒有太大意義,不過,我們也可以短暫的緩存動態資源,在這段短暫的時間內,動態資源也就變成了靜態資源,可以被CDN緩存以實現加速。
網絡上的資源無窮無盡,CDN不可能全部緩存起來,只能緩存最常見的資源。如果所訪問的資源就在CDN緩存中,也就是命中了,直接返回給客戶端。如果沒有命中,則要去源站取數據,也叫回源。
我們應該儘可能的提高命中率,降低迴源率。這就需要在存儲系統上做更多的事情,比如硬件上,要更大的內存,更大和快速的磁盤,比如SSD,萬兆以太網,更高速的CPU等。軟件上,可以用redis等儘可能高效利用存儲,存下更多的內容。
5.總結
1.瀏覽器主要發送HTTP請求,接收HTTP響應,然後然後進行渲染,展示到界面。
2.HTTP底層走的是TCP/IP,如果不知道IP,就需要DNS協議解析。
3.TCP連接後收發HTTP數據包。
4.爲了降低服務器壓力,加快訪問速度,有很多緩存,比如,客戶端緩存,CDN緩存,負載均衡器緩存等。
由於網絡是非常複雜的,本文對所涉及的知識點,只是淺嘗輒止,旨在讓讀者對瀏覽器輸入URL後的過程有一個總體認識。