深入Web請求過程
B/.S架構的好處:
B/S架構帶來兩方面好處:
l 客服端使用統一瀏覽器,由於瀏覽器具有統一性,有效屏蔽了不同服務提供商提供給用戶使用服務的差異性。、
l 服務端基於統一的HTTP,為服務提供商簡化了開發模式,節省開發成本,服務開發者只需要關注提供服務的應用邏輯。
B/S網絡架構概述
B/S網絡架構從前端到后端都是基於統一的應用層協議HTTP來交互數據,與傳統C/S架構采用的長連接的交互模式不同,HTTP采用無狀態的短連接的通信方式。通常情況下,一次請求就完成一次數據交互,通常對應一個業務邏輯,然后通信連接就斷開了。采用這種方式是為了能夠同時服務更多的用戶。
如下圖所示:用戶在瀏覽器輸入網址,首先會先請求DNS把這個域名解析成對應ip地址,然后根據這個ip地址在互聯網找到對應服務器,發送一個get請求,服務器返回默認的數據資源給訪問的用戶。如果有服務器多台,還需要一個負載均衡設備來平均分配所有用戶的請求。

如何發起一個請求
發起一個HTTP請求的過程就是建立一個Socket通信過程。在瀏覽器建立Socket連接之前,必須根據地址欄里寫入的URL的域名DNS解析出IP地址,再根據這個IP地址和默認的80端口與遠程服務器建立Socket連接,然后瀏覽器根據這個url組裝成一個get類型的HTTP請求頭,發送給目標服務器,服務器發回數據,斷開連接。
Linux下可以使用curl+url就可以簡單發起HTTP請求。查看http頭信息,加上-I選項
HTTP解析
常見HTTP請求頭:
Accept-Charset :用於指定客戶端接受的字符集
Accept-Encoding: 用於指定可接受的內容編碼
Accept-Language:用於指定一種自然語言
Host:用與指定被請求資源的Intent主機和端口號
User-Agent:客服端將他操作系統,瀏覽器和其他屬性告訴服務器
Connection:當前連接是否保持
常見HTTP相應頭:
Server:使用服務器名稱
Content-Type:用來指明發送給接收者的實體正文的媒體類型
Content-Encoding:與請求報頭Accept-Encoding對應,告訴瀏覽器服務端采用的是什么壓縮編碼
Content-Language:描述了資源所用的自然語言。
Content-Length:指明實體正文的長度,用以字節方式存儲的十進制數字來表示
Keep-Alive:保存連接的時間
常見HTTP狀態嗎:
200:客戶端請求成功
302:臨時跳轉,跳轉的地址通過Location指定
400:客戶端請求有語法錯誤,不能被服務器識別
403:服務器收到請求,但拒絕提供服務
404:請求的資源不存在
500:服務器發生不可預期的錯誤
瀏覽器緩存機制:
瀏覽器緩存是一個比較復雜但是又比較重要的機制。按ctrl+f5組合鍵刷新頁面,會重新請求服務器,即使是請求服務器,也有可能服務器的前端部署一個緩存服務器,為了讓用戶能夠看到最新數據,必須通過HTTP來控制。在請求頭加上Pragma:no-cache和Cache-Control:no-cache。
HTTP Head字段用於指定所有緩存機制在整個請求響應鏈中必須服從的指令。
HTTP Head字段的可選值:
Public:所有內容都被緩存,在響應頭設置。
Private:內容只緩存到私有緩存中,在響應頭設置。
No-cache: 所有內容不會被緩存
No-store:所有內容不會被緩存到緩存或Intent臨時文件中
Must-revalidation/proxy-revalidation:如果緩存內容失敗,請求必須發送到服務器進行重新驗證
Max-age=xx:緩存內容在xxx秒后失效,這個只在HTTP1.1可用。
Expires:通常使用格式是:Expries:Sat,25 Feb 2012 12:22:17 GMT 后面跟着一個日期和時間,超過這個時間值,緩存的內容將失效。也就是瀏覽器在發出請求之前檢查這個頁面這個字段。
Last-Modified/Etag:
Last-Modified字段一般用於一個服務器上的資源最后修改時間,資源可以是靜態(靜態內容自動加上Last-Modified)或者動態的內容(Servlet提供一個getLastModified方法用於檢查某個動態內容是否已經更新),通過這個最后修改時間可以判斷當前請求的資源是否最新的。
瀏覽器再次請求子啊請求頭增加一個If-Modified-Since: 字段,詢問當前緩存的頁面是否最新。如果最新,服務器返回304.
Etag這個字段讓服務器給每個一個頁面分配一個唯一編號,區分當前這個頁面是否最新的。如果多台服務器,就比較難處理。
DNS域名解析

Linux和window可以使用nslookup來查詢域名解析結果,linux 還可以使用dig命名來查詢DNS解析過程。加上trace 可以跟蹤域名解析過程
DNS解析后會緩存解析結果,其中主要兩個地方緩存結果,一個是本地域名服務器,一個用戶本地機器。這個兩個緩存都是TTL值和本機緩存大小控制的,本地機器可以使用ipconfig/flushdns命令來刷新緩存。 Linux 通過/etc/init.d/nscd restartlai 清除。
在Java的jvm 也會緩存DNS的解析成果。這個緩存在InetAddress類中,有兩種緩存策略:一種是正確解析結果緩存,另一種是失敗的解析結果緩存。這個兩個緩存時間由lib\security\java.security文件中配置,networkaddress.cache.ttl和networkaddress.cache.negative.ttl 默認值-1(永不失效)和10(緩存10秒)
需要使用InetAddress類解析域名,必須是單例模式,不然會有嚴重性能問題。每次創建InetAddress=實例,則每次都要進行完整域名解析。
域名解析記錄分為A記錄,MX記錄,CNAME記錄,NS記錄,TXT記錄
A記錄:用來指定對應的IP地址。A記錄可以將多個域名解析到一個IP地址,但是不能將一個域名解析多個IP地址。
MX:記錄:就是將某個域名下郵件服務器向自己的郵箱服務器。
CNAME:別名解析.所謂別名解析就是為一個域名設置一個或多個別名。
NS記錄:為某個域名指定DNS解析服務器,也就是這個域名有指定的IP地址的DNS服務器去解析。
TXT記錄:為某個主機名或域名設置說明。
CDN工作機制
CDN就是內容分部網絡。是一種先進的流量分配網絡,其目的提高用戶訪問網站的相應速度,有別於鏡像,比鏡像更智能。目前以靜態數據為主,用戶從主服務器請求到動態內容,再從CDN上下載靜態數據,從而加速網頁數據內容的下載速度。
負載均衡:就是對工作任務進行平衡。分攤到個多個操作單元上執行。可以提高服務器響應速度以及利用效率,避免軟件或者硬件出現單點失效,解決網絡擁塞問題,實現地理位置無關行,為用戶提供一致的訪問質量。
