天天看點

使用者通路網站原理及流程

描述從浏覽器打開http://www.baidu.com位址回車發送請求到看到頁面的過程?

打開浏覽器輸入網址回車,到看到頁面的過程

大綱:

1、使用者通路網站流程架構

2、DNS解析原理 *****

當我們打開浏覽器輸入網址回車,到看到網頁頁面,主要有兩大步驟:

第一,将域名解析成ip的過程;

第二,通過ip找到網站伺服器,請求打開具體的網頁,伺服器響應請求,用戶端浏覽器收到響應封包後,渲染html文檔,最終得到我們看到的網頁頁面。

首先:說一下dns解析的流程,大家都知道,計算機之間隻能通過ip互相通信,因為ip不好記,于是才使用dns伺服器把域名解析為相應的ip,這裡以解析www.oldboyedu.com為例,當我們輸入這個網址回車的時候,浏覽器會首先查詢浏覽器的緩存,這個緩存存活時間可能隻有1分鐘,如果沒找到,則去查詢本地的dns緩存和hosts檔案,如果有www.oldboyedu.com這個域名對應的ip,則直接通過這個ip通路網站伺服器。如果本地的dns緩存和hosts檔案沒找到,這時候就會把請求發送給,網卡配置資訊裡的dns伺服器,預設有兩個,隻有當dns1不能通路時,才會使用dns2。我們也稱網卡配置資訊裡的dns為local dns,這時候local dns會先查詢它的緩存,有沒有www.oldboyedu.com相應的記錄,如果有,則傳回給使用者,如果沒有,就會通路根域名伺服器,世界一共有13台根域名伺服器,根域名伺服器一看,是找.com的,于是會把.com的頂級域名伺服器的ip發送給local dns,這時local dns再次通路.com的頂級域名伺服器,.com的頂級域名伺服器一看,是找一級域名oldboyedu.com的,于是再将oldboyedu.com的ip發送給local dns,然後繼續往下找,直到找到www.oldboyedu.com的權威dns的A記錄或者cname,這時候local dns會把找到的www.oldboyedu.com的ip發送給用戶端,并記錄在緩存中,這樣的話,下次如果有其他的使用者通路www.oldboyedu.com這個域名時,local dns的緩存中就有記錄了。用戶端收到local dns發送過來的ip就會通過ip去通路伺服器,并将這個ip記錄在dns緩存中。

以上就是dns解析的原理。

3、tcp/ip三次握手原理 *****

通過dns解析之後,拿到了ip,就可以通過ip向伺服器發送http請求了,因為http是工作在第七層應用層,tcp是工作在第四層傳輸層,是以發生http請求之前,還會進行tcp的三次握手。

tcp的三次握手是:用戶端首先向伺服器發送一個帶有SYN辨別和一個seq的随機數,服務端收到後,需要給用戶端回應一個ack,ack的值就是剛才的seq随機數的值+1,在回應包裡,還包含一個SYN的辨別和一個seq随機數。用戶端收到服務端發過來的回應包之後,再給服務端發送一個ack,ack的值就是剛才服務端發過來的seq的值+1。上面三步完成之後,三次握手就完成了,下面就可以開始傳資料了

4、http協定原理(www服務的請求過程)請求封包細節!

http的請求封包,主要包括,請求行,請求頭部,空行,請求主體

而請求行又包括,請求方法,url,協定版本,請求方法主要有GET、HEAD、POST、PUT、DELETE、MOVE,url就是統一資源定位符,通過這個能在伺服器上找到唯一的網頁資源,協定版本,目前主流的是http1.1,開始流行的協定版本是http1.0,相對應http1.0,http1.1主要從可擴充性、緩存處理、帶寬優化、持久連接配接、host頭、錯誤通知、消息傳遞、内容協商等多方面做了一些優化,以上是請求行的内容

再來說一些,請求頭部,請求頭部主要有媒體類型,語言類型、支援壓縮、用戶端類型、主機名等,媒體類型主要有文本檔案,圖檔檔案,視訊檔案等,語言類型就是告訴伺服器用戶端的接受的語言,支援壓縮的話,可以節省帶寬,用戶端類型,會顯示用戶端浏覽器的版本資訊,作業系統資訊等

空行,代表請求頭部的結束,也代表着請求主體的開始

請求封包主體,隻有使用POST送出表單的時候,才有

對應的,伺服器收到請求封包之後,就會給出響應封包

響應封包主要包含起始行、響應頭部、空行、響應封包主體

起始行一般包含http版本号,數字狀态碼,狀态情況

而數字狀态碼,常見有以下幾種

200 代表ok

301 永久跳轉

302 臨時跳轉

403 沒權限

404 沒有這個檔案

500 未知的錯誤

502 網關錯誤

503 伺服器超載,停機維護

504 網關逾時

響應頭部,主要包括,伺服器的web軟體版本,伺服器時間,長連接配接還是短連接配接,設定字元集等等

這裡的空行和請求封包空行一樣

在封包主體中包裝載了要傳回給用戶端的資料

5、大規模網站叢集架構細節。

常見的網頁資源有三種,分别是靜态網頁,動态網頁,僞靜态

靜态網頁就是沒有背景資料庫,不含php,jsp,asp等程式,不可互動的,開發者編寫的是啥,顯示的就是啥,不會有任何改變

動态網頁,有背景資料庫,支援更多的功能,如使用者注冊,登入,發帖,訂單,部落格等,動态網頁并不獨立存在于伺服器上的網頁檔案,而是當使用者請求伺服器上的動态程式時,伺服器解析這些程式,并調用資料庫來傳回一個完整的網頁内容,它跟靜态網頁的url不同,它的url中包含?、&等特殊符号,搜尋引擎收錄的時候存在一定的問題。動态網頁為了友善收錄,常常會利用rewrite技術,把動态網頁的URL僞裝成靜态網頁URL,這就是僞靜态。

不同的網頁資源,打開的流程不一樣,下面假設我們通路的是一個靜态網站:

用戶端會通過http協定,下載下傳伺服器上的html檔案,然後去讀這個html檔案,根據html頁面中的連結,自上而下的請求,每一個請求是一個連結,如果是圖檔的話,會下載下傳邊渲染,遇到js,就會加載js,當js比較内容較複雜時,浏覽器就會等待,滑鼠在轉圈,我們稱這個為js阻塞,當js下載下傳完畢并執行完成之後,才會顯示我們看到的網頁。

當我們通路的是一個動态網頁時,首先使用者發出一個請求,伺服器收到這個請求之後,這裡假設伺服器使用的是nginx,nginx會把這個請求轉給php,php就會去查詢資料庫,根據資料庫傳回的值,生成一個完整的網頁内容,發送給使用者,使用者收到之後,也是邊下載下傳邊渲染,加載js,執行完畢之後,才會顯示我們看到的網頁

當伺服器的通路量達到億級PV時,這個通路的過程就更複雜了,使用者的請求會先通路全國的CDN節點,通過CDN擋住全國80%的請求,當CDN上沒有時,在通路伺服器叢集,這個叢集一般都有一個4層的代理,這個4層的代理,使用軟體來完成的話,就是LVS,使用硬體就是F5,4層的代理,後面才是7層的負載均衡,常用的是haproxy,nginx,然後才是多台web伺服器,web伺服器比較多的時候,就有兩個問題,一個是使用者資料的一緻性,不能因為不同的web伺服器提供服務,而導緻資料不同步,這時候,我們就需要使用NFS共享存儲,第二個問題是session,不能因為不同的web伺服器提供服務,session找不到了,這時候,我們就需要使用memcached來存放并共享session。由于使用者通路量太大,這時候的瓶頸就是資料庫的壓力,我們一般都是使用分布式緩存memcache,redis等,另外資料庫還需要做讀寫分離等優化,後面的過程與通路動态網頁類似

6、http協定原理(www服務的響應過程)響應封包細節!

跟請求類似

7、tcp/ip四次揮手過程原理 *****

當浏覽器加載一個完整的頁面時,還需要與伺服器斷開連接配接,這個過程就是tcp的四次揮手

首先用戶端會發送一個帶有FIN辨別和一個seq随機數,服務端收到之後,會回應一個ack,ack的值等于剛才的seq的值+1,發送之後,伺服器會再發一個包,這個包裡面也帶有FIN辨別和一個seq随機數,用戶端收到之後,回應一個ack,ack的值等于剛才的seq值+1,以上完成之後,伺服器和用戶端的4次揮手就完成了!

本文轉自淺景塵51CTO部落格,原文連結:http://blog.51cto.com/857803451/1951887 ,如需轉載請自行聯系原作者