從輸入URL到頁面展示在用戶面前,都發生了什麼?

整體分爲這麼幾個過程:html

  • DNS解析
  • TCP鏈接
  • 發送HTTp請求
  • 服務器處理並返回HTTP報文
  • 瀏覽器解析渲染頁面
  • 鏈接結束

具體過程
一、DNS解析
DNS解析的過程就是尋找哪臺機器上有你須要資源的過程。當輸入www.baidu.com的時候,實際上是要找對應的ip地址,DNS充當了翻譯的角色,實現了網址到IP地址的轉換。由於互聯網上的每一臺計算機的惟一標識是它的IP地址。前端

解析過程:編程

DNS解析是一個遞歸查詢的過程。
json

首先在本地域名服務器中查詢IP地址,若是沒有找到的狀況下,本地域名服務器會向根域名服務器發送一個請求,若是根域名服務器也不存在該域名時,本地域名會向com頂級域名服務器發送一個請求,依次類推下去。直到最後本地域名服務器獲得baidu的IP地址並把它緩存到本地,供下次查詢使用。從上述過程當中,能夠看出網址的解析是一個從右向左的過程: com -> baidu.com -> www.baidu.com。可是你是否發現少了點什麼,根域名服務器的解析過程呢?事實上,真正的網址是www.baidu.com.,並非我多打了一個.,這個.對應的就是根域名服務器,默認狀況下全部的網址的最後一位都是.,既然是默認狀況下,爲了方便用戶,一般都會省略,瀏覽器在請求DNS的時候會自動加上,全部網址真正的解析過程爲: . -> .com -> baidu.com. -> www.baidu.com.。後端

二、TCP鏈接
三、 HTTP請求
其實這部分又能夠稱爲前端工程師眼中的HTTP,它主要發生在客戶端。發送HTTP請求的過程就是構建HTTP請求報文並經過TCP協議中發送到服務器指定端口(HTTP協議80/8080, HTTPS協議443)。HTTP請求報文是由三部分組成: 請求行, 請求報頭和請求正文。
請求行數組

格式以下:瀏覽器

Method Request-URL HTTP-Version CRLF

eg: GET index.html HTTP/1.1
經常使用的方法有: GET, POST, PUT, DELETE, OPTIONS, HEAD。緩存

TODO:服務器

GET和POST有什麼區別?
請求報頭前端工程師

請求報頭容許客戶端向服務器傳遞請求的附加信息和客戶端自身的信息。
PS: 客戶端不必定特指瀏覽器,有時候也可以使用Linux下的CURL命令以及HTTP客戶端測試工具等。
常見的請求報頭有: Accept, Accept-Charset, Accept-Encoding, Accept-Language, Content-Type, Authorization, Cookie, User-Agent等。

請求正文

當使用POST, PUT等方法時,一般須要客戶端向服務器傳遞數據。這些數據就儲存在請求正文中。在請求包頭中有一些與請求正文相關的信息,例如: 如今的Web應用一般採用Rest架構,請求的數據格式通常爲json。這時就須要設置Content-Type: application/json。

四、服務器處理並返回HTTP報文
天然而然這部分對應的就是後端工程師眼中的HTTP。後端從在固定的端口接收到TCP報文開始,這一部分對應於編程語言中的socket。它會對TCP鏈接進行處理,對HTTP協議進行解析,並按照報文格式進一步封裝成HTTP Request對象,供上層使用。這一部分工做通常是由Web服務器去進行,我使用過的Web服務器有Tomcat, Jetty和Netty等等。

HTTP響應報文也是由三部分組成: 狀態碼, 響應報頭和響應報文。

狀態碼

狀態碼是由3位數組成,第一個數字定義了響應的類別,且有五種可能取值:

1xx:指示信息–表示請求已接收,繼續處理。
2xx:成功–表示請求已被成功接收、理解、接受。
3xx:重定向–要完成請求必須進行更進一步的操做。
4xx:客戶端錯誤–請求有語法錯誤或請求沒法實現。
5xx:服務器端錯誤–服務器未能實現合法的請求。平時遇到比較常見的狀態碼有:200, 204, 301, 302, 304, 400, 401, 403, 404, 422, 500(分別表示什麼請自行查找)。
TODO:

301和302有什麼區別?
HTTP緩存
響應報頭

常見的響應報頭字段有: Server, Connection...。

響應報文

服務器返回給瀏覽器的文本信息,一般HTML, CSS, JS, 圖片等文件就放在這一部分。

五、瀏覽器解析渲染頁面

參考:http://blog.csdn.net/aishangy...

相關文章
相關標籤/搜索