用戶訪問網站原理及流程


描述從瀏覽器打開spacer.gifhttp://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,這里以解析spacer.gifwww.oldboyedu.com為例,當我們輸入這個網址回車的時候,瀏覽器會首先查詢瀏覽器的緩存,這個緩存存活時間可能只有1分鍾,如果沒找到,則去查詢本地的dns緩存和hosts文件,如果有spacer.gifwww.oldboyedu.com這個域名對應的ip,則直接通過這個ip訪問網站服務器。如果本地的dns緩存和hosts文件沒找到,這時候就會把請求發送給,網卡配置信息里的dns服務器,默認有兩個,只有當dns1不能訪問時,才會使用dns2。我們也稱網卡配置信息里的dns為local dns,這時候local dns會先查詢它的緩存,有沒有spacer.gifwww.oldboyedu.com相應的記錄,如果有,則返回給用戶,如果沒有,就會訪問根域名服務器,世界一共有13台根域名服務器,根域名服務器一看,是找.com的,於是會把.com的頂級域名服務器的ip發送給local dns,這時local dns再次訪問.com的頂級域名服務器,.com的頂級域名服務器一看,是找一級域名spacer.gifoldboyedu.com的,於是再將spacer.gifoldboyedu.com的ip發送給local dns,然后繼續往下找,直到找到spacer.gifwww.oldboyedu.com的權威dns的A記錄或者cname,這時候local dns會把找到的spacer.gifwww.oldboyedu.com的ip發送給客戶端,並記錄在緩存中,這樣的話,下次如果有其他的用戶訪問spacer.gifwww.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次揮手就完成了!

 


spacer.gif

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM