未使用強緩存只用協商緩存有效嗎
1. 前端開發面試不能快速進入開發狀態
從jQuery華麗謝幕到如今React、Vue、Angular三大框架入手。
Vue原理歸根結底是考驗應試者的JavaScript功底。想要看透源碼,JavaScript基本功要扎實。而HTTP協議更是屬於長半衰期的知識,我們要重點掌握,因為可能到了你40歲的時候,這些知識仍然不會變。在充滿浮躁和焦慮的當下,如果我們認真思考,就會發現其實真正值錢的不是新技術,而是我們能夠使用技術改變整個行業或者世界。
再說回性能優化,性能優化的方式有很多,從編碼到打包構建,再到線上CDN緩存。Google瀏覽器為我們提供了Performance頁面性能分析工具,Performance可以記錄站點在運行過程中的一些相關性能數據,通過配置可以生成詳細的報告頁,我們拿到這些原始數據就可以分析出Web應用的性能問題了。關於緩存策略也是面試中的熱門問題,其實緩存分為強緩存和協商緩存。當瀏覽器進行資源請求時,會判斷是否命中強緩存,如果命中則直接從本地緩存讀取,不會向伺服器發送請求。當強緩存沒有命中或者請求頭中設置了不走強緩存時,會發送請求到伺服器,判斷協商緩存是否命中。如果命中,伺服器將請求返回,載入瀏覽器緩存,如果沒有命中,伺服器則直接將資源返回。
2. 簡述在tcp/ip體系中,流量控制和擁塞控制的不同
1. 利用滑動窗口實現流量控制
如果發送方把數據發送得過快,接收方可能會來不及接收,這就會造成數據的丟失。所謂流量控制就是讓發送方的發送速率不要太快,要讓接收方來得及接收。
利用滑動窗口機制可以很方便地在TCP連接上實現對發送方的流量控制。
設A向B發送數據。在連接建立時,B告訴了A:「我的接收窗口是 rwnd = 400 」(這里的 rwnd 表示 receiver window) 。因此,發送方的發送窗口不能超過接收方給出的接收窗口的數值。請注意,TCP的窗口單位是位元組,不是報文段。TCP連接建立時的窗口協商過程在圖中沒有顯示出來。再設每一個報文段為100位元組長,而數據報文段序號的初始值設為1。大寫ACK表示首部中的確認位ACK,小寫ack表示確認欄位的值ack。
從圖中可以看出,B進行了三次流量控制。第一次把窗口減少到 rwnd = 300 ,第二次又減到了 rwnd = 100 ,最後減到 rwnd = 0 ,即不允許發送方再發送數據了。這種使發送方暫停發送的狀態將持續到主機B重新發出一個新的窗口值為止。B向A發送的三個報文段都設置了 ACK = 1 ,只有在ACK=1時確認號欄位才有意義。
TCP為每一個連接設有一個持續計時器(persistence timer)。只要TCP連接的一方收到對方的零窗口通知,就啟動持續計時器。若持續計時器設置的時間到期,就發送一個零窗口控測報文段(攜1位元組的數據),那麼收到這個報文段的一方就重新設置持續計時器。
2. 必須考慮傳輸速率
可以用不同的機制來控制TCP報文段的發送時機。如: <1>. TCP維持一個變數,它等於最大報文段長度MSS。只要緩存中存放的數據達到MSS位元組時,就組裝成一個TCP報文段發送出去。<2>. 由發送方的應用進程指明要求發送報文段,即TCP支持的推送( push )操作。<3>. 發送方的一個計時器期限到了,這時就把已有的緩存數據裝入報文段(但長度不能超過MSS)發送出去。
Nagle演算法:若發送應用進程把要發送的數據逐個位元組地送到TCP的發送緩存,則發送方就把第一個數據位元組先發送出去,把後面到達的數據位元組都緩存起來。當發送方接收對第一個數據字元的確認後,再把發送緩存中的所有數據組裝成一個報文段再發送出去,同時繼續對隨後到達的數據進行緩存。只有在收到對前一個報文段的確認後才繼續發送下一個報文段。當數據到達較快而網路速率較慢時,用這樣的方法可明顯地減少所用的網路帶寬。Nagle演算法還規定:當到達的數據已達到 發送窗口大小的一半或已達到報文段的最大長度時,就立即發送一個報文段。
另,糊塗窗口綜合證: TCP接收方的緩存已滿,而互動式的應用進程一次只從接收緩存中讀取1位元組(這樣就使接收緩存空間僅騰出1位元組),然後向發送方發送確認,並把窗口設置為1個位元組(但發送的數據報為40位元組的的話)。接收,發送方又發來1個位元組的數據(發送方的IP數據報是41位元組)。接收方發回確認,仍然將窗口設置為1個位元組。這樣,網路的效率很低。要解決這個問題,可讓接收方等待一段時間,使得或者接收緩存已有足夠空間容納一個最長的報文段,或者等到接收方緩存已有一半空閑的空間。只要出現這兩種情況,接收方就發回確認報文,並向發送方通知當前的窗口大小。此外,發送方也不要發送太小的報文段,而是把數據報積累成足夠大的報文段,或達到接收方緩存的空間的一半大小。
TCP的擁塞控制
1. 擁塞:即對資源的需求超過了可用的資源。若網路中許多資源同時供應不足,網路的性能就要明顯變壞,整個網路的吞吐量隨之負荷的增大而下降。
擁塞控制:防止過多的數據注入到網路中,這樣可以使網路中的路由器或鏈路不致過載。擁塞控制所要做的都有一個前提:網路能夠承受現有的網路負荷。擁塞控制是一個全局性的過程,涉及到所有的主機、路由器,以及與降低網路傳輸性能有關的所有因素。
流量控制:指點對點通信量的控制,是端到端正的問題。流量控制所要做的就是抑制發送端發送數據的速率,以便使接收端來得及接收。
擁塞控制代價:需要獲得網路內部流量分布的信息。在實施擁塞控制之前,還需要在結點之間交換信息和各種命令,以便選擇控制的策略和實施控制。這樣就產生了額外的開銷。擁塞控制還需要將一些資源分配給各個用戶單獨使用,使得網路資源不能更好地實現共享。
2. 幾種擁塞控制方法
慢開始( slow-start )、擁塞避免( congestion avoidance )、快重傳( fast retransmit )和快恢復( fast recovery )。
2.1 慢開始和擁塞避免
發送方維持一個擁塞窗口 cwnd ( congestion window )的狀態變數。擁塞窗口的大小取決於網路的擁塞程度,並且動態地在變化。發送方讓自己的發送窗口等於擁塞。
發送方控制擁塞窗口的原則是:只要網路沒有出現擁塞,擁塞窗口就再增大一些,以便把更多的分組發送出去。但只要網路出現擁塞,擁塞窗口就減小一些,以減少注入到網路中的分組數。
慢開始演算法:當主機開始發送數據時,如果立即所大量數據位元組注入到網路,那麼就有可能引起網路擁塞,因為現在並不清楚網路的負荷情況。因此,較好的方法是先探測一下,即由小到大逐漸增大發送窗口,也就是說,由小到大逐漸增大擁塞窗口數值。通常在剛剛開始發送報文段時,先把擁塞窗口 cwnd 設置為一個最大報文段MSS的數值。而在每收到一個對新的報文段的確認後,把擁塞窗口增加至多一個MSS的數值。用這樣的方法逐步增大發送方的擁塞窗口 cwnd ,可以使分組注入到網路的速率更加合理。
每經過一個傳輸輪次,擁塞窗口 cwnd 就加倍。一個傳輸輪次所經歷的時間其實就是往返時間RTT。不過「傳輸輪次」更加強調:把擁塞窗口cwnd所允許發送的報文段都連續發送出去,並收到了對已發送的最後一個位元組的確認。
另,慢開始的「慢」並不是指cwnd的增長速率慢,而是指在TCP開始發送報文段時先設置cwnd=1,使得發送方在開始時只發送一個報文段(目的是試探一下網路的擁塞情況),然後再逐漸增大cwnd。
為了防止擁塞窗口cwnd增長過大引起網路擁塞,還需要設置一個慢開始門限ssthresh狀態變數(如何設置ssthresh)。慢開始門限ssthresh的用法如下:
當 cwnd < ssthresh 時,使用上述的慢開始演算法。
當 cwnd > ssthresh 時,停止使用慢開始演算法而改用擁塞避免演算法。
當 cwnd = ssthresh 時,既可使用慢開始演算法,也可使用擁塞控制避免演算法。
擁塞避免演算法:讓擁塞窗口cwnd緩慢地增大,即每經過一個往返時間RTT就把發送方的擁塞窗口cwnd加1,而不是加倍。這樣擁塞窗口cwnd按線性規律緩慢增長,比慢開始演算法的擁塞窗口增長速率緩慢得多。
無論在慢開始階段還是在擁塞避免階段,只要發送方判斷網路出現擁塞(其根據就是沒有收到確認),就要把慢開始門限ssthresh設置為出現擁塞時的發送方窗口值的一半(但不能小於2)。然後把擁塞窗口cwnd重新設置為1,執行慢開始演算法。這樣做的目的就是要迅速減少主機發送到網路中的分組數,使得發生擁塞的路由器有足夠時間把隊列中積壓的分組處理完畢。
如下圖,用具體數值說明了上述擁塞控制的過程。現在發送窗口的大小和擁塞窗口一樣大。
<1>. 當TCP連接進行初始化時,把擁塞窗口cwnd置為1。前面已說過,為了便於理解,圖中的窗口單位不使用位元組而使用報文段的個數。慢開始門限的初始值設置為16個報文段,即 cwnd = 16 。
<2>. 在執行慢開始演算法時,擁塞窗口 cwnd 的初始值為1。以後發送方每收到一個對新報文段的確認ACK,就把擁塞窗口值另1,然後開始下一輪的傳輸(圖中橫坐標為傳輸輪次)。因此擁塞窗口cwnd隨著傳輸輪次按指數規律增長。當擁塞窗口cwnd增長到慢開始門限值ssthresh時(即當cwnd=16時),就改為執行擁塞控制演算法,擁塞窗口按線性規律增長。
<3>. 假定擁塞窗口的數值增長到24時,網路出現超時(這很可能就是網路發生擁塞了)。更新後的ssthresh值變為12(即變為出現超時時的擁塞窗口數值24的一半),擁塞窗口再重新設置為1,並執行慢開始演算法。當cwnd=ssthresh=12時改為執行擁塞避免演算法,擁塞窗口按線性規律增長,每經過一個往返時間增加一個MSS的大小。
強調:「擁塞避免」並非指完全能夠避免了擁塞。利用以上的措施要完全避免網路擁塞還是不可能的。「擁塞避免」是說在擁塞避免階段將擁塞窗口控制為按線性規律增長,使網路比較不容易出現擁塞。
3. 什麼叫做cache的寫命中和寫未命中,有什麼區別可以通俗解釋嗎
1、cache的寫命中和寫未命中,就是磁碟或者內存上的存儲區域之前有沒有寫過數據。
如果有,這次再寫到相同的區域叫寫命中;
如果寫到其他區域,叫寫未命中。
2、在數據恢復方面,如果寫命中了,那之前的數據被覆蓋,就很難再恢復回來;
如果寫未命中,那麼之前的數據就容易被找回。
(3)未使用強緩存只用協商緩存有效嗎擴展閱讀:
緩存命中率
終端用戶訪問加速節點時,如果該節點有緩存住了要被訪問的數據時就叫做命中,如果沒有的話需要回原伺服器取,就是沒有命中。取數據的過程與用戶訪問是同步進行的,所以即使是重新取的新數據,用戶也不會感覺到有延時。 命中率=命中數/(命中數+沒有命中數), 緩存命中率是判斷加速效果好壞的重要因素之一。
應用場景
是OLTP還是OLAP應用,即使是OLTP,也要看訪問的頻度,一個極少被訪問到的緩存等於沒有什麼效果。一般來說,互聯網網站是非常適合緩存應用的場景。
緩存的粒度
毫無疑問,緩存的粒度越小,命中率就越高,對象緩存是目前緩存粒度最小的,因此被命中的幾率更高。
舉個例子來說吧:你訪問當前這個頁面,瀏覽帖子,那麼對於ORM來說,需要發送n條SQL,取各自帖子user的對象。很顯然,如果這個user在其他帖子裡面也跟貼了,那麼在訪問那個帖子的時候,就可以直接從緩存裡面取這個user對象了。
緩存的容量
緩存太小,造成頻繁的LRU,也會降低命中率,緩存的有效期太短也會造成緩存命中率下降。
所以緩存命中率問題不能一概而論,一定說命中率很低或者命中率很高。但是如果你對於緩存的掌握很精通,有意識的去調整應用的架構,去分解緩存的粒度,總是會帶來很高的命中率的。
4. 瀏覽器緩存的清理方法
常用瀏覽器的清理方法:
網路瀏覽器
1.雙擊打開網路瀏覽器。
5. nginx如何設置不使用緩存
在開發調試web的時候,經常會碰到因瀏覽器緩存(cache)而經常要去清空緩存或者強制刷新來測試的煩惱,提供下apache不緩存配置和nginx不緩存配置的設置。
apache:
首先確定配置文件httpd.conf中確已經載入mod_headers模塊。
LoadMole headers_mole moles/mod_headers.so
我們可以根據文件類型來讓瀏覽器每次都從伺服器讀取,這里測試用css、js、swf、php、html、htm這幾種文件。
<FilesMatch 「\.(css|js|swf|php|htm|html)$」>
Header set Cache-Control "private, no-cache, no-store, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</FilesMatch>
nginx:
location ~ .*\.(css|js|swf|php|htm|html )$ {
add_header Cache-Control no-store;
}
對於站點中不經常修改的靜態內容(如圖片,JS,CSS),可以在伺服器中設置expires過期時間,控制瀏覽器緩存,達到有效減小帶寬流量,降低伺服器壓力的目的。
以Nginx伺服器為例:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
#過期時間為30天,
#圖片文件不怎麼更新,過期可以設大一點,
#如果頻繁更新,則可以設置得小一點。
expires 30d;
}
location ~ .*\.(js|css)$ {
expires 10d;
}
6. 伺服器的ssl會話緩存 可以被刷新嗎
為什麼在伺服器負載非常重的時候會出現隨機性的SSL協議錯誤?
可能有多種原因,但是最可能的原因是由於將SSLSessionCache指定為使用DBM會話緩存所致。因此,使用SHM會話緩存或者根本不使用SSL會話緩存有助於解決這個問題。
為什麼伺服器在處理SSL加密連接的時候負載會很重?
SSL使用的強加密演算法需要消耗大量CPU資源進行大數運算。當你通過HTTPS訪問一個頁面時,每一個元素(包括圖片和多媒體資源)都會被加密傳輸。所以,HTTPS流量越大,負載就會越重。
為什麼在使用HTTPS協議的情況下,有時候需要花上30秒才能建立一個連接?
這通常是由於在使用read(2)讀取SSLRandomSeed指定的/dev/random設備時,設備暫時無法提供足夠多的隨機位,操作被一直阻塞所致。更多細節可以參考手冊中對SSLRandomSeed指令的詳細說明。
mod_ssl支持哪些SSL加密演算法?
通常,所有OpenSSL支持的SSL加密演算法mod_ssl都支持,具體取決於你的OpenSSL是怎樣編譯的。可以使用下面的命令列出實際究竟可以使用哪些加密演算法:
$ openssl ciphers -v
為什麼使用匿名Diffie-Hellman(ADH)演算法時會收到"no shared cipher"錯誤?
默認情況下,出於安全原因,OpenSSL並不啟用ADH演算法。僅在你確實明白了這個演算法的副作用時,你才可以啟用此演算法。
為了使用匿名Diffie-Hellman(ADH)演算法,你必須在編譯OpenSSL時使用"-DSSL_ALLOW_ADH"配置選項,並在SSLCipherSuite指令中添加"ADH"。
為什麼連接到新安裝的Apache-SSL伺服器時會收到"no shared ciphers"錯誤?
或者是SSLCipherSuite指令配置錯誤(你可以和預配置的httpd.conf-dist比 對一下);或者是你在生成私鑰的時候使用了DSA/DH演算法而不是RSA,並且忽略了警告信息。如果使用了DSA/DH的話,那麼你的伺服器就不能使用基 於RSA的SSL加密演算法進行通信(至少直到你配置了一個額外的RSA證書/密鑰對為止)。現在的瀏覽器,比如NS或IE只能和使用RSA加密演算法的 SSL伺服器通信,這也是導致"no shared ciphers"錯誤原因之一。解決這個錯誤的最佳途徑就是使用RSA演算法重新生成伺服器證書和密鑰對。
為什麼不能在基於域名的虛擬主機上使用SSL?
原因很技術化,有點類似於"雞和蛋"的問題。SSL協議層位於HTTP協議層之下,HTTP協議是被封裝在SSL協議中的,當一個SSL連接 (HTTPS)請求到來的時候,Apache/mod_ssl必須和客戶端協商SSL協議參數(握手),所以,mod_ssl必須查看虛擬主機的配置信息 (例如允許使用哪些加密演算法、伺服器證書是哪個等等),然後才能完成SSL會話通道的建立;但另一方面,為了確切知道究竟應該查看哪個虛擬主 機,Apache又必須知道HTTP請求頭的Host欄位的內容,而這在完成SSL握手之前是不可能知道的。
為什麼不可以使用基於域名的虛擬主機來標識不同的SSL虛擬主機?
基於域名的虛擬主機是用來標識不同虛擬主機的流行方法。這種方法允許多個不同的站點使用同一個IP地址和埠對。當人們將站點轉移到SSL時,很自然的就認為可以使同相同的辦法在同一台機器上運行多個SSL虛擬主機。
但事實是:沒門!
原因在於SSL協議層位於HTTP協議層之下,HTTP協議是被封裝在SSL協議中的,所以SSL會話必須在HTTP會話之前建立。因為在建立SSL會話的最初握手階段,伺服器無法知道HTTP請求頭的Host欄位的內容,也就無法確定究竟使用哪個虛擬主機的配置(例如允許使用哪些加密演算法、伺服器證書是哪個等等),於是Apache就會使用匹配這個IP地址埠對的第一個主機的SSL配置。
當然,你也可以在同一個IP地址上使用基於域名的虛擬主機來標識多個非SSL虛擬主機(例如全運行在80埠),同時再運行一個SSL虛擬主機(例如在443埠)。不過如果你確實這么做了的話,一定要確保在NameVirtualHost指令里明確指定埠號,像這樣:
NameVirtualHost 192.168.1.1:80
另外一個解決方案:為不同的SSL虛擬主機使用不同的IP地址埠對。
如何啟用SSL壓縮?
雖然SSLv2和TLS規范定義了SSL壓縮協商,但是直到2004年5月,RFC 3749才將DEFLATE定義為可協商的壓縮方法。
從0.9.8版本開始,如果編譯時使用了zlib選項,那麼OpenSSL將默認支持SSL壓縮。如果客戶端和伺服器同 時支持壓縮,那麼壓縮將被啟用。但是,當前的大多數客戶端仍然會在建立SSL會話的最初嘗試使用SSLv2,而SSLv2在握手階段並不協商壓縮演算法,所 以對於使用SSLv2的客戶端,實際上是無法使用壓縮的。如果客戶端使用SSLv3或TLS建立連接,那麼就可以啟用壓縮。你可以使用%{SSL_COMPRESS_METHOD}x變數在日誌中記錄客戶端是否利用了壓縮功能。
當我通過HTTPS使用基本認證的時候,Netscape瀏覽器狀態欄上的鎖圖標處於打開狀態,這是否意味著我的用戶名和密碼是明文傳遞的?
非也!你的用戶名和密碼依然是加密傳輸的。瀏覽器上的圖標事實上並沒有和SSL/TLS同步,它僅在開始實際傳輸web頁面的時候才鎖上,這會給用 戶帶來一些困惑。基本認證是HTTP層的特性,而HTTP層位於SSL層之上(所以被稱為HTTPS),所以任何HTTP會話開始之前,SSL層已經完成 握手並建立了加密信道。所以不要被這個圖標所迷惑。
7. Http狀態碼是什麼。都有哪些什麼意思請詳細的說下
HTTP狀態碼(HTTP Status Code)是用以表示網頁伺服器HTTP響應狀態的3位數字代碼。它由 RFC 2616 規范定義的,並得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等規范擴展。
HTTP狀態碼全部以及代表的意思:
100 客戶端應當繼續發送請求。這個臨時響應是用來通知客戶端它的部分請求已經被伺服器接收,且仍未被拒絕。客戶端應當繼續發送請求的剩餘部分,或者如果請求已經完成,忽略這個響應。伺服器必須在請求完成後向客戶端發送一個最終響應。
101 伺服器已經理解了客戶端的請求,並將通過Upgrade 消息頭通知客戶端採用不同的協議來完成這個請求。在發送完這個響應最後的空行後,伺服器將會切換到在Upgrade 消息頭中定義的那些協議。 只有在切換新的協議更有好處的時候才應該採取類似措施。例如,切換到新的HTTP 版本比舊版本更有優勢,或者切換到一個實時且同步的協議以傳送利用此類特性的資源。
102 由WebDAV(RFC 2518)擴展的狀態碼,代表處理將被繼續執行。
200 請求已成功,請求所希望的響應頭或數據體將隨此響應返回。
201 請求已經被實現,而且有一個新的資源已經依據請求的需要而建立,且其 URI 已經隨Location 頭信息返回。假如需要的資源無法及時建立的話,應當返回 '202 Accepted'。
202 伺服器已接受請求,但尚未處理。正如它可能被拒絕一樣,最終該請求可能會也可能不會被執行。在非同步操作的場合下,沒有比發送這個狀態碼更方便的做法了。 返回202狀態碼的響應的目的是允許伺服器接受其他過程的請求(例如某個每天只執行一次的基於批處理的操作),而不必讓客戶端一直保持與伺服器的連接直到批處理操作全部完成。在接受請求處理並返回202狀態碼的響應應當在返回的實體中包含一些指示處理當前狀態的信息,以及指向處理狀態監視器或狀態預測的指針,以便用戶能夠估計操作是否已經完成。
203 伺服器已成功處理了請求,但返回的實體頭部元信息不是在原始伺服器上有效的確定集合,而是來自本地或者第三方的拷貝。當前的信息可能是原始版本的子集或者超集。例如,包含資源的元數據可能導致原始伺服器知道元信息的超級。使用此狀態碼不是必須的,而且只有在響應不使用此狀態碼便會返回200 OK的情況下才是合適的。
204 伺服器成功處理了請求,但不需要返回任何實體內容,並且希望返回更新了的元信息。響應可能通過實體頭部的形式,返回新的或更新後的元信息。如果存在這些頭部信息,則應當與所請求的變數相呼應。 如果客戶端是瀏覽器的話,那麼用戶瀏覽器應保留發送了該請求的頁面,而不產生任何文檔視圖上的變化,即使按照規范新的或更新後的元信息應當被應用到用戶瀏覽器活動視圖中的文檔。 由於204響應被禁止包含任何消息體,因此它始終以消息頭後的第一個空行結尾。
205 伺服器成功處理了請求,且沒有返回任何內容。但是與204響應不同,返回此狀態碼的響應要求請求者重置文檔視圖。該響應主要是被用於接受用戶輸入後,立即重置表單,以便用戶能夠輕松地開始另一次輸入。 與204響應一樣,該響應也被禁止包含任何消息體,且以消息頭後的第一個空行結束。
206 伺服器已經成功處理了部分 GET 請求。類似於 FlashGet 或者迅雷這類的 HTTP 下載工具都是使用此類響應實現斷點續傳或者將一個大文檔分解為多個下載段同時下載。 該請求必須包含 Range 頭信息來指示客戶端希望得到的內容範圍,並且可能包含 If-Range 來作為請求條件。 響應必須包含如下的頭部域: Content-Range 用以指示本次響應中返回的內容的范圍;如果是 Content-Type 為 multipart/byteranges 的多段下載,則每一 multipart 段中都應包含 Content-Range 域用以指示本段的內容範圍。假如響應中包含 Content-Length,那麼它的數值必須匹配它返回的內容範圍的真實位元組數。 Date ETag 和/或 Content-Location,假如同樣的請求本應該返回200響應。 Expires, Cache-Control,和/或 Vary,假如其值可能與之前相同變數的其他響應對應的值不同的話。 假如本響應請求使用了 If-Range 強緩存驗證,那麼本次響應不應該包含其他實體頭;假如本響應的請求使用了 If-Range 弱緩存驗證,那麼本次響應禁止包含其他實體頭;這避免了緩存的實體內容和更新了的實體頭信息之間的不一致。否則,本響應就應當包含所有本應該返回200響應中應當返回的所有實體頭部域。 假如 ETag 或 Last-Modified 頭部不能精確匹配的話,則客戶端緩存應禁止將206響應返回的內容與之前任何緩存過的內容組合在一起。 任何不支持 Range 以及 Content-Range 頭的緩存都禁止緩存206響應返回的內容。
207 由WebDAV(RFC 2518)擴展的狀態碼,代表之後的消息體將是一個XML消息,並且可能依照之前子請求數量的不同,包含一系列獨立的響應代碼。
300 被請求的資源有一系列可供選擇的回饋信息,每個都有自己特定的地址和瀏覽器驅動的商議信息。用戶或瀏覽器能夠自行選擇一個首選的地址進行重定向。 除非這是一個 HEAD 請求,否則該響應應當包括一個資源特性及地址的列表的實體,以便用戶或瀏覽器從中選擇最合適的重定向地址。這個實體的格式由 Content-Type 定義的格式所決定。瀏覽器可能根據響應的格式以及瀏覽器自身能力,自動作出最合適的選擇。當然,RFC 2616規范並沒有規定這樣的自動選擇該如何進行。 如果伺服器本身已經有了首選的回饋選擇,那麼在 Location 中應當指明這個回饋的 URI;瀏覽器可能會將這個 Location 值作為自動重定向的地址。此外,除非額外指定,否則這個響應也是可緩存的。
301 被請求的資源已永久移動到新位置,並且將來任何對此資源的引用都應該使用本響應返回的若干個 URI 之一。如果可能,擁有鏈接編輯功能的客戶端應當自動把請求的地址修改為從伺服器反饋回來的地址。除非額外指定,否則這個響應也是可緩存的。 新的永久性的 URI 應當在響應的 Location 域中返回。除非這是一個 HEAD 請求,否則響應的實體中應當包含指向新的 URI 的超鏈接及簡短說明。 如果這不是一個 GET 或者 HEAD 請求,因此瀏覽器禁止自動進行重定向,除非得到用戶的確認,因為請求的條件可能因此發生變化。 注意:對於某些使用 HTTP/1.0 協議的瀏覽器,當它們發送的 POST 請求得到了一個301響應的話,接下來的重定向請求將會變成 GET 方式。
302 請求的資源現在臨時從不同的 URI 響應請求。由於這樣的重定向是臨時的,客戶端應當繼續向原有地址發送以後的請求。只有在Cache-Control或Expires中進行了指定的情況下,這個響應才是可緩存的。 新的臨時性的 URI 應當在響應的 Location 域中返回。除非這是一個 HEAD 請求,否則響應的實體中應當包含指向新的 URI 的超鏈接及簡短說明。 如果這不是一個 GET 或者 HEAD 請求,那麼瀏覽器禁止自動進行重定向,除非得到用戶的確認,因為請求的條件可能因此發生變化。 注意:雖然RFC 1945和RFC 2068規范不允許客戶端在重定向時改變請求的方法,但是很多現存的瀏覽器將302響應視作為303響應,並且使用 GET 方式訪問在 Location 中規定的 URI,而無視原先請求的方法。狀態碼303和307被添加了進來,用以明確伺服器期待客戶端進行何種反應。
303 對應當前請求的響應可以在另一個 URI 上被找到,而且客戶端應當採用 GET 的方式訪問那個資源。這個方法的存在主要是為了允許由腳本激活的POST請求輸出重定向到一個新的資源。這個新的 URI 不是原始資源的替代引用。同時,303響應禁止被緩存。當然,第二個請求(重定向)可能被緩存。 新的 URI 應當在響應的 Location 域中返回。除非這是一個 HEAD 請求,否則響應的實體中應當包含指向新的 URI 的超鏈接及簡短說明。 注意:許多 HTTP/1.1 版以前的 瀏覽器不能正確理解303狀態。如果需要考慮與這些瀏覽器之間的互動,302狀態碼應該可以勝任,因為大多數的瀏覽器處理302響應時的方式恰恰就是上述規范要求客戶端處理303響應時應當做的。
304 如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內容(自上次訪問以來或者根據請求的條件)並沒有改變,則伺服器應當返回這個狀態碼。304響應禁止包含消息體,因此始終以消息頭後的第一個空行結尾。 該響應必須包含以下的頭信息: Date,除非這個伺服器沒有時鍾。假如沒有時鍾的伺服器也遵守這些規則,那麼代理伺服器以及客戶端可以自行將 Date 欄位添加到接收到的響應頭中去(正如RFC 2068中規定的一樣),緩存機制將會正常工作。 ETag 和/或 Content-Location,假如同樣的請求本應返回200響應。 Expires, Cache-Control,和/或Vary,假如其值可能與之前相同變數的其他響應對應的值不同的話。 假如本響應請求使用了強緩存驗證,那麼本次響應不應該包含其他實體頭;否則(例如,某個帶條件的 GET 請求使用了弱緩存驗證),本次響應禁止包含其他實體頭;這避免了緩存了的實體內容和更新了的實體頭信息之間的不一致。 假如某個304響應指明了當前某個實體沒有緩存,那麼緩存系統必須忽視這個響應,並且重復發送不包含限制條件的請求。 假如接收到一個要求更新某個緩存條目的304響應,那麼緩存系統必須更新整個條目以反映所有在響應中被更新的欄位的值。
305 被請求的資源必須通過指定的代理才能被訪問。Location 域中將給出指定的代理所在的 URI 信息,接收者需要重復發送一個單獨的請求,通過這個代理才能訪問相應資源。只有原始伺服器才能建立305響應。 注意:RFC 2068中沒有明確305響應是為了重定向一個單獨的請求,而且只能被原始伺服器建立。忽視這些限制可能導致嚴重的安全後果。
306 在最新版的規范中,306狀態碼已經不再被使用。
307 請求的資源現在臨時從不同的URI 響應請求。由於這樣的重定向是臨時的,客戶端應當繼續向原有地址發送以後的請求。只有在Cache-Control或Expires中進行了指定的情況下,這個響應才是可緩存的。 新的臨時性的URI 應當在響應的 Location 域中返回。除非這是一個HEAD 請求,否則響應的實體中應當包含指向新的URI 的超鏈接及簡短說明。因為部分瀏覽器不能識別307響應,因此需要添加上述必要信息以便用戶能夠理解並向新的 URI 發出訪問請求。 如果這不是一個GET 或者 HEAD 請求,那麼瀏覽器禁止自動進行重定向,除非得到用戶的確認,因為請求的條件可能因此發生變化。
400 1、語義有誤,當前請求無法被伺服器理解。除非進行修改,否則客戶端不應該重復提交這個請求。 2、請求參數有誤。
401 當前請求需要用戶驗證。該響應必須包含一個適用於被請求資源的 WWW-Authenticate 信息頭用以詢問用戶信息。客戶端可以重復提交一個包含恰當的 Authorization 頭信息的請求。如果當前請求已經包含了 Authorization 證書,那麼401響應代表著伺服器驗證已經拒絕了那些證書。如果401響應包含了與前一個響應相同的身份驗證詢問,且瀏覽器已經至少嘗試了一次驗證,那麼瀏覽器應當向用戶展示響應中包含的實體信息,因為這個實體信息中可能包含了相關診斷信息。參見RFC 2617。
402 該狀態碼是為了將來可能的需求而預留的。
403 伺服器已經理解請求,但是拒絕執行它。與401響應不同的是,身份驗證並不能提供任何幫助,而且這個請求也不應該被重復提交。如果這不是一個 HEAD 請求,而且伺服器希望能夠講清楚為何請求不能被執行,那麼就應該在實體內描述拒絕的原因。當然伺服器也可以返回一個404響應,假如它不希望讓客戶端獲得任何信息。
404 請求失敗,請求所希望得到的資源未被在伺服器上發現。沒有信息能夠告訴用戶這個狀況到底是暫時的還是永久的。假如伺服器知道情況的話,應當使用410狀態碼來告知舊資源因為某些內部的配置機制問題,已經永久的不可用,而且沒有任何可以跳轉的地址。404這個狀態碼被廣泛應用於當伺服器不想揭示到底為何請求被拒絕或者沒有其他適合的響應可用的情況下。
405 請求行中指定的請求方法不能被用於請求相應的資源。該響應必須返回一個Allow 頭信息用以表示出當前資源能夠接受的請求方法的列表。 鑒於 PUT,DELETE 方法會對伺服器上的資源進行寫操作,因而絕大部分的網頁伺服器都不支持或者在默認配置下不允許上述請求方法,對於此類請求均會返回405錯誤。
406 請求的資源的內容特性無法滿足請求頭中的條件,因而無法生成響應實體。 除非這是一個 HEAD 請求,否則該響應就應當返回一個包含可以讓用戶或者瀏覽器從中選擇最合適的實體特性以及地址列表的實體。實體的格式由 Content-Type 頭中定義的媒體類型決定。瀏覽器可以根據格式及自身能力自行作出最佳選擇。但是,規范中並沒有定義任何作出此類自動選擇的標准。
407 與401響應類似,只不過客戶端必須在代理伺服器上進行身份驗證。代理伺服器必須返回一個 Proxy-Authenticate 用以進行身份詢問。客戶端可以返回一個 Proxy-Authorization 信息頭用以驗證。參見RFC 2617。
408 請求超時。客戶端沒有在伺服器預備等待的時間內完成一個請求的發送。客戶端可以隨時再次提交這一請求而無需進行任何更改。
409 由於和被請求的資源的當前狀態之間存在沖突,請求無法完成。這個代碼只允許用在這樣的情況下才能被使用:用戶被認為能夠解決沖突,並且會重新提交新的請求。該響應應當包含足夠的信息以便用戶發現沖突的源頭。 沖突通常發生於對 PUT 請求的處理中。例如,在採用版本檢查的環境下,某次 PUT 提交的對特定資源的修改請求所附帶的版本信息與之前的某個(第三方)請求向沖突,那麼此時伺服器就應該返回一個409錯誤,告知用戶請求無法完成。此時,響應實體中很可能會包含兩個沖突版本之間的差異比較,以便用戶重新提交歸並以後的新版本。
410 被請求的資源在伺服器上已經不再可用,而且沒有任何已知的轉發地址。這樣的狀況應當被認為是永久性的。如果可能,擁有鏈接編輯功能的客戶端應當在獲得用戶許可後刪除所有指向這個地址的引用。如果伺服器不知道或者無法確定這個狀況是否是永久的,那麼就應該使用404狀態碼。除非額外說明,否則這個響應是可緩存的。 410響應的目的主要是幫助網站管理員維護網站,通知用戶該資源已經不再可用,並且伺服器擁有者希望所有指向這個資源的遠端連接也被刪除。這類事件在限時、增值服務中很普遍。同樣,410響應也被用於通知客戶端在當前伺服器站點上,原本屬於某個個人的資源已經不再可用。當然,是否需要把所有永久不可用的資源標記為'410 Gone',以及是否需要保持此標記多長時間,完全取決於伺服器擁有者。
411 伺服器拒絕在沒有定義 Content-Length 頭的情況下接受請求。在添加了表明請求消息體長度的有效 Content-Length 頭之後,客戶端可以再次提交該請求。
412 伺服器在驗證在請求的頭欄位中給出先決條件時,沒能滿足其中的一個或多個。這個狀態碼允許客戶端在獲取資源時在請求的元信息(請求頭欄位數據)中設置先決條件,以此避免該請求方法被應用到其希望的內容以外的資源上。
413 伺服器拒絕處理當前請求,因為該請求提交的實體數據大小超過了伺服器願意或者能夠處理的范圍。此種情況下,伺服器可以關閉連接以免客戶端繼續發送此請求。 如果這個狀況是臨時的,伺服器應當返回一個 Retry-After 的響應頭,以告知客戶端可以在多少時間以後重新嘗試。
414 請求的URI 長度超過了伺服器能夠解釋的長度,因此伺服器拒絕對該請求提供服務。這比較少見,通常的情況包括: 本應使用POST方法的表單提交變成了GET方法,導致查詢字元串(Query String)過長。 重定向URI 「黑洞」,例如每次重定向把舊的 URI 作為新的 URI 的一部分,導致在若干次重定向後 URI 超長。 客戶端正在嘗試利用某些伺服器中存在的安全漏洞攻擊伺服器。這類伺服器使用固定長度的緩沖讀取或操作請求的 URI,當 GET 後的參數超過某個數值後,可能會產生緩沖區溢出,導致任意代碼被執行[1]。沒有此類漏洞的伺服器,應當返回414狀態碼。
415 對於當前請求的方法和所請求的資源,請求中提交的實體並不是伺服器中所支持的格式,因此請求被拒絕。
416 如果請求中包含了 Range 請求頭,並且 Range 中指定的任何數據范圍都與當前資源的可用范圍不重合,同時請求中又沒有定義 If-Range 請求頭,那麼伺服器就應當返回416狀態碼。 假如 Range 使用的是位元組范圍,那麼這種情況就是指請求指定的所有數據范圍的首位元組位置都超過了當前資源的長度。伺服器也應當在返回416狀態碼的同時,包含一個 Content-Range 實體頭,用以指明當前資源的長度。這個響應也被禁止使用 multipart/byteranges 作為其 Content-Type。
417 在請求頭 Expect 中指定的預期內容無法被伺服器滿足,或者這個伺服器是一個代理伺服器,它有明顯的證據證明在當前路由的下一個節點上,Expect 的內容無法被滿足。
421 從當前客戶端所在的IP地址到伺服器的連接數超過了伺服器許可的最大范圍。通常,這里的IP地址指的是從伺服器上看到的客戶端地址(比如用戶的網關或者代理伺服器地址)。在這種情況下,連接數的計算可能涉及到不止一個終端用戶。
422 從當前客戶端所在的IP地址到伺服器的連接數超過了伺服器許可的最大范圍。通常,這里的IP地址指的是從伺服器上看到的客戶端地址(比如用戶的網關或者代理伺服器地址)。在這種情況下,連接數的計算可能涉及到不止一個終端用戶。
422 請求格式正確,但是由於含有語義錯誤,無法響應。(RFC 4918 WebDAV)423 Locked 當前資源被鎖定。(RFC 4918 WebDAV)
424 由於之前的某個請求發生的錯誤,導致當前請求失敗,例如 PROPPATCH。(RFC 4918 WebDAV)
425 在WebDav Advanced Collections 草案中定義,但是未出現在《WebDAV 順序集協議》(RFC 3658)中。
426 客戶端應當切換到TLS/1.0。(RFC 2817)
449 由微軟擴展,代表請求應當在執行完適當的操作後進行重試。
500 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在伺服器的程序碼出錯時出現。
501 伺服器不支持當前請求所需要的某個功能。當伺服器無法識別請求的方法,並且無法支持其對任何資源的請求。
502 作為網關或者代理工作的伺服器嘗試執行請求時,從上游伺服器接收到無效的響應。
503 由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以後恢復。如果能夠預計延遲時間,那麼響應中可以包含一個 Retry-After 頭用以標明這個延遲時間。如果沒有給出這個 Retry-After 信息,那麼客戶端應當以處理500響應的方式處理它。 注意:503狀態碼的存在並不意味著伺服器在過載的時候必須使用它。某些伺服器只不過是希望拒絕客戶端的連接。
504 作為網關或者代理工作的伺服器嘗試執行請求時,未能及時從上游伺服器(URI標識出的伺服器,例如HTTP、FTP、LDAP)或者輔助伺服器(例如DNS)收到響應。 注意:某些代理伺服器在DNS查詢超時時會返回400或者500錯誤
505 伺服器不支持,或者拒絕支持在請求中使用的 HTTP 版本。這暗示著伺服器不能或不願使用與客戶端相同的版本。響應中應當包含一個描述了為何版本不被支持以及伺服器支持哪些協議的實體。
506 由《透明內容協商協議》(RFC 2295)擴展,代表伺服器存在內部配置錯誤:被請求的協商變元資源被配置為在透明內容協商中使用自己,因此在一個協商處理中不是一個合適的重點。
507 伺服器無法存儲完成請求所必須的內容。這個狀況被認為是臨時的。WebDAV (RFC 4918)
509 伺服器達到帶寬限制。這不是一個官方的狀態碼,但是仍被廣泛使用。
510 獲取資源所需要的策略並沒有沒滿足。(RFC 2774)
8. XP藍屏的原因
藍屏故障和其它故障一樣,根據成因大致可以分為軟體和硬體兩個方面。現在還是遵循先軟後硬的原則來看看故障的成因和解決辦法吧!
一、軟體引起的藍屏故障
1.重要文件損壞或丟失引起的藍屏故障(包括病毒所致)。
實例:Win98中的VxD(虛擬設備驅動程序)或是.DLL�動態連接庫之類的重要文件丟失,情況一般會比較嚴重,會出現「藍屏警告」。
解決方法一:記下所丟失或損壞的文件名�用Win98啟動盤中的「Ext」命令從Win98安裝盤中提取和恢復被損壞或丟失的文件,步驟如下:
(1)用Win98啟動盤引導計算機,在提示符下敲入「Ext」命令。
(2)在提示「Please enter the path to the Windows CAB files( a):」後輸入Win98安裝壓縮包所在的完整路徑,如「F�\Pwin98\Win98」,完成後回車。
(3)在提示「Please enter the name(s)of the file(s) you want to extract:」後輸入你記下的丟失文件名,如「Bios.Vxd」,回車。
(4)在解壓路徑提示「Please enter path to extract to(『Enter』 for current directory):」後輸入文件將被解壓到的完整路徑,如「C� \Windows\System」並敲回車。
(5)最後出現確認提示「Is this Ok?(y/n):」,輸入「y」後回車。「Ext」程序會自動查找安裝盤中的CAB壓縮包,並將文件釋放到指定的位置。
(6)重新啟動即可。
解決方法二:用殺毒軟體殺毒。有的病毒可能會破壞注冊表項�殺毒後注冊表應恢復中毒之前的備份。
解決方法三:如果能啟動圖形界面,可以採取重裝主板以及顯卡的驅動程序,和進行「系統文件掃描」來恢復被破壞或丟失的文件。「系統文件掃描」的方法為�單擊「開始/程序/附件/系統工具/系統信息/工具/系統文件檢查器」,然後掃描改動過的文件即可。
2.注冊表損壞導致文件指向錯誤所引起的藍屏。
實例:注冊表的擅自改動(包括人為地改動和軟體安裝時的自動替換)�其現象表現為開機或是在調用程序時出現藍屏,並且屏幕有出錯信息顯示(包含出錯的文件名)。
解決方法一:恢復備份。
(1)單擊「開始/關機/重新啟動計算機並切換到MS-DOS方式」,然後單擊「是」;
(2)進入Windows目錄下。例如,如果你的Windows安裝在「C�\Windows」 目錄下,應鍵入以下內容�「CD C�\WINDOWS」後回車;
(3)鍵入「SCANREG\RESTORE」後回車。
(4)按照上述步驟,可以將注冊表恢復到最近一次啟動計算機時的狀態。
解決方法二:刪除鍵值。
如果是在卸載程序後出現藍屏的話,筆者斷定故障是由於程序卸載不完善造成的。解決這類問題非常簡單,首先你要記下出錯的文件名,然後再到注冊表中找到以下分支「HKEY_LOCAL_MACHINE\System
\CurrentControlSet\Services\VxD」。在「查找」中輸入剛才的文件名,把查到的鍵值刪除即可。此時,千萬不要忘記備份注冊表哦!
典型案例:筆者在刪除金山毒霸時中途死機,重新啟動後剛看到桌面的圖標就出現藍屏,並伴有錯誤信息出現。錯誤信息中提到Kavkrnl.vxd文件找不到,筆者首先根據文件名的前兩個字元確定該文件不是Win98的系統文件,ka開頭的應是金山毒霸的虛擬設備驅動程序。基本判斷為文件指向錯誤,於是決定刪除它在注冊表中相應鍵值。在注冊表編輯器的查找中輸入「Kavkrnl.vxd」,將它在「HKEY_LOCAL_
MACHINE\System\CurrentControlSet\Services\VxD」中的相應主鍵值刪除,重啟後故障消除。
3.System.ini 文件錯誤引起的「藍屏」。
實例:軟體卸載或是安裝後未即時更新System.ini 文件所造成的錯誤。
解決方法:禁用注冊表中該項或是重新安裝相應的軟體或驅動程序。
4.Win98自身的不完善造成的藍屏。
實例:Win98的sp1和Microsoft的Vxd_fix.exe補丁程序對Win98的穩定性起著至關重要的作用。
解決方法:快去下載吧,如華軍網站南京站http�//nj.onlinedown.net/Win98SP1.htm�Win98sp1及http�//nj.onlinedown.net/Windows98VxDpatch.htm� Vxd_fix.exe。
5.系統資源耗盡引起的藍屏故障。
實例:藍屏故障常常發生在進行一項比較大的工作時,或是在保存復制的時候,且往往發生得比較突然。這類故障的發生原因主要是與三個堆資源(系統資源、用戶資源、GDI資源)的佔用情況有關。
解決方法:打開你的資源狀況監視器,看一下剩餘資源,如果你的三種資源都在50%甚至更低,就很容易出現諸如「非法操作」、「藍屏」或「死機」故障。為此,必須減少資源浪費,減少不必要的程序載入,避免同時運行大程序(圖形、聲音和視頻軟體),例如載入計劃任務程序,輸入法和聲音指示器,音效卡的DOS驅動程序,系統監視器程序等等。
6.DirectX問題引起的藍屏故障。
實例:(1)DirectX版本過低或是過高;(2)游戲與它不兼容或是不支持;(3)輔助重要文件丟失;(4)顯卡對它不支持。
解決方法:升級或是重裝DirectX。如果是顯卡不支持高版本的DirectX那就說明你的顯卡實在是太老了,嘗試更新顯卡的BIOS和驅動程序,否則,只好花錢升級顯卡了。
二、硬體引起的藍屏故障
1.內存超頻或不穩定造成的藍屏。
實例:隨機性藍屏。
解決方法:先用正常頻率運行,若還有問題。找一根好的內存條進行故障的替換查找,一般可以解決。再就是應當注意當CPU離內存很近時內存的散熱問題。
2.硬體的兼容性不好引起的藍屏。
兼容機好就好在它的性價比較高,壞就壞在它在進行組裝的時候,由於用戶沒有完善的監測手段和相應的知識,無法進行一系列的兼容性測試,從而把隱患留在了以後的使用過程中。
實例:升級內存時,將不同規格的內存條混插引起的故障。
解決方法:注意內存條的生產廠家、內存顆粒和批號的差異,往往就是因為各內存條在主要參數上的不同而產生了藍屏或死機,甚至更嚴重的內存故障。也可以換一下內存條所插的插槽位置。如果內存條還是不能正常工作,那就只好更換了。此處,提醒各位:內存在整個微機系統中起著非常重要的作用,它的好壞將直接影響到系統的穩定性,所以在內存的選購時要注意,最好是有內行人陪伴,避免買到Remark過的條子或頻率過低的條子。
3.硬體散熱引起的「藍屏」故障。
實例:在微機的散熱問題上所出現的故障,往往都有一定規律,一般在微機運行一段時間後才出現,表現為藍屏死機或隨意重啟。故障原因主要是過熱引起的數據讀取和傳輸錯誤。
解決方法:採取超頻的應降頻,超溫的應降溫。其實不一定所有的故障都那麼復雜,有時候從簡單的方面考慮,也能很好地解決問題�要學會觸類旁通。
4.I/O沖突引起的藍屏現象。
解決方法:這種現象出現得比較少,如果出現了,可以從系統中刪除帶!號或?號的設備名,重新啟動計算機進行確認,或者請高手手動分配系統資源。
凡事要防患於未然,下面是筆者總結出來的一些經驗,可供大家參考:
1定期對重要的注冊表文件進行手工備份,避免系統出錯後,未能及時替換成備份文件而產生不可挽回的錯誤。
2盡量避免非正常關機,減少重要文件的丟失。如.VxD .DLL文件等。
3對普通用戶而言,只要能正常運行,沒有必要去升級顯卡、主板的BIOS和驅動程序,避免升級造成的危害。
4定期檢查優化系統文件,運行「系統文件檢查器」進行文件丟失檢查及版本校對。檢查步驟參見前面相關介紹。
5減少無用軟體的安裝,盡量不用手工卸載或刪除程序,以減少非法替換文件和文件指向錯誤的出現。
6如果不是內存特別大和其管理程序非常優秀,盡量避免大程序的同時運行,如果你發現在聽MP3時有沙沙拉拉的聲音,基本可以判定該故障是由內存不足而造成的。
9. web前端有哪些性能優
一,關鍵資源位元組數
位元組數也就是我通常說的減少資源文件(js,css,image,video...)的大小
1,壓縮
前端使用uglify混淆壓縮
後端開啟gzip
對圖片進行壓縮,使用壓縮比例更高的格式(webP)
強緩存(http狀態碼:200),不用請求伺服器直接使用本地緩存
協商緩存(http狀態碼:304),使用時先請求伺服器若被告知緩存沒過期則使用本地緩存,不用下載資源
使用localstorage對數據進行存儲
使用http2.0的多路復用合並請求
配置combo,在無法使用http2.0的情況下作為一種合並資源請求的手段
使用spite圖
使用svg-symbol
2,緩存
3,針對首屏優化
對非關鍵資源延遲載入、非同步載入,減少首屏資源大小
二,關鍵資源連接數
1,合並請求
2,減少圖片請求數
3,針對一些場景採用css、js內聯的方式
4,使用強緩存減少了一次伺服器請求
5,非關鍵資源延遲、非同步載入,減少了首屏資源連接數
三,關鍵渲染路徑
網上有張關於頁面渲染路徑的圖,這里我就不放了,大家有興趣自己網路下
1,bigpipe分塊輸出
這里主要是因為要完成一整個頁面的輸出後端需要處理很多個任務,我們可以將這些多個任務進行分塊,誰先完成誰就先輸出,最終通過JS回填的方式輸出DOM節點。這種方式主要解決了直出頁面阻塞的問題
2,bigrender分塊渲染
常規的手段就是採用前端模板渲染頁面,針對首屏時間主要減少了首次構建DOM樹時的節點數
3,針對reflow,repaint,composit路徑處理
4,涉及到動畫時關於layer的概念render layer、graphics layer
5,css放在頭部、js放底部避免阻塞DOM樹的構建,
關於css、js的位置對於頁面渲染的影響大家可以關注下相關的文章。
核心:css資源不會阻塞DOM樹的構建但會阻塞DOM的渲染,JS會阻塞DOM樹的構建,CSS會阻塞JS的執行