吊打名企面試官 | 當我們打開網頁時,瀏覽器究竟做了什麼?

系列文章持續更新中

吊打名企面試官 | 當我們打開一個網頁時,究竟發生了什麼?

吊打名企面試官 | 如何理解java的反射機制?


吊打面試官 | 當我們打開網頁時,瀏覽器究竟做了什麼? 

這個題目主要考察面試者對整個計算機網絡的理解。涉及的知識面非常廣泛,協議、軟件、安全、硬件、高併發、高可用等等。

回答要點

 

 

  • 瀏覽器做了哪些事情。

  • 內核協議棧做了哪些事情。

  • 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.0Host: www.baidu.comAccept: */*<!-- 空行 -->

發送請求後,會得到服務器的響應消息。

HTTP/1.1 200 OKAccept-Ranges: bytesCache-Control: private, no-cache, no-store, proxy-revalidate, no-transformConnection: keep-aliveContent-Length: 2443Content-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,按照如下順序:

  1. 訪問根域名服務器,它告訴我們com域名服務器地址。

  2. 訪問com域名服務器,它告訴我們baidu.com域名服務器的地址。

  3. 訪問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後的過程有一個總體認識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章