http://www.hackdig.com/ http://www.hackdig.com/07/hack-47475.htm http://www.cnblogs.com/yuteng/articles/1904215.html http://blog.csdn.net/bpingchang/article/details/51328941 http://blog.csdn.net/boer521314/article/details/41460865
當一個用戶在瀏覽器裏輸入www.google.com這個URL時,將會發生以下操做css
1 首先,瀏覽器會請求DNS把這個域名解析成對應的IP地址; 2 而後,根據這個IP地址在互聯網上找到對應的服務器,創建Socket鏈接,向這個服務器發起一個HTTP Get請求,由這個服務器決定返回默認的數據資源給訪問的用戶; 3 在服務器端實際上還有複雜的業務邏輯:服務器可能有多臺,到底指定哪臺服務器處理請求,這須要一個負載均衡設備來平均分配全部用戶的請求; 4 還有請求的數據是存儲在分佈式緩存裏仍是一個靜態文件中,或是在數據庫裏; 5 當數據返回瀏覽器時,瀏覽器解析數據發現還有一些靜態資源(如:css,js或者圖片)時又會發起另外的HTTP請求,而這些請求可能會在CDN上,那麼CDN服務器又會處理這個用戶的請求;
最重要的就是要熟悉HTTP協議中的HTTP Header,HTTP Header控制着互聯網上成千上萬的用戶的數據傳輸。最關鍵的是,它控制着用戶瀏覽器的渲染行爲和服務器的執行邏輯。
200: 成功,請求數據經過響應報文的entity-body部分發送;OK
301: 請求的URL指向的資源已經被刪除;但在響應報文中經過首部Location指明瞭資源在所處的新位置; Moved Permanently
302: 與301類似,但在響應報文中經過Location指明資源如今所處臨時新位置; Moved Temporarily
304: 客戶端發出了條件式請求,但服務器上的資源不曾發生改變,則經過響應此響應狀態碼通知客戶端; Not Modified
401: 須要輸入帳號和密碼認證方能訪問資源; Unauthorized
403: 請求被禁止; Forbidden
404: 服務器沒法找到客戶端請求的資源; Not Found
500: 服務器內部錯誤; Internal Server Error
502: 代理服務器從後端服務器收到了一條僞響應,如沒法鏈接到父網關; Bad Gatewayhtml
當咱們使用Ctrl+F5組合鍵刷新一個頁面時,首先是在瀏覽器端,會直接向目標URL發送請求,而不會使用瀏覽器緩存的數據;其次即便請求發送到服務端,也有可能訪問到的是緩存的數據。因此在HTTP的請求頭中會增長一些請求頭,它告訴服務端咱們要獲取最新的數據而非緩存。最重要的是在請求頭中增長了兩個請求項Pragma:no-cache和Cache-Control:no-cache。
1 Cache-Control/Pragma這個HTTP Head字段用於指定全部緩存機制在整個請求/響應鏈中必須服從的指令,若是知道該頁面是否爲緩存,不只能夠控制瀏覽器,還能夠控制和HTTP協議相關的緩存或代理服務器。Http Head字段的可選值: nginx
Cache-Control請求字段被各個瀏覽器支持的較好,並且它的優先級也比較高,它和其餘一些請求字段(如Expires)同時出現時,Cache-Control會覆蓋其餘字段。數據庫
Pragma字段的做用和Cache-Control有點相似,它也是在HTTP頭中包含一個特殊的指令,使相關的服務器來遵照,最經常使用的就是Pragma:no-cache,它和Cache-Control:no-cache的做用是同樣的。後端
2 Expires 緩存過時時間Expires一般的使用格式是Expires:Sat,25 Feb 2012 12:22:17 GMT,後面跟着一個日期和時間,超過這個值後,緩存的內容將失效,也就是瀏覽器在發出請求以前檢查這個頁面的這個字段,看該頁面是否已通過期了,過時了將從新向服務器發起請求。瀏覽器
3 Last-Modified/Etag 最後修改時間Last-Modified字段通常用於表示一個服務器上的字段的最後修改時間,資源能夠是靜態(靜態內容自動加上Last-Modified)或者動態的內容(如Servlet提供了一個getLastModified方法用於檢查某個動態內容是否已經更新),經過這個最後修改時間能夠判斷當前請求的資源是不是最新的。通常服務器端在響應頭中返回一個Last-Modified字段,告訴瀏覽器這個頁面的最後修改時間,如:Sat,25 Feb 2012 12:55:04 GMT,瀏覽器再次請求時在請求頭中增長一個If-Modified-Since:Sat,25 Feb 2012 12:55:04 GMT字段,詢問當前緩存的頁面是不是最新的,若是是最新的就會返回304狀態碼,告訴瀏覽器是最新的,服務器也不會傳輸新的數據。緩存
與Last-Modified字段有相似功能的還有一個Etag字段,這個字段的做用是讓服務端給每一個頁面分配一個惟一編號,而後經過這個編號來區分當前這個頁面是不是最新的。這種方式比使用Last-Modified更加靈活,可是在後端的Web服務器有多臺時比較難處理,由於每一個Web服務器都要記住網站的全部資源編號,不然瀏覽器返回這個編號就沒有意義了。安全
瀏覽器自己是一個客戶端,當你輸入URL的時候,首先瀏覽器會去請求DNS服務器,經過DNS獲取相應的域名對應的IP,而後經過IP地址找到IP對應的服務器後,要求創建TCP鏈接,等瀏覽器發送完HTTP Request(請求)包後,服務器接收到請求包以後纔開始處理請求包,服務器調用自身服務,返回HTTP Response(響應)包;客戶端收到來自服務器的響應後開始渲染這個Response包裏的主體(body),等收到所有的內容隨後斷開與該服務器之間的TCP鏈接。
Web服務器的工做原理能夠簡單地概括爲服務器
瀏覽器經過DNS域名解析到服務器IP;網絡
客戶機經過TCP/IP協議創建到服務器的TCP鏈接;
客戶端向服務器發送HTTP協議請求包,請求服務器裏的資源文檔;
服務器向客戶機發送HTTP協議應答包,若是請求的資源包含有動態語言的內容,那麼服務器會調用動態語言的解釋引擎負責處理「動態內容」,並將處理獲得的數據返回給客戶端;
客戶機與服務器斷開。由客戶端解釋HTML文檔,在客戶端屏幕上渲染圖形結果;
當用戶在瀏覽器中輸入域名,如:www.google.com,並按下回車後,DNS解析過程大致以下
(1)瀏覽器先查緩存,若緩存中有域名對應IP地址,則解析結束。(存活時間TTL) (2)若瀏覽器緩存中沒有,瀏覽器會查詢操做系統中緩存緩存是否有這個域名對應的DNS解析結果。(hosts 文件) (3)若是在本機中仍然沒法完成域名的解析,則會真正請求域名服務器來解析這個域名了。操做系統會把域名發送給設置的LDNS(cat /etc/resolv.conf)。 (4)若LDNS沒有命中,就直接到Root Server域名服務器請求解析。 (5)根域名服務器返回本地域名服務器一個所查詢域的主域名服務器(gTLD Server)地址。GTLD是國際頂級域名服務器,如.com、.cn、.org等,全球只有13臺左右。 (6)本地域名服務器(Local DNS Server)再向上一步返回的GTLD服務器發送請求。 (7)接受請求的GTLD服務器查找並返回此域名對應的Name Server域名服務器,這個Name Server一般就是你註冊的域名服務器,例如你在某個域名服務提供商申請的域名,那麼這個域名解析任務就有這個域名提供商的服務器來完成。 (8)Name Server返回IP記錄和TTL(緩存時間)。 (9)LDNS緩存該記錄,緩存時間有TTL控制。 (10)解析結果返回給用戶,用戶根據TTL值緩存在本地系統緩存中,域名解析過程結束。
1 A記錄,A表明的是Address,用來指定域名對應的IP地址如將item.taobao.com指定到115.238.23.241,將switch.taobao.com指定到121.14.24.241。A記錄能夠將多個域名解析到一個IP地址,可是不能將一個域名解析到多個IP地址。 2 MX記錄,表示的是Mail Exchange,就是能夠將某個域名下的郵件服務器指向本身的Mail Server如taobao.com域名的A記錄IP地址是115.238.25.245,若是MX記錄設置爲115.238.25.246,是xxx@taobao.com的郵件路由,DNS會將郵件發送到115.238.25.246所在的服務器,而正常經過Web請求的話仍然解析到A記錄的IP地址。 3 CNAME記錄,全稱是Canonical Name(別名解析),所謂的別名解析就是能夠爲一個域名設置一個或者多個別名如將taobao.com解析到xulingbo.net,將srcfan.com也解析到xulingbo.net,其中xulingbo.net分別是taobao.com和srcfan.com的別名。前面的跟蹤域名解析中的「www.taobao.com. 1542 IN CNAME www.gslb.taobao.com」就是CNAME解析。 4 NS記錄,爲某個域名指定DNS解析服務器,也就是這個域名有指定的IP地址的DNS服務器去解析前面的「google.com. 172800 IN NS ns4.google.com.」就是NS解析。 5 TXT記錄,爲某個主機名或域名設置說明如能夠爲google.com設置TXT記錄爲「谷歌|中國」這樣的說明。
拿到域名對應的IP地址以後,User-Agent(通常是指瀏覽器)會以一個隨機端口(1024 < 端口 < 65535)向服務器的WEB程序(經常使用的有httpd,nginx等)80端口發起TCP的鏈接請求。這個鏈接請求(原始的http請求通過TCP/IP4層模型的層層封包)到達服務器端後(這中間經過各類路由設備,局域網內除外),進入到網卡,而後是進入到內核的TCP/IP協議棧(用於識別該鏈接請求,解封包,一層一層的剝開),還有可能要通過Netfilter防火牆(屬於內核的模塊)的過濾,最終到達WEB程序,最終創建了TCP/IP的鏈接。
Client首先發送一個鏈接試探,ACK=0 表示確認號無效,SYN = 1 表示這是一個鏈接請求或鏈接接受報文,同時表示這個數據報不能攜帶數據,seq = x 表示Client本身的初始序號(seq = 0 就表明這是第0號包),這時候Client進入syn_sent狀態,表示客戶端等待服務器的回覆。
Server監聽到鏈接請求報文後,如贊成創建鏈接,則向Client發送確認。TCP報文首部中的SYN 和 ACK都置1 ,ack = x + 1表示指望收到對方下一個報文段的第一個數據字節序號是x+1,同時代表x爲止的全部數據都已正確收到(ack=1實際上是ack=0+1,也就是指望客戶端的第1個包),seq = y 表示Server本身的初始序號(seq=0就表明這是服務器這邊發出的第0號包)。這時服務器進入syn_rcvd,表示服務器已經收到Client的鏈接請求,等待client的確認。
Client收到確認後還需再次發送確認,同時攜帶要發送給Server的數據。ACK 置1 表示確認號ack= y + 1 有效(表明指望收到服務器的第1個包),Client本身的序號seq= x + 1(表示這就是個人第1個包,相對於第0個包來講的),一旦收到Client的確認以後,這個TCP鏈接就進入Established狀態,就能夠發起http請求了。
通過TCP3次握手以後,瀏覽器發起了http的請求(看第⑫包),使用的http的方法 GET 方法,請求的URL是 / ,協議是HTTP/1.0:
以上的報文是HTTP請求報文。那麼HTTP請求報文和響應報文會是什麼格式呢?
起始行:如 GET / HTTP/1.0 (請求的方法 請求的URL 請求所使用的協議) 頭部信息:User-Agent Host等成對出現的值 主體
不論是請求報文仍是響應報文都會遵循以上的格式。那麼起始行中的請求方法有哪些種呢?
GET: 完整請求一個資源 (經常使用) HEAD: 僅請求響應首部 POST: 提交表單 (經常使用) PUT: 上傳 DELETE: 刪除 OPTIONS: 返回請求的資源所支持的方法的方法 TRACE: 追求一個資源請求中間所通過的代理
那什麼是URL、URI、URN?
URI Uniform Resource Identifier 統一資源標識符,如:scheme://[username:password@]HOST:port/path/to/source URL Uniform Resource Locator 統一資源定位符,如:http://www.magedu.com/downloads/nginx-1.5.tar.gz URN Uniform Resource Name 統一資源名稱
請求的協議有哪些種?有如下幾種
http/0.9: stateless http/1.0: MIME, keep-alive (保持鏈接), 緩存 http/1.1: 更多的請求方法,更精細的緩存控制,持久鏈接(persistent connection) 比較經常使用
Accept 就是告訴服務器端,接受那些MIME類型 Accept-Encoding 這個看起來是接受那些壓縮方式的文件 Accept-Lanague 告訴服務器可以發送哪些語言 Connection 告訴服務器支持keep-alive特性 Cookie 每次請求時都會攜帶上Cookie以方便服務器端識別是不是同一個客戶端 Host 用來標識請求服務器上的那個虛擬主機,好比Nginx裏面能夠定義不少個虛擬主機,那這裏就是用來標識要訪問那個虛擬主機。 User-Agent 用戶代理,通常狀況是瀏覽器,也有其餘類型,如:wget curl 搜索引擎的蜘蛛等 條件請求頭部:If-Modified-Since是瀏覽器向服務器端詢問某個資源文件若是自從什麼時間修改過,那麼從新發給我,這樣就保證服務器端資源文件更新時,瀏覽器再次去請求,而不是使用緩存中的文件。 安全請求頭部:Authorization: 客戶端提供給服務器的認證信息;
html → head → title → #text(網頁標題) → style → 加載樣式 → 解析樣式 → link → 加載外部樣式表文件 → 解析外部樣式表 → script → 加載外部腳本文件 → 解析外部腳本文件 → 執行外部腳本 → body → div → script → 加載腳本 → 解析腳本 → 執行腳本 → img → script → 加載腳本 → 解析腳本 → 執行腳本 → 加載外部圖像文件 → 頁面初始化完畢
<1>.客戶端發送請求。客戶端瀏覽器向服務器發送請求URL;
<2>.服務器接收請求。服務器接收到該瀏覽器發送的請求;
<3>.服務器生成HTML。服務器解析請求的URL,根據URL肯定請求的目標資源文件;這個資源文件一般是一個動態頁面(如ASP,PHP,JSP,ASPX等文件)的網絡地址(MVC結構的程序例外)。Web服務器根據動態頁面文件的內容和URL中的參數,調用相應的資源(數據庫數據或圖片文件等等)組織數據,生成HTML頁面。
<4>.服務端響應請求。生成HTML文檔之後,服務器響應瀏覽器的請求,將生成的HTML文檔發送給客戶端瀏覽器;
<5>.客戶端接收響應。瀏覽器接收服務端發出的請求得來HTML文檔;
<6>.客戶端解析HTML。瀏覽器對HTML文檔進行解析,並加載相關的資源文件(JS,CSS,多媒體資源,內嵌網頁)等,(在這裏瀏覽器解悉完HTML文檔之後,就會進行呈現,但同時也會向服務器發送請求來請求其它相關的資源文件)
<7>.服務器發送資源文件。服務器接到瀏覽器對資源文件的請求,將相應的資源文件響應給客戶端瀏覽器;
<8>.客戶端加載資源文件。客戶端瀏覽器將接收服務器發送的資源文件,整理並呈現到頁面中;
<9>.客戶端從上到下加載。在進行頁面呈現的時候,瀏覽器會從上到下執行HTML文檔,當遇到相應的頁面腳本的時候,會對腳本進行分析,並解釋執行相應的腳本代碼。
在第6步之後,咱們就能夠看到一部分頁面內容了,不過多是純文本內容,沒有樣式,沒有圖片或其它資源。待到瀏覽器請求獲得某資源的時候就會進行組織呈現,直到整個頁面全部資源加載完畢,顯示完成,請求響應完畢。