1. 程式人生 > >使用者訪問一個網站的過程描述

使用者訪問一個網站的過程描述

描述從瀏覽器開啟http://www.baidu.com地址回車傳送請求到看到頁面的過程?
開啟瀏覽器輸入網址回車,到看到頁面的過程
大綱:
1、使用者訪問網站流程框架
2、DNS解析原理 *****
3、tcp/ip三次握手原理 *****
4、http協議原理(www服務的請求過程)請求報文細節!
5、大規模網站叢集架構細節。
6、http協議原理(www服務的響應過程)響應報文細節!
7、tcp/ip四次揮手過程原理 *****

當我們開啟瀏覽器輸入網址回車,到看到網頁頁面,主要有兩大步驟:第一,將域名解析成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解析的原理。
通過dns解析之後,拿到了ip,就可以通過ip向伺服器傳送http請求了,因為http是工作在第七層應用層,tcp是工作在第四層傳輸層,所以發生http請求之前,還會進行tcp的三次握手。
tcp的三次握手是:客戶端首先向伺服器傳送一個帶有SYN標識和一個seq的隨機數,服務端收到後,需要給客戶端迴應一個ack,ack的值就是剛才的seq隨機數的值+1,在迴應包裡,還包含一個SYN的標識和一個seq隨機數。客戶端收到服務端發過來的迴應包之後,再給服務端傳送一個ack,ack的值就是剛才服務端發過來的seq的值+1。上面三步完成之後,三次握手就完成了,下面就可以開始傳資料了
這裡就是開始傳送http請求報文了

http的請求報文,主要包括,請求行,請求頭部,空行,請求主體
而請求行又包括,請求方法,url,協議版本,請求方法主要有GET、HEAD、POST、PUT、DELETE、MOVE,url就是統一資源定位符,通過這個能在伺服器上找到唯一的網頁資源,協議版本,目前主流的是http1.1,開始流行的協議版本是http1.0,相對應http1.0,http1.1主要從可擴充套件性、快取處理、頻寬優化、持久連線、host頭、錯誤通知、訊息傳遞、內容協商等多方面做了一些優化,以上是請求行的內容
再來說一些,請求頭部,請求頭部主要有媒體型別,語言型別、支援壓縮、客戶端型別、主機名等,媒體型別主要有文字檔案,圖片檔案,視訊檔案等,語言型別就是告訴伺服器客戶端的接受的語言,支援壓縮的話,可以節省頻寬,客戶端型別,會顯示客戶端瀏覽器的版本資訊,作業系統資訊等
空行,代表請求頭部的結束,也代表著請求主體的開始
請求報文主體,只有使用POST提交表單的時候,才有
對應的,伺服器收到請求報文之後,就會給出響應報文

響應報文主要包含起始行、響應頭部、空行、響應報文主體
起始行一般包含http版本號,數字狀態碼,狀態情況
而數字狀態碼,常見有以下幾種
200 代表ok
301 永久跳轉
403 沒許可權
404 沒有這個檔案
500 未知的錯誤
502 閘道器錯誤
503 伺服器超載,停機維護
504 閘道器超時
響應頭部,主要包括,伺服器的web軟體版本,伺服器時間,長連線還是短連線,設定字符集等等
這裡的空行和請求報文空行一樣
在報文主體中包裝載了要返回給客戶端的資料

常見的網頁資源有三種,分別是靜態網頁,動態網頁,偽靜態
靜態網頁就是沒有後臺數據庫,不含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等,另外資料庫還需要做讀寫分離等優化,後面的過程與訪問動態網頁類似

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

首先客戶端會發送一個帶有FIN標識和一個seq隨機數,服務端收到之後,會迴應一個ack,ack的值等於剛才的seq的值+1,傳送之後,伺服器會再發一個包,這個包裡面也帶有FIN標識和一個seq隨機數,客戶端收到之後,迴應一個ack,ack的值等於剛才的seq值+1,以上完成之後,伺服器和客戶端的4次揮手就完成了!

reference:http://www.cnblogs.com/jinbiaof/p/6844293.html