(轉) 用戶訪問網站基本流程及原理(史上最全,沒有之一)

 

[TOC] 
這裏寫圖片描述web

 用戶訪問網站流程框架

第一步:客戶端用戶從瀏覽器輸入www.baidu.com網站網址後回車,系統會查詢本地hosts文件及DNS緩存信息,查找是否存在網址對應的IP解析記錄。若是有就直接獲取到IP地址,而後訪問網站,通常第一次請求時,DNS緩存是沒有解析記錄的;redis

第二步:若是客戶端沒有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域名作解析;sql

第四步: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有可能形成如下影響: 
一、利用已經過認證的用戶權限更新設定信息等; 
二、利用已經過認證的用戶權限購買商品; 
三、利用已經過認證的用戶權限在留言板上發表言論等;

DoS攻擊

  DoS攻擊(Denial of Service attack)是一種讓運行中的服務呈中止狀態的攻擊。有時也叫做服務中止或拒絕服務攻擊。主要有如下兩種DoS攻擊方式:   (1)集中利用訪問請求形成資源過載,資源用盡的同時,實際上也就呈中止狀態。   單純來說,就是發送大量的合法請求,服務器很難分辨何爲正常請求,何爲攻擊請求,所以很難防止DoS攻擊。多臺計算機發起的DoS攻擊成爲DDoS攻擊(Distributed Denial of Service attack),DDoS攻擊一般利用那些感染病毒的計算機做爲攻擊者的攻擊跳板。   (2)經過攻擊安全漏洞使服務中止。

相關文章
相關標籤/搜索