幾天前,看到了這樣一本書,《深入分析JavaWeb技術內幕》,作者是許令波,非常全面的對整個web進行了分析和講解,但是其中可能會有很多地方和名詞對於一個我來說,不能理解,所以根據原文,總結整理了這個筆記。
1.B/S架構帶來的好處
a.統一使用瀏覽器,操作起來相對簡單,且瀏覽器具有統一性,屏蔽了用戶使用服務的差異性。
b.服務端(S端)統一使用http協議,簡化開發模式,並且使開發模式規範化,降低開發人員的開發成本和學習成本。
2.B/S架構的概述
a. B/S架構基於統一的應用層協議http來進行數據交互,C/S架構通常使用長連接(始終保持連接狀態),http協議使用無狀態短連接的通信方式,一次請求對應一次數據交互,也就是對應一個業務邏輯(比如進行一次搜索),請求之後斷開通信連接,這樣做的好處就是保證同時服務更多的用戶,保證高併發的訪問。目前B/S架構都採用類似於下圖所示架構設計,既滿足海量用戶的訪問請求,又要保證用戶請求的快速響應,所以網絡結構也變得越來越複雜。
一個用戶在瀏覽器中輸入一個URL(如www.baidu.com)時,會發生這樣的一些操作,首先他會請求DNS把這個域名解析成對應的IP地址,然後瀏覽器根據這個IP地址去查找對應的服務器,再向這個服務器發送一個請求,然後在服務器上進行一些操作,然後由服務器決定返回默認的數據資源給訪問的用戶。(由上圖可以看出,服務器端還有很多複雜的邏輯,比如服務器可能有多臺,到底是那一臺服務器來響應這個請求,這裏需要一個負載均衡設備來平均所有的請求,當數據返回瀏覽器時,瀏覽器再解析是發現還有一些靜態的數據比如JS和CSS或者圖片時,會發起另外的http請求,而這個請求,而這些請求很可能在CDN上,然後CDN服務器又會處理這個請求)。不管網絡架構如何變化,始終有些固定不變的原則需要遵守
a.互聯網上所有的資源都需要一個URL來表示
b.必須基於HTTP協議與服務端來進行交互
c.數據展示必須在瀏覽器中
3.如何發起一個請求
瀏覽器在地址欄輸入URL,然後根據URL的域名DNS解析出對應的IP地址和端口號,在根據這個IP地址和端口號與遠程服務器建立SOCKET連接
,然後瀏覽器根據這個URL,構建一個get類型的HTTP請求頭,使用outputStream.write發送到目標服務器,服務器根據inputStream.read返回數據,然後斷開連接。
4.常見的http請求頭,響應頭,狀態碼
5.瀏覽器的緩存機制:瀏覽器緩存是一個比較複雜並且重要的機制,在瀏覽器端如果進行同一個請求,就有可能拿到瀏覽器中緩存 的數據,一個非常有效的解決辦法就是按ctrl+f5組合鍵,ctrl+F5瀏覽器會直接想目標URL發送請求,不會取
瀏覽器的緩存數據,其次 在服務端也可能會有緩存的數據(服務器的前端可能有一個緩存服務器,如 Varnish代理,Varnish也肯能直接拿取緩存的數據),所以爲了保證拿到最新的數據,必須通過HTTP協議來
進行控制,使用ctrl+F5組合鍵的時候,在HTTP的情求頭中會增加一些請求頭,他會告訴服務器我們要的是最 新的數據。
這裏的請求頭是:
a.Cache-Control(多種瀏覽器支持)/Pragma(服務器遵守):這個HTTP head字段用於指定所有緩存機制在 整個請求/響應鏈中必須服從的指令,不僅可以控制 瀏覽器端,還可以控制緩存或代理服務器
b.Expires:後面通常跟着的是時間格式,超過這個時間之後,緩存內容就將失效,瀏覽器再發送請求之前來檢 查這個字段 查看這個頁面是否過期,若是過期則重新請求。
c.Last-Modified/Etag:Last-Modified用於表示資源的最後一次修改時間,瀏覽器發送請求時,請求頭中會 帶這個字段,來詢問這個資源修改時間是否是最新,如果是最新的,就返回304狀態碼,服務器不會返回數據
給瀏覽器。Etag與 Last-Modified很像,只不過它是爲每一個頁面分配唯一的編號,然後通過編號來判斷是否 是最新的。
6.DNS域名解析過程 :DNS的工作就是將域名解析成IP地址。(如圖)
DNS的解析過程:
第一步:瀏覽器檢測緩存中有沒有這個域名對應的解析過的IP地址,如果緩存中有,結束解析(瀏覽器中緩存 與域名是 有限制的,時間和大小上都有限制,時間限制由TTL屬性設置,這個時間太長太短都不好,
太長,有可能服務器 地址發生變化,太短,會導致每次請求都需要解析)
第二步:如果瀏覽器中沒有這個域名的緩存,瀏覽器會查找操作系統緩存中是否有這個域名對應的解析結果.
第三步:如果在本機中無法完成域名的解析,就會來到這一步。我們的網絡配置中DNS服務器地址這一項, 操作系統會把域名發送給這裏設置的LDNS(本地區的域名服務器),大約80%域名的解析到這一步
就結束了。
第四步:如果LDNS沒有解析成功,就會到Root Server域名服務器進行解析。
第五步:根域名服務器會返回給LDNS一個所查詢域的主域名(gTLD Server)服務器地址,gTLD是世界上頂 級域名服務 器,如com cn 全世界只有13臺左右
第六步:本地服務器再向主域名服務器發送請求
第七步:接受請求的主域名服務器查找並返回此域名對應的NameServer域名服務器地址(這個域名服務器通 常就是你要訪問的那個域名的域名提供商)
第八步:NameServer域名服務器會查詢儲存的域名服務器和IP的映射關係表,然後將查詢的IP以及TTL傳回 LDNS
第九步:LDNS會緩存這個域名和IP的對應關係,緩存時間由TTL控制。
第十步:把解析結果返回給用戶,用戶根據TTL值,將結果保存至本地緩存中。
7.清除緩存的域名:域名一般會緩存在兩個位置,一個是LDNS,一個是用戶的本地機器,這兩個的緩存時間都是由TTL和本地緩存 大小控制的,基本上來說LDNS上面的緩存時間就是TTL,控制,很難人工介入,但是本地緩存可以通過
ipconfig/flushdns來清除,在java應用中JVM也會緩存DNS解析結果,這個緩存是在InetAddress中完成的, 而且緩存比較特殊,它有兩種緩存策略,一種是正確解析結果緩存,另一個是失敗的解析結果緩存,這兩個的
緩存時間由一個配置項控制,是在java的lib下面的security/java.swecurity中配置的,他們兩個的配置項分別是 networkaddress.cache.ttl和networkaddress.cache.negative.ttl,他們的默認值分別爲-1(永不失效)和
10(10秒後失效),可以直接修改
注意:使用InetAddress來進行域名解析是,一定要使用單例,否則會有嚴重性能問題(因爲每次創建都是一次 完整解析)
8.CDN
a:CDN的定義:CDN(content Delivery Network)也就是內容分佈網絡,它是構築在現有Internet上的一種 先進 的流量分配網絡。
b:CDN的工作機制:其目的是通過現有Internet增加一種新的網絡架構,將網站內容發送到最接近用戶的網 絡“邊緣”使用戶就近取得信息,提高響應效率,目前CDN主要已緩存靜態數據爲主,如CSS,JS等,用戶從主
網站請求動態內容再從CDN上下載靜態數據。
c.CDN要達到的目標:可擴展行(性能可擴展:應對新增大量數據,用戶,事物的拓展能力。成本可擴展:用低 廉的運營成本提供動態的服務能力和高質量內容的分發);安全性;可靠性;
9.負載均衡:負載均衡就是對任務進行平衡,分攤到多個操作單元上執行,如應用服務器,圖片服務器,通常有三種負載均衡架構
鏈路負載均衡,集羣負載均衡以及操作系統負載均衡。
通過DNS解析出不同的IP,用戶根據不同的IP訪問不同的服務器,這就是一種鏈路負載均衡。
集羣負載均衡分爲硬件負載均衡和軟件負載均衡,硬件負載均衡成本高,性能好,但是不能進行動態擴容,軟件負載均 衡 成本低,但是要經過多個代理服務器會增加網絡延時。
操作系統負載均衡,就是利用操作系統級別的軟中斷或者是硬件中斷來達到負載均衡,比如多隊列網卡。
註解:
應用層協議http:TCP/IP是個協議組,大致可以分爲五個層次:應用層,傳輸層,網絡層,數據鏈路層,物理層
每個層下面都有很多的協議:
應用層:http----超文本傳輸協議,用於網頁瀏覽
smtp----簡單郵件傳輸協議,用於郵件發送
pop3----郵局協議版本3,用於郵件接收
telnet---- 用於遠程登陸
snmp----簡單網絡管理協議,用於網絡管理
ftp----文件傳輸協議,用於遠程文件傳輸
dhcp----動態主機配置協議,自動分配IP
tftp----簡單文件傳輸協議,短小文件遠程傳輸
傳輸層:tcp----傳輸控制協議,在傳輸層保證數據可靠傳輸的一種協議
udp----用戶數據包協議,在傳輸層是數據具有較高傳輸效率的協議
spx----序列分組交換協議,在Novell網絡傳輸層中的一種協議
網絡層:IP----網際協議,實現異網互聯通信機制和邏輯編址的協議
ipx 在Novell網絡中網絡層的一種協議 apple talk蘋果公司計算機專業的網絡層通信協議
數據鏈路層: 802.3、802.4、802.5、802.11、FDDI、ATM
物理層 :v.24 v.35 RS232 RS485
那麼這幾個層次之間都是做什麼的?有這麼一個例子
把整個過程比喻成郵局寄信,應用層就是寫信,然後放入信箱。傳輸層就是你把信件投到郵局。網絡層就是郵 局把你的信件投放到對方所屬的中心郵局,鏈路層就是對方中心郵局把信件發送到小郵政點,物理層就是就是把
信件送到對方手上。
無狀態 : 協議的狀態是指下一次傳輸可以記住這次傳輸信息的能力,http是不會爲下一次鏈接而維護這一次鏈接的信息的。
無狀態就是指 當瀏覽器發送請求給服務器的時候,服務器響應,但是同一個瀏覽器再次發生請求時,服務器還會響 應,但是他不知道你就是剛纔的瀏覽器,簡單的說,就是服務器不會去記得你,所以是無狀態協議。在客戶端與服務 端進行動態交互的web程序出現之後,http無狀態的特性嚴重阻礙了這些應用程序的實現,畢竟交互需要呈上起下,
比如購物車程序需要知道用戶買了什麼,於是兩種用於保持HTTP連接狀態的技術應運而生,一個是cookie,一個 是session,session和cookie是有區別的,一個是客戶端保持連接狀態,一個是服務端保存連接狀態。
短連接: 短連接就是指SOCKET連接,發送,接收數據後馬上斷開連接。
長連接就是指建立SOCKET連接之後,不管是否使用都保持連接,但是安全性比較差
HTTP也是可以支持長連接的,使用Connection:keep-alive,HTTP1.1默認進行持久連接,但還是無狀態的,也就 是不可信任的。