學習如何通過Fiddler建立一個速度更快的網站。在這篇文章中,我們將使用Fiddler去探究HTTP的效能,緩衝,以及壓縮。
如果你要是沒有安裝和配置過Fiddler, 請從文章的第一篇開始。
HTTP效能總覽
毫無疑問使用者都喜歡訪問速度快的網站。使用者是非常的不耐煩,除非你的網站是沒有競爭者,換句話就是處於壟斷地位的。如果你的訪問者來自世界各地,那你就必須要保證你的網站在執行效率方面要非常好,甚至要更加標準。作為一個國際化的網路連接點,通常要受到來自兩個方面的壓力:高訪問量以及低頻寬。
在第一次至關重要的訪問中,使用者必須要下載每一個內容片斷,來產生頁面,包括JS,CSS,Images,HTML,如果你的頁面太難載入(包括IIS接到請求執行並返回給用戶端HTML),訪問者也許就會離開你的頁面!
通過暴露所有的HTTP通訊,Fiddler很容易得向你展示哪些檔案經常被用於產生一個頁面,
Shift+click 可以在Fiddler左邊框的會話列表中多選會話,來計算那些被選會話的“頁面總重量”。那些被轉換成位元組的數量。
如果你想讓你的客戶在第一次訪問的時候就留下深刻的印象 ,那麼最好的,也是唯一的途徑就是返回給客戶更少的檔案。
1 使用更少的圖畫
2 將所有的CSS濃縮到一個CSS檔案中
3 將所有的指令碼濃縮到一個JS檔案中
4 簡化你的頁面時間
5 使用HTTP壓縮
如果要是你已經對使用者的第一次來訪的效能進行了最佳化,那麼你可以通過Http 緩衝的優勢來使得你的網站訪問速度更快!
HTTP 緩衝介紹
2種方式來提升你的web 應用程式的速度:
減少請求和響應的往返次數
減少請求和響應的往返位元組大小。
HTTP緩衝是最好的減少用戶端伺服器端往返次數的辦法。緩衝提供了提供一種機制來保證用戶端或者代理能夠儲存一些東西,而這些東西將會在稍後的HTTP 響應中用到的。(即第一次請求了,到了用戶端,緩衝起來,下次如果頁面還要這個JS檔案或者CSS檔案啥的,就不要到伺服器端去取下來了,但是還是要去伺服器上去訪問一次,因為請求要對比ETAG值,關於這個值,我將會在下次翻譯中介紹其作用)這樣,就不用讓檔案再次跨越整個網路了。
緩衝相關的要求標頭
為了提高效能,微軟的IE和其他的web用戶端總是想盡辦法來維持從遠程伺服器上下載下來的本地的緩衝。
當用戶端需要一個資源(html,css.js…),他們有3種可能的動作:
1 發送一個一般的HTTP請求到遠程伺服器端,請求這個資源。
2 發送一個有條件的HTTP請求到伺服器,條件就是如果它不同於本地的緩衝版本。
3 如果緩衝的拷貝可用,就使用本地的緩衝資源。
當發送一個請求,客戶也許會使用如下的幾個HEADER
Table 1. Client Cache Headers
Pragma: no-cache |
The client is unwilling to accept any cached responses from caches along the route and the origin server must be contacted for a fresh copy of the resource. |
If-Modified-Since: datetime |
The server should return the requested resource only if the resource has been modified since the date-time provided by the client. |
If-None-Match: etagvalue |
The server should return the requested resource if the ETAG of the resource is different than the value provided by the client. An ETAG is a unique identifier representing a particular version of a file. |
1 Pragma:no-cache 表明用戶端不願意接受緩衝請求,它需要的是最即時的資源。
2 If-Modified-Since: datetime 表明如果這個資源自從上次被用戶端請求,就已經修改了,那麼伺服器就會返回給用戶端最新的。
3 If-None-Match: etagvalue 如果用戶端資源的ETAG值跟伺服器端不一致了,那麼伺服器端返回最新的資源。ETAG就是一個唯一的ID,用來表示一個檔案的一個特定的版本。
如果要是這些有條件的請求,也就是含有If-Modified-Since 或者 If-None-MatchHeader頭的請求,伺服器將會以HTTP/304 Not Modified 來作為響應,那麼用戶端就知道可以使用用戶端的緩衝了。否則,伺服器將會返回一個新的響應並且用戶端就會拋棄到期的緩衝資源。
你可以觀察2個連貫的請求,來請求同一個圖片,你會在Fiddler中發現:在第一個本機快取版本中,伺服器返回一個含有ETAG的檔案,和一個含有最後修改日期的檔案,在這個第一次的請求會話中,一個本地的緩衝版本已經可以使用了。這樣一來,一個有條件的請求就被建立出來。然後你再次請求這個圖片的時候,他就就會響應一個本機快取的檔案,當然前提是第一次緩衝的圖片的ETAG值或者If-Modified-Since 值跟伺服器上匹配的話,伺服器就響應一個304給用戶端。
Session #1
GET /images/banner.jpg HTTP/1.1
Host: www.bayden.com
HTTP/1.1 200 OK
Date: Tue, 08 Mar 2006 00:32:46 GMT
Content-Length: 6171
Content-Type: image/jpeg
ETag: "40c7f76e8d30c31:2fe20"
Last-Modified: Thu, 12 Jun 2003 02:50:50 GMT
Session #2
GET /images/banner.jpg HTTP/1.1
If-Modified-Since: Thu, 12 Jun 2003 02:50:50 GMT
If-None-Match: "40c7f76e8d30c31:2fe20"
Host: www.bayden.com
HTTP/1.1 304 Not Modified
因為一個HTTP304響應僅僅包含頭,沒有body,所有它在穿越互連網的時候要比攜帶了資源的快很多,儘管如此,HTTP/304響應需要一個伺服器的往返,但是通過細心的設定回應標頭,web程式員可以消除這種因素,甚至是有條件的請求。
緩衝相關回應標頭
通常緩衝機制是由回應標頭來控制的。HTTP規範描述了Header控制緩衝,The optional Cache-Control,Expires(到期)。
Expires頭包含一個絕對的日期,當超過此日期,它將不會被考慮更新了。
Table 2. Common Cache-Control Headers
Value |
Meaning |
public |
The response may be stored in any cache, including caches shared among many users. |
private |
The response may only be stored in a private cache used by a single user. |
no-cache |
The response should not be reused to satisfy future requests. |
no-store |
The response should not be reused to satisfy future requests, and should not be written to disk. This is primarily used as a security measure for sensitive responses. |
max-age=#seconds |
The response may be reused to satisfy future requests within a certain number of seconds. |
must-revalidate |
The response may be reused to satisfy future requests, but the origin server should first be contacted to verify that the response is still fresh. |
Cache-Control頭的參數設定:
Public 響應會被緩衝,並且在多使用者間共用。
Private 響應只能夠作為私人的緩衝,不能再使用者間共用。
No-cache 響應不會被緩衝
No-store 響應不會被緩衝,並且不會被寫入到用戶端的磁碟裡,這也是基於安全考慮的某些敏感的響應才會使用這個。
Max-age=#seconds 響應將會某個指定的秒數內緩衝,一旦時間過了,就不會被緩衝。
Must-revalidate 響應會被重用來滿足接下來的請求,但是它必須到伺服器端去驗證它是不是仍然是最新的。
注意:
如果你要想在iis中配置緩衝,請參閱溫軟的知識技術文章:
· How to Modify the Cache-Control HTTP Header When You Use IIS.
你可以學習更多關於在asp.net中使用緩衝的知識文章:
· How To Cache in ASP.NET by Using Visual C# .NET.
如果你發現你經常在你的網站上更新檔案,但是並沒有變更檔名字,那你就必須要非常小心地設定你的緩衝存留時間。例如:如果你要一個thisyear.gif圖片檔案顯示當前的年份在網站上,你需要保證這個緩衝到期時間不能超過一天,否則一個使用者在12月31號訪問你的網站的時候,在1月1號就不能顯示正確的日期。
由於某些原因,伺服器可能會設定:Progma:no-cache 頭,Cache-control:no-cache
Header中的參數:Vary 是一個緩衝訊號,Vary:User-Agent表示緩衝當前的響應,但是僅限於當發送同樣的User-Agent 頭的時候。指令 Vary:* 就相當於Cache-Control:no-Cache。
Vary就相當於asp.net中的緩衝的參數一樣,意思是根據什麼來緩衝,如果要是知道asp.net的緩衝的使用方法,就很容易明白這個參數的意思。
使用HTTP會話列表,Fiddler使用者可以看到在頁面裡包含的HTTP緩衝頭。
Fiddler 會話列表
如果響應不包含Expires或者Cache-Control,那麼用戶端就會被迫作為一個有條件的請求,來保證所有的資源都是最新的。
有條件的請求和WinInetCache
IE通過Microsoft windows Internet Services來最大程度的利用快取服務。WinInet允許使用者配置緩衝的大小和行為,設定緩衝進行如下操作:
1 開啟IE,
2 工具選項,選擇Inrernet選項,在一般子選項中,臨時檔案夾內,點擊設定
就是選村的四種設定:
標記效能問題:
你可以使用Fiddler的自訂規則來標記某些你需要的,比如如果某個響應大於25KB,你可以把當前的Session標記為紅色,更加醒目。以下代碼都是在OnBeforeResponse事件中:
// Flag files over 25KB
if (oSession.responseBodyBytes.length > 25000){
oSession["ui-color"] = "red";
oSession["ui-bold"] = "true";
oSession["ui-customcolumn"] = "Large file";
}
同樣,你也可以標記響應並不指示緩衝資訊。
// Mark files which do not have caching information
if (!oSession.oResponse.headers.Exists("Expires") &&
!oSession.oResponse.headers.Exists("Cache-Control")){
oSession["ui-color"] = "purple";
oSession["ui-bold"] = "true";
}
介紹HTTP壓縮
所有的目前流行的WEB伺服器和瀏覽器都提供HTTP壓縮支援。HTTP壓縮可以非常顯著地降低用戶端和伺服器端的通訊量。節省超過50%的HTML,XML,CSS,JS等檔案。一個瀏覽器發送一個訊號給伺服器,他可以介紹HTTP壓縮過的內容,並且會把用戶端所支援的壓縮類型放在請求的Header中,例如:考慮如下的請求:
GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: search.msn.com
這個 Accept-Encoding 頭表明IE將願意接受GZIP格式的和DEFLATE格式的壓縮響應。
相應的響應如下:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/6.0 --Microsoft-HTTPAPI/1.0
X-Powered-By: ASP.NET
Vary: Accept-Encoding
Content-Encoding: gzip
Date: Tue, 15 Feb 2006 09:14:36 GMT
Content-Length: 1277
Connection: close
Cache-Control: private, max-age=3600
你可以使用Fiddler來解壓縮這些資料。實驗表明,使用HTTP壓縮能大量減少資料往返,一個普通的CSS檔案甚至能減少80%!當然壓縮是以犧牲CPU效能為代價的。特別是壓縮動態檔案,但是一般的權宜之策是壓縮例如JS,CSS等靜態檔案,因為他們在第一次壓縮後,就會被儲存在伺服器上,如果要壓縮asp.net動態檔案,一定要有個權衡才行
如果您現在還是不滿足您的程式最佳化,那麼你還可以參看這篇文章,
Ten Tips for Writing High-Performance Web Applications