從輸入URL到看到網(wǎng)頁之間發(fā)生了什么

簡單的回答是:等待。當然這是從我們用戶的角度來看。

從機器的角度, 這之間有著大量的任務(wù)要完成。而且隨著技術(shù)的進步(HTTP/2, HTTPS,IPv6),互聯(lián)網(wǎng)規(guī)模的增長(Load Balencer,CDN),和用戶體驗的需求的提高(快速,安全),這個任務(wù)列表也在不斷演化,并會根據(jù)具體情況有很多變數(shù)。

最簡單的流程

這個最簡單的流程基于一些假設(shè),比如這是第一次訪問某網(wǎng)站;之使用當前主流又必須的技術(shù),如簡單的HTTP 1.1的GET請求, IPv4,沒有代理,CDN之類。

  1. 用戶輸入URL(注意不是IP地址而是URL),如http://www.hackingnote.com/index.html。瀏覽器從URL中提取出域名(www.hackingnote.com)。
  2. 瀏覽器并不能直接利用這個域名,它需要一個IP才能發(fā)送請求。瀏覽器會依次查找它自己,操作系統(tǒng),路由,和ISP的緩存;如果未找到相應(yīng)記錄則進行一次DNS的搜索:當一個DNS服務(wù)器存有該域名的記錄,相應(yīng)的IP地址將被返回,否則轉(zhuǎn)發(fā)給其他的DNS服務(wù)器。
  3. 瀏覽器最終得到了解析后的IP,并嘗試用這個IP和服務(wù)器在三次握手后建立一個TCP連接
  4. 瀏覽器發(fā)送HTTP請求(request)
  5. 服務(wù)器接收到HTTP請求,找到所要求的資源,如HTML,并發(fā)送HTTP響應(yīng)(response)
  6. 瀏覽器接收到HTTP響應(yīng),關(guān)閉TCP連接
  7. 瀏覽器查看響應(yīng)的狀態(tài)碼,如果是401無權(quán)限,404無響應(yīng),則顯示相應(yīng)錯誤;301,302則跳轉(zhuǎn)到其他頁面(需要發(fā)送新的請求);200則解析并渲染相應(yīng)中附帶的HTML,呈現(xiàn)給用戶。

HTTP/2

在HTTP 1.1中,每個request都需要建立一個TCP連接,得到響應(yīng)后連接關(guān)閉。如果HTML中有大量的外部Javascript或css的文件,則每個文件都需要一個單獨的請求。所以在HTTP 1.1時代的一個優(yōu)化原則是,盡可能合并外部文件以減少請求數(shù)。但HTTP/2中TCP連接可以被保留,并且多個請求可以被并行發(fā)送。那條優(yōu)化原則就不再適用了。

HTTPS

HTTP是明文傳送的,如果請求中包含用戶名和密碼就會有很大的被截獲的風險。如果試用HTTPS,則會在發(fā)送端和接受端都增加一個加密解密的過程。

CDN

如果使用CDN(Content Delivery Network),如AWS的CloundFront,或CloudFlare,網(wǎng)站的域名信息會被保存到CDN的Name Server中,用戶不再直接訪問網(wǎng)站的服務(wù)器,而是限訪問最近的CDN的節(jié)點,如果緩存中存有所請求的頁面會直接放回,否則CDN會發(fā)送請求到網(wǎng)站服務(wù)器,HTTP響應(yīng)也是通過CDN最終發(fā)回瀏覽器。

動態(tài)網(wǎng)站和靜態(tài)網(wǎng)站

如果只是從字面意思理解,很容易把這兩者的區(qū)別想成一個可以有動態(tài)圖片或視頻,一個只能是靜止的文字;也并非前者才能有代碼執(zhí)行而后者不能加有任何javascript。真正的區(qū)別在于對于同樣的網(wǎng)址,所返回的內(nèi)容是否是固定的。

對于靜態(tài)網(wǎng)站,服務(wù)器在收到請求后,直接查看是否存在所請求的資源并發(fā)送響應(yīng)。動態(tài)網(wǎng)站則復(fù)雜的多,通常需要從后臺讀取數(shù)據(jù)庫,組裝成所需要的HTML再返回。

拿博客舉例:Ghost是動態(tài)網(wǎng)站(WordPress同理,只是把Node.js換成PHP),Nginx(或Apache)服務(wù)器作為反向代理,會將請求轉(zhuǎn)發(fā)給Node.js,Node根據(jù)請求從數(shù)據(jù)庫中提取內(nèi)容,將生成的HTML返回Nginx,Nginx再發(fā)回瀏覽器。

而如果用Jekyll,Nanoc,或Hexo這類靜態(tài)網(wǎng)站生成器,HTML會被預(yù)先生成好,當請求到達Nginx或Apache時,HTML會被直接提取并返回。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容