(轉) 用戶訪問網站基本流程及原理(史上最全,沒有之一)
用戶訪問網站基本流程及原理(史上最全,沒有之一)
原文:http://blog.csdn.net/yonggeit/article/details/72857630
目錄(?)[-]
- 用戶訪問網站流程框架
- DNS解析原理
- tcpip三次握手
- osi參考模型
- TCPIP模型處理過程
- 以太網的數據鏈路大致流程
- 路由解析
- 靜態路由
- 動態路由
- 路由算法
- http協議原理www服務請求過程請求細節報文細節
- 大規模網站集群架構細節
- http協議原理www服務響應過程響應細節報文細節
- HTTP報文結構
- HTTP11規範定義了如下47種首部字段
- tcpip四次揮手過程
- 持久連接
- 針對Web應用的攻擊模式
- 跨站腳本攻擊XSS
- SQL註入攻擊
- OS命令註入攻擊
- HTTP首部註入攻擊
- 因會話管理疏忽引發的安全漏洞
- DoS攻擊
[TOC]
用戶訪問網站流程框架
第一步:客戶端用戶從瀏覽器輸入www.baidu.com網站網址後回車,系統會查詢本地hosts文件及DNS緩存信息,查找是否存在網址對應的IP解析記錄。如果有就直接獲取到IP地址,然後訪問網站,一般第一次請求時,DNS緩存是沒有解析記錄的;
第二步:如果客戶端沒有DNS緩存或hosts沒有對應www.baidu.com網站網址的域名解析記錄,那麽,系統會把瀏覽器的解析請求,交給客戶端本地設置的DNS服務器地址解析(此DNS為LDNS,即Local DNS),如果LDNS服務器的本地緩存有對應的解析記錄,就會直接返回IP地址;如果沒有,LDNS會負責繼續請求其它的DNS服務器;
第三步:LDNS會從DNS系統的“.”根開始請求www.baidu.com域名的解析,經過一系列的查找各個層次DNS服務器,最終會查找到www.baidu.com域名對應的授權DNS服務器,而這個授權DNS服務器,正是該企業購買域名時用於管理域名解析的服務器。這個服務器有www.baidu.com對應的IP解析記錄,如果此時都沒有,就表示企業的運維人員麽有給www.baidu.com域名做解析;
第四步:baidu.com域名對應的授權DNS服務器會把www.baidu.com對應的最終IP解析記錄發給LDNS;
第五步:LDNS把收到來自授權DNS服務器關於www.baidu.com對應的IP解析記錄發給客戶端瀏覽器,並且在LDNS本地把域名和IP的對應解析緩存起來,以便下一次更快的返回相同的解析請求的記錄;
第六步:客戶端瀏覽器獲取到了www.baidu.com的對應IP地址,接下來瀏覽器會請求獲得的IP地址對應的Web服務器,Web服務器接收到客戶的請求並響應處理,將客戶請求的內容返回給客戶端瀏覽器;
至此,一次訪問瀏覽網頁的完整過程就完成了。
DNS解析原理
dns解析的流程:計算機之間只能通過ip相互通信,因為ip不好記,於是才使用dns服務器把域名解析為相應的ip,這裏以解析www.baidu.com為例,當我們輸入這個網址回車的時候,瀏覽器會首先查詢瀏覽器的緩存,這個緩存存活時間可能只有1分鐘,如果沒找到,則去查詢本地的dns緩存和hosts文件,如果有www.baidu.com這個域名對應的ip,則直接通過這個ip訪問網站服務器。如果本地的dns緩存和hosts文件沒找到,這時候就會把請求發送給,網卡配置信息裏的dns服務器,默認有兩個,只有當dns1不能訪問時,才會使用dns2。我們也稱網卡配置信息裏的dns為local dns,這時候local dns會先查詢它的緩存,有沒有www.baidu.com相應的記錄,如果有,則返回給用戶,如果沒有,就會訪問根域名服務器,世界一共有13臺根域名服務器,根域名服務器一看,是找.com的,於是會把.com的頂級域名服務器的ip發送給local dns,這時local dns再次訪問.com的頂級域名服務器,.com的頂級域名服務器一看,是找一級域名baidu.com的,於是再將baidu.com的ip發送給local dns,然後繼續往下找,直到找到www.baidu.com的權威dns的A記錄或者cname,這時候local dns會把找到的www.baidu.com的ip發送給客戶端,並記錄在緩存中,這樣的話,下次如果有其他的用戶訪問www.baidu.com這個域名時,local dns的緩存中就有記錄了。客戶端收到local dns發送過來的ip就會通過ip去訪問服務器,並將這個ip記錄在dns緩存中。
tcp/ip三次握手
通過dns解析之後,拿到了ip,就可以通過ip向服務器發送http請求了,因為http是工作在第七層應用層,tcp是工作在第四層傳輸層,所以發生http請求之前,還會進行tcp的三次握手。
tcp的三次握手是:客戶端首先向服務器發送一個帶有SYN標識和一個seq的隨機數,服務端收到後,需要給客戶端回應一個ack,ack的值就是剛才的seq隨機數的值+1,在回應包裏,還包含一個SYN的標識和一個seq隨機數。客戶端收到服務端發過來的回應包之後,再給服務端發送一個ack,ack的值就是剛才服務端發過來的seq的值+1。上面三步完成之後,三次握手就完成了,下面就可以開始傳數據了
osi參考模型
TCP/IP模型處理過程
以太網的數據鏈路大致流程
路由解析:
靜態路由
動態路由
路由算法
http協議原理(www服務請求過程)請求細節,報文細節
這裏就是開始發送http請求報文了
http的請求報文,主要包括,請求行,請求頭部,空行,請求主體
而請求行又包括,請求方法,url,協議版本,請求方法主要有GET、HEAD、POST、PUT、DELETE、MOVE,url就是統一資源定位符,通過這個能在服務器上找到唯一的網頁資源,協議版本,目前主流的是http1.1,開始流行的協議版本是http1.0,相對應http1.0,http1.1主要從可擴展性、緩存處理、帶寬優化、持久連接、host頭、錯誤通知、消息傳遞、內容協商等多方面做了一些優化,以上是請求行的內容
再來說一些,請求頭部,請求頭部主要有媒體類型,語言類型、支持壓縮、客戶端類型、主機名等,媒體類型主要有文本文件,圖片文件,視頻文件等,語言類型就是告訴服務器客戶端的接受的語言,支持壓縮的話,可以節省帶寬,客戶端類型,會顯示客戶端瀏覽器的版本信息,操作系統信息等
空行,代表請求頭部的結束,也代表著請求主體的開始
請求報文主體,只有使用POST提交表單的時候才有
大規模網站集群架構細節
常見的網頁資源有三種,分別是靜態網頁,動態網頁,偽靜態
靜態網頁就是沒有後臺數據庫,不含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等,另外數據庫還需要做讀寫分離等優化,後面的過程與訪問動態網頁類似
http協議原理(www服務響應過程)響應細節,報文細節
對應的,服務器收到請求報文之後,就會給出響應報文
響應報文主要包含起始行、響應頭部、空行、響應報文主體
起始行一般包含http版本號,數字狀態碼,狀態情況
而數字狀態碼,常見有以下幾種
200 代表ok
301 永久跳轉
403 沒權限
404 沒有這個文件
500 未知的錯誤
502 網關錯誤
503 服務器超載,停機維護
504 網關超時
響應頭部,主要包括,服務器的web軟件版本,服務器時間,長連接還是短連接,設置字符集等等
這裏的空行和請求報文空行一樣
HTTP報文結構
(1)HTTP報文大致可以分為報文首部和報文主體兩塊
(2)請求報文和響應報文的結構實例
HTTP/1.1規範定義了如下47種首部字段
(1)通用首部字段
(2)請求首部字段
(3)響應首部字段
(4)實體首部字段
tcp/ip四次揮手過程
當瀏覽器加載一個完整的頁面時,還需要與服務器斷開連接,這個過程就是tcp的四次揮手
首先客戶端會發送一個帶有FIN標識和一個seq隨機數,服務端收到之後,會回應一個ack,ack的值等於剛才的seq的值+1,發送之後,服務器會再發一個包,這個包裏面也帶有FIN標識和一個seq隨機數,客戶端收到之後,回應一個ack,ack的值等於剛才的seq值+1,以上完成之後,服務器和客戶端的4次揮手就完成了!
持久連接
在HTTP協議的初始版本中,每進行一次HTTP通信就要斷開一次TCP連接。因此,每次的請求都會造成無謂的TCP連接建立與斷開,增加通信量的開銷。為了解決這個問題,HTTP/1.1想出了持久連接(也稱為HTTP keep-alive),其特點是:只要任意一端沒有明確提出斷開連接,則保持TCP連接狀態。
針對Web應用的攻擊模式
(1)主動攻擊:攻擊者通過直接訪問Web應用,把攻擊代碼傳入的攻擊模式。最具典型的攻擊就是 SQL註入攻擊和OS命令註入攻擊。
(2)被動攻擊:利用圈套策略執行攻擊代碼地攻擊模式,在被動攻擊過程中,攻擊者不直接對目標Web應用訪問發起攻擊。
跨站腳本攻擊(XSS)
跨站腳本攻擊(Cross-Site Scripting,XSS)是指通過存在安全漏洞的Web網站註冊用戶的瀏覽器內運行非法的HTML標簽或者JavaScript腳本進行攻擊的一種攻擊。
跨站腳本攻擊可以造成以下影響:
(1)利用虛假輸入表單騙取用戶個人信息。
(2)利用腳本竊取用戶的Cookie值,被害者在不知情的情況下,幫助攻擊者發送惡意請求。
(3)顯示偽造的文章或者圖片。
SQL註入攻擊
SQL註入(SQL Injection)是指針對Web應用使用的數據庫,通過運行非法的SQL而產生的攻擊。該安全隱患有可能引起極大地威脅,有時會直接導致個人信息及機密信息的泄露。
SQL註入攻擊有可能造成以下影響:
(1)非法查看或篡改數據庫內的數據。
(2)規避認證。
(3)執行和數據庫服務器業務關聯的程序等。
OS命令註入攻擊
OS命令註入攻擊是指通過Web應用,執行非法的操作系統命令達到攻擊的目的。只要在能調用Shell函數的地方就有存在被攻擊的風險。
HTTP首部註入攻擊
HTTP首部註入攻擊是指攻擊者通過在響應首部字段內插入換行,添加任意響應首部或主題的一種攻擊。屬於被動攻擊模式。
因會話管理疏忽引發的安全漏洞
(1)會話劫持:攻擊者通過某種手段拿到了用戶的會話ID,並非法使用此會話ID偽裝成用戶,達到攻擊的目的。
(2)會話固定攻擊:強制用戶使用攻擊者指定的會話ID,屬於被動攻擊。
(3)跨站點請求偽造(Cross-Site Request Forgeries,CSRF):攻擊者通過設置好的陷阱,強制對已完成認證的用戶進行非預期的個人信息或設定信息等某些狀態更新,屬於被動攻擊。
CSRF有可能造成以下影響:
1、利用已通過認證的用戶權限更新設定信息等;
2、利用已通過認證的用戶權限購買商品;
3、利用已通過認證的用戶權限在留言板上發表言論等;
DoS攻擊
DoS攻擊(Denial of Service attack)是一種讓運行中的服務呈停止狀態的攻擊。有時也叫作服務停止或拒絕服務攻擊。主要有以下兩種DoS攻擊方式:
(1)集中利用訪問請求造成資源過載,資源用盡的同時,實際上也就呈停止狀態。
單純來講,就是發送大量的合法請求,服務器很難分辨何為正常請求,何為攻擊請求,因此很難防止DoS攻擊。多臺計算機發起的DoS攻擊成為DDoS攻擊(Distributed Denial of Service attack),DDoS攻擊通常利用那些感染病毒的計算機作為攻擊者的攻擊跳板。
(2)通過攻擊安全漏洞使服務停止。
(轉) 用戶訪問網站基本流程及原理(史上最全,沒有之一)