協議篇
整體來講分爲如下幾個過程:css
(1)DNS服務器
解析域名,找到對應服務器的IP地址
;html
(2)和服務器創建TCP三次握手
鏈接;前端
(3)發送HTTP請求
,服務器會根據HTTP請求到數據服務器取出相應的資源,並返回給瀏覽器;web
(4)瀏覽器處理響應面試
html頁面
的加載順序是從上而下的。css文件
、圖片
等資源,瀏覽器會再發起一次http請
求,來獲取外部資源。js文件
,html文檔
會掛起渲染(加載解析渲染同步)的線程,等待js文件加載、解析完畢才能夠恢復html文檔的渲染線程。DOM樹
和CSSDOM樹
。推薦 浪裏行舟
文章 從URL輸入到頁面展示到底發生什麼?算法
瀏覽器解析渲染頁面分爲一下五個步驟:數據庫
HTML
解析出 DOM 樹
CSS
解析生成 CSS 規則樹
DOM 樹
和CSS 規則樹
,生成渲染樹
1)DNS查詢過程以下:json
首先搜索瀏覽器自身的DNS緩存
,若是存在,則域名解析到此完成。數組
若是瀏覽器自身的緩存裏面沒有找到對應的條目,那麼會嘗試讀取操做系統的hosts文件
看是否存在對應的映射關係,若是存在,則域名解析到此完成。瀏覽器
若是本地hosts文件不存在映射關係,則查找本地DNS服務器
(ISP服務器,或者本身手動設置的DNS服務器),若是存在,域名到此解析完成。
若是本地DNS服務器還沒找到的話,它就會向根服務器
發出請求,進行遞歸查詢。
2)DNS 屬於哪一個層級?工做在哪一個層級?
DNS
屬於應用層
協議, 至於TCP/UDP哪一層上面跑,DNS 默認端口是53,走 UDP
DNS 的解析的幾個記錄類型須要瞭解:
CNAME
: 能夠多個域名映射到一個主機,相似在 Github Page就用 CNAME 指向 -MX
: 郵件交換記錄,用的很少,通常搭建郵件服務器纔會用到NS
: 解析服務記錄,能夠設置權重,指定誰解析TTL
: 就是生存時間(也叫緩存時間),通常的域名解析商都有默認值,也能夠人爲設置TXT
: 通常指某個主機名或域名的說明什麼是CDN
全稱 Content Delivery Network
,即內容分發網絡
。
摘錄一個形象的比喻,來理解CDN是什麼。
10年前,尚未火車票代售點一說,12306.cn更是無從提及。那時候火車票還只能在火車站的售票大廳購買,而我所在的小縣城並不通火車,火車票都要去市裏的火車站購買,而從我家到縣城再到市裏,來回就是4個小時車程,簡直就是浪費生命。後來就行了,小縣城裏出現了火車票代售點,甚至鄉鎮上也有了代售點,能夠直接在代售點購買火車票,方便了很多,全市人民不再用在一個點苦逼的排隊買票了。
簡單的理解CDN
就是這些代售點(緩存服務器
)的承包商,他爲買票者提供了便利,幫助他們在最近的地方(最近的CDN節點
)用最短的時間(最短的請求時間)買到票(拿到資源),這樣去火車站售票大廳排隊的人也就少了。也就減輕了售票大廳的壓力(起到分流做用,減輕服務器負載壓力)。
用戶在瀏覽網站的時候,CDN會選擇一個離用戶最近的CDN邊緣節點來響應用戶的請求,這樣海南移動用戶的請求就不會千里迢迢跑到北京電信機房的服務器(假設源站部署在北京電信機房)上了。
CDN緩存
關於CDN緩存,在瀏覽器本地緩存失效後,瀏覽器會向CDN邊緣節點發起請求。相似瀏覽器緩存,CDN邊緣節點也存在着一套緩存機制。CDN邊緣節點緩存策略因服務商不一樣而不一樣,但通常都會遵循http標準協議,經過http響應頭
中的
Cache-control: max-age //後面會提到
複製代碼
複製代碼的字段來設置CDN邊緣節點
數據緩存時間。
當瀏覽器向CDN節點請求數據時,CDN節點會判斷緩存數據是否過時,若緩存數據並無過時,則直接將緩存數據返回給客戶端;不然,CDN節點就會向服務器發出回源請求,從服務器拉取最新數據,更新本地緩存,並將最新數據返回給客戶端。
CDN服務商通常會提供基於文件後綴、目錄多個維度來指定CDN緩存時間,爲用戶提供更精細化的緩存管理。
CDN 優點
CDN節點
解決了跨運營商和跨地域訪問的問題,訪問延時
大大下降
。分流做
用,減輕了源服務器的負載
。請看webfansplz
的文章 實踐這一次,完全搞懂瀏覽器緩存機制
三級緩存原理 (訪問緩存優先級)
瀏覽器緩存的分類
強緩存
協商緩存
瀏覽器再向服務器請求資源時,首先判斷是否命中強緩存,再判斷是否命中協商緩存!
瀏覽器緩存的優勢
1.減小了冗餘的數據傳輸
2.減小了服務器的負擔,大大提高了網站的性能
3.加快了客戶端加載網頁的速度
強緩存
瀏覽器在加載資源時,會先根據本地緩存資源的 header 中的信息判斷是否命中強緩存,若是命中則直接使用緩存中的資源不會再向服務器發送請求。
複製代碼
這裏的 header
中的信息指的是expires
和 cahe-control
協商緩存
當強緩存沒有命中的時候,瀏覽器會發送一個請求到服務器,服務器根據 header 中的部分信息來判斷是否命中緩存。若是命中,則返回 304 ,告訴瀏覽器資源未更新,可以使用本地的緩存。
複製代碼
這裏的 header
中的信息指的是Last-Modify/If-Modify-Since
和 ETag/If-None-Match.
Last-Modified
與 ETag
是能夠一塊兒使用的,服務器會優先驗證 ETag
,一致的狀況下,纔會繼續比對 Last-Modified
,最後才決定是否返回304
。
總結
當瀏覽器再次訪問一個已經訪問過的資源時,它會這樣作:
複製代碼
參考文獻:
Trident
內核:IE
,MaxThon,TT,The Word,360
,搜狗
瀏覽器等。[又稱爲MSHTML]Gecko
內核:Netscape6及以上版本,FF
,MozillaSuite/SeaMonkey等;Presto
內核:Opera7
及以上。[Opera內核原爲:Presto,現爲:Blink]Webkit
內核:Safari
,Chrome
等。[Chrome的:Blink(Webkit的分支)]對於Android
手機而言,使用率最高的就是Webkit
內核。
協議篇
OSI七層模型 | 做用 | 對應協議 | 對應設備 |
---|---|---|---|
應用層 | 它是計算機用戶,以及各類應用程序和網絡之間的接口 | HTTP , FTP , SMTP , POP3 |
計算機設備 |
表示層 | 信息的語法語義以及它們的關係,如加密解密、轉換翻譯、壓縮解壓縮 | IPX, LPP, XDP | |
會話層 | 創建、維護、管理應用程序之間的會話 | SSL ,TLS , DAP , LDAP |
|
傳輸層 | 服務點編址,分段與重組、鏈接控制、流量控制、差錯控制 | TCP , UDP |
防火牆 |
網絡層 | 爲網絡設備提供邏輯地址,進行路由選擇、分組轉發 | IP ,ARP ,RARP ,ICMP ,IGMP |
路由器 |
數據鏈路層 | 物理尋址,同時將原始比特流轉變爲邏輯傳輸路線 | PPTP , ARP , RARP |
交換機 |
物理層 | 機械、電子、定時接口通道信道上的原始比特流傳輸 | IEEE 802.2, Ethernet v.2, Internetwork | 網卡 |
請求報文:請求行、請求頭、空行、請求體
響應報文:狀態行、響應頭、空行、響應體
以請求報文爲例:
請求行
: 這個好理解就是訪問的方法+ 協議+ 訪問的 URL 構成請求
頭: key-value值,告訴服務端須要的內容請求體
: 數據部分請求報文知道,那你說說cookie是如何跟隨請求的?
Cookie
就是保存在 HTTP 協議
的請求或者應答頭部(Cookie 是由服務端生成),這樣一路漂泊...
Cookie 隔離是什麼,如何作;
cookie 隔離就是下降 header
的數據包含,以達到加快訪問速度的目的
方案: 靜態資源丟 CDN或者非主域來加載
-GET
:獲取資源
POST
:傳輸資源PUT
:更新資源DELETE
:刪除資源HEAD
:得到報文首部1)GET
在瀏覽器回退時是無害的,而POST
會再次提交請求
2)GET
請求會被瀏覽器主動緩存,而POST
不會,除非手動設置
3)GET
請求參數會被完整保留在瀏覽器的歷史記錄裏,而POST
中的參數不會被保留
4)POST
比GET
安全,因參數暴露在URL上
5)GET
參數經過URL
傳遞,POST
放在Request body
中
高級區別:
GET
的本質是「得」,而 POST
的本質是「給」。GET
的內容能夠被瀏覽器緩存,而POST
的數據不能夠。
get
產生一個TCP
數據包,一個是請求頭,一個請求體的;post
產生兩個TCP
數據包;
在一次請求中,get
一次性完成,post
在部分瀏覽器(除了火狐)須要發送兩次信息,因此get比post更快,更有效率。
6) 補充補充一個get和post在緩存方面的區別:
get
請求相似於查找的過程,用戶獲取數據,能夠不用每次都與數據庫鏈接,因此可使用緩存。post
不一樣,post作的通常是修改和刪除的工做,因此必須與數據庫交互,因此不能使用緩存。所以get請求適合於請求緩存。推薦文章 WebTechGarden
微信公衆號的文章 99%的人都理解錯了HTTP中GET與POST的區別
get請求過程:(2次交互)
tcp
鏈接(第一次握手)tcp
鏈接(第二次握手)get
請求頭和數據(第三次握手,這個報文比較小,因此http會在此時進行第一次數據發送)200
ok響應。post請求過程:(3次交互)
tcp
鏈接(第一次握手)tcp
鏈接(第二次握手)post
請求頭(第三次握手,這個報文比較小,因此http會在此時進行第一次數據發送)服務器返回100 continue
響應
瀏覽器開始發送數據
服務器返回200 ok
響應
keep-Alive
模式(持久連接)時,keep-Alive功能使客戶端到服務器端的鏈接持久有效,當出現服務器的後繼請求時,keep-Alive避免從新創建鏈接http: 超文本傳輸協議,是互聯網上應用最爲普遍的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP),用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議,它可使瀏覽器更加高效,使網絡傳輸減小。
https: 是以安全爲目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層
,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。
https協議的主要做用是:創建一個信息安全通道,來確保數組的傳輸,確保網站的真實性。
http傳輸的數據都是未加密的,也就是明文的,網景公司設置了SSL協議來對http協議傳輸的數據進行加密處理,簡單來講https協議是由http和ssl協議構建的可進行加密傳輸和身份認證的網絡協議,比http協議的安全性更高。
複製代碼
主要的區別以下:
Https
協議須要ca證書,費用較高。http
是超文本傳輸協議,信息是明文傳輸,https
則是具備安全性的ssl
加密傳輸協議。http
協議的端口爲80,https
的端口爲443http
的鏈接很簡單,是無狀態的;HTTPS
協議是由SSL+HTTP
協議構建的可進行加密傳輸、身份認證的網絡協議,比http
協議安全。1)客戶使用https url訪問服務器,則要求web 服務器創建ssl連接。
2)web服務器接收到客戶端的請求以後,會將網站的證書(證書中包含了公鑰),返回或者說傳輸給客戶端。
3)客戶端和web服務器端開始協商SSL連接的安全等級,也就是加密等級。
4)客戶端瀏覽器經過雙方協商一致的安全等級,創建會話密鑰,而後經過網站的公鑰來加密會話密鑰,並傳送給網站。
5)web服務器經過本身的私鑰解密出會話密鑰。
6)web服務器經過會話密鑰加密與客戶端之間的通訊。
複製代碼
HTTPS
協議可認證用戶和服務器,確保數據發送到正確的客戶機和服務器;HTTPS
協議是由SSL+HTTP
協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全,可防止數據在傳輸過程當中不被竊取、改變,確保數據的完整性。HTTPS
是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增長了中間人攻擊的成本。https握手
階段比較費時,會使頁面加載時間延長50%,增長10%~20%的耗電。https緩存
不如http高效,會增長數據開銷。SSL證書
也須要錢,功能越強大的證書費用越高。SSL證書
須要綁定IP,不能再同一個ip上綁定多個域名,ipv4資源支持不了這種消耗。通常有兩種形式,非對稱加密,生成公鑰和私鑰,私鑰丟服務器,公鑰每次請求去比對驗證;
更嚴謹的採用 CA(Certificate Authority),給密鑰簽名....
對稱加密:
非對稱加密(通常用 RSA)
CA(數字簽名):
(1)TCP是面向鏈接的,udp是無鏈接的即發送數據前不須要先創建連接。
(2)TCP提供可靠的服務,UDP不可靠交付。而且由於tcp可靠,面向鏈接,不會丟失數據所以適合大數據量的交換。
(3)TCP是面向字節流,UDP面向報文,而且網絡出現擁塞不會使得發送速率下降。
(4)TCP只能是1對1的,UDP支持1對1,1對多。
(5)TCP的首部較大爲20字節,而UDP只有8字節。
(6)TCP是面向鏈接的可靠性傳輸,而UDP是不可靠的。
複製代碼
1XX: 通常用來判斷協議更換或者確認服務端收到請求這些
100: 服務端收到部分請求,如果沒有拒絕的狀況下能夠繼續傳遞後續內容
101: 客戶端請求變換協議,服務端收到確認
複製代碼
2xx: 請求成功,是否建立連接,請求是否接受,是否有內容這些
200: (成功)服務器已成功處理了請求。
201: (已建立)請求成功而且服務器建立了新的資源。
202: (已接受)服務器已接受請求,但還沒有處理。
204: (無內容)服務器成功處理了請求,但沒有返回任何內容。
複製代碼
3XX: 通常用來判斷重定向和緩存
301: 全部請求已經轉移到新的 url(永久重定向),會被緩存
302: 臨時重定向,不會被緩存
304: 本地資源暫未改動,優先使用本地的(根據If-Modified-Since or If-Match去比對服務器的資源,緩存)
複製代碼
4XX: 通常用來確認受權信息,請求是否出錯,頁面是否丟失
400: 請求出錯
401: 未受權,不能讀取某些資源
403: 阻止訪問,通常也是權限問題
404: 頁面丟失,資源沒找到
408: 請求超時
415: 媒介類型不被支持,服務器不會接受請求。
複製代碼
5XX: 基本都是服務端的錯誤
500: 服務端錯誤
502: 網關錯誤
504: 網關超時
複製代碼
(1)400狀態碼:請求無效
產生緣由:
前端提交數據的字段名稱和字段類型與後臺的實體沒有保持一致
前端提交到後臺的數據應該是json字符串類型,可是前端沒有將對象JSON.stringify轉化成字符串。
複製代碼
解決方法:
對照字段的名稱,保持一致性
將obj對象經過JSON.stringify實現序列化
複製代碼
(2)401狀態碼:當前請求須要用戶驗證
(3)403狀態碼:服務器已經獲得請求,可是拒絕執行
推薦文章 老錢的 跟着動畫來學習TCP三次握手和四次揮手
WebSocket
是HTML5
中的協議,支持持久連續,http協議不支持持久性鏈接。Http1.0和HTTP1.1都不支持持久性的連接,HTTP1.1中的keep-alive,將多個http請求合併爲1個
共同點:都是保存在瀏覽器端,而且是同源的
Cookie:能夠在瀏覽器和服務器端來回傳遞,存儲容量小,只有大約4K左右
sessionStorage:僅在當前瀏覽器窗口關閉前有效,天然也就不可能持久保持,localStorage:始終有效,窗口或瀏覽器關閉也一直保存,所以用做持久數據;cookie只在設置的cookie過時時間以前一直有效,即便窗口或瀏覽器關閉。
localStorage:localStorage在全部同源窗口中都是共享的;cookie也是在全部同源窗口中都是共享的,無論窗口或者瀏覽器關閉與否都會始終生效
補充說明一下cookie的做用:
保存用戶登陸狀態。例如將用戶id存儲於一個cookie內,這樣當用戶下次訪問該頁面時就不須要從新登陸了,如今不少論壇和社區都提供這樣的功能。
cookie還能夠設置過時時間,當超過期間期限後,cookie就會自動消失。所以,系統每每能夠提示用戶保持登陸狀態的時間:常見選項有一個月、三個 月、一年等。
跟蹤用戶行爲。例如一個天氣預報網站,可以根據用戶選擇的地區顯示當地的天氣狀況。若是每次都須要選擇所在地是煩瑣的,當利用了cookie後就會顯得很人性化了,系統可以記住上一次訪問的地區,當下次再打開該頁面時,它就會自動顯示上次用戶所在地區的天氣狀況。由於一切都是在後 臺完成,因此這樣的頁面就像爲某個用戶所定製的同樣,使用起來很是方便
定製頁面。若是網站提供了換膚或更換佈局的功能,那麼可使用cookie來記錄用戶的選項,例如:背景色、分辨率等。當用戶下次訪問時,仍然能夠保存上一次訪問的界面風格。
兩種模式 hash 和 history。
推薦尋找海藍96
的文章 面試官: 你瞭解前端路由嗎?
多臺服務器共同協做,不讓其中某一臺或幾臺超額工做,發揮服務器的最大做用
http重定向
負載均衡:調度者根據策略選擇服務器以302響應請求,缺點只有第一次有效果,後續操做維持在該服務器dns
負載均衡:解析域名時,訪問多個ip服務器中的一個(可監控性較弱)反向代理
負載均衡:訪問統一的服務器,由服務器進行調度訪問實際的某個服務器,對統一的服務器要求大,性能受到 服務器羣的數量