- DNS解析
- TCP鏈接
- 發送HTTP請求
- 服務器處理請求並返回HTTP報文
- 瀏覽器解析渲染頁面
- 斷開鏈接
也能夠分爲以下幾個過程:git
1.DNS解析,找到IP地址
2.根據IP地址,找到對應的服務器
3.創建TCP鏈接(裏面有個 三次握手)
4.鏈接創建後,發出HTTP請求
5.服務器根據請求做出HTTP響應
6.瀏覽器獲得響應內容,進行解析與渲染,並顯示
7.斷開鏈接(四次揮手)編程
以上整個過程叫一次HTTP事務後端
具體過程:瀏覽器
DNS解析的過程就是尋找哪臺機器上有你所須要資源的過程。當你在瀏覽器中輸入一個地址時,例如www.baidu.com,其實不是百度網站真正意義上的地址。互聯網上每一臺計算機的惟一標識是它的IP地址,可是IP地址並不方便記憶。用戶更喜歡用方便記憶的網址去尋找互聯網上的其它計算機,也就是上面提到的百度的網址(域名)。因此互聯網設計者須要在用戶的方便性與可用性方面作一個權衡,這個權衡就是一個網址到IP地址的轉換,這個過程就是DNS解析。它實際上充當了一個翻譯的角色,實現了網址到IP地址的轉換。 ![]()
解析過程
DNS解析是一個遞歸查詢的過程
首先在本地域名服務器中查詢IP地址,若是沒有找到的狀況下,本地域名服務器會向根域名服務器發送一個請求,若是根域名服務器也不存在該域名時,本地域名會向com頂級域名服務器發送一個請求,依次類推下去。直到最後本地域名服務器獲得IP地址並把它緩存到本地,供下次查詢使用。緩存
DNS優化
瞭解了DNS的過程,能夠爲咱們帶來哪些?上文中請求到IP地址時,經歷了許多步驟,這個步驟中存在多個請求(同時存在UDP和TCP請求,爲何有兩種請求方式,請自行查找)。若是每次都通過這麼多步驟,是否太耗時間?如何減小該過程的步驟呢?那就是DNS緩存。
DNS緩存
DNS存在着多級緩存,從離瀏覽器的距離排序的話,有如下幾種: 瀏覽器緩存,系統緩存,路由器緩存,IPS服務器緩存,根域名服務器緩存,頂級域名服務器緩存,主域名服務器緩存安全
位於傳輸層的TCP協議爲傳輸報文提供可靠的字節流服務。它爲了方便傳輸,將大塊的數據分割成以報文段爲單位的數據包進行管理,併爲它們編號,方便服務器接收時能準確地還原報文信息。TCP協議經過 「三次握手」 (三次握手的具體內容請參考個人文章)等方法保證傳輸的安全可靠。服務器
HTTP請求包括請求報頭和請求主體兩個部分,其中請求報頭包含了相當重要的信息,包括請求的方法(GET / POST)、目標url、遵循的協議(http / https / ftp…),返回的信息是否須要緩存,以及客戶端是否發送cookie等。cookie
這部分對應的就是後端工程師眼中的HTTP。後端從在固定的端口接收到TCP報文開始,這一部分對應於編程語言中的socket。它會對TCP鏈接進行處理,對HTTP協議進行解析,並按照報文格式進一步封裝成HTTP Request對象,供上層使用,這一部分工做通常是由Web服務器去進行。異步
HTTP響應報文是由三部分組成: 狀態碼, 響應報頭 和 響應報文 。socket
瀏覽器在收到HTML,CSS,JS文件後,它是如何把頁面呈現到屏幕上的?下圖對應的就是WebKit渲染的過程。 瀏覽器是一個邊解析邊渲染的過程。首先瀏覽器解析HTML文件構建DOM樹,而後解析CSS文件構建渲染樹,等到渲染樹構建完成後,瀏覽器開始佈局渲染樹並將其繪製到屏幕上。
JS的解析是由瀏覽器中的JS解析引擎完成的。JS是單線程運行,也就是說,在同一個時間內只能作一件事,全部的任務都須要排隊,前一個任務結束,後一個任務才能開始。可是又存在某些任務比較耗時,如IO讀寫等,因此須要一種機制能夠先執行排在後面的任務,這就是:同步任務(synchronous)和異步任務(asynchronous)。JS的執行機制就能夠看作是一個主線程加上一個任務隊列(task queue)。同步任務就是放在主線程上執行的任務,異步任務是放在任務隊列中的任務。全部的同步任務在主線程上執行,造成一個執行棧;異步任務有了運行結果就會在任務隊列中放置一個事件;腳本運行時先依次運行執行棧,而後會從任務隊列裏提取事件,運行任務隊列中的任務,這個過程是不斷重複的,因此又叫作事件循環(Event loop)。 ![]()
瀏覽器在解析過程當中,若是遇到請求外部資源時,如圖像,iconfont,JS等。瀏覽器將重複下載該資源。請求過程是異步的,並不會影響HTML文檔進行加載,可是當文檔加載過程當中遇到JS文件,HTML文檔會掛起渲染過程,不只要等到文檔中JS文件加載完畢還要等待解析執行完畢,纔會繼續HTML的渲染過程。緣由是由於JS有可能修改DOM結構,這就意味着JS執行完成前,後續全部資源的下載是沒有必要的,這就是JS阻塞後續資源下載的根本緣由。CSS文件的加載不影響JS文件的加載,可是卻影響JS文件的執行。JS代碼執行前瀏覽器必須保證CSS文件已經下載並加載完畢。
四次揮手 (四次揮手的具體內容請參考個人文章)
以上內容由於涉及的內容比較多,因此還有好多不足之處須要補充,在此請多多見諒