Web請求過程

動物園裡的一隻程式猿發表於2018-05-26

B/S架構

最常見的架構方式。

優點:

1.客戶端使用統一(此處的統一主要指實現原理統一)的瀏覽器,不需要特殊的網路配置。

2.服務端基於統一的HTTP協議。基於此協議的伺服器有很多,如Tomcat,Nginx,JBoss。這些伺服器可以直接拿來用。

請求發生的完整過程

HTTP最大的特點就是無狀態的短連線的通訊方式,通常情況下一次請求就完成了一次資料互動,通常也對應一次業務邏輯。然後這次通訊就斷開了。

採用這種方式是為了能夠同時服務更多的使用者,防止由於一個使用者獨佔連線而造成阻塞的現象。

下面主要介紹使用者在瀏覽器輸入網址之後發生的整個完整過程。

1.使用者輸入URL,也就是網址。如www.google.com。

2.DNS域名伺服器會將其轉換成IP地址。

3.使用者端根據IP地址向伺服器發起請求。

4.伺服器端可能會有負載均衡裝置來平均分配所有的使用者請求。在請求到達伺服器後,會經過一些複雜的業務邏輯來處理使用者請求。請求的資料可能在三個地方:
分散式快取系統,檔案系統或者資料庫中。從其中取出資料返回給瀏覽器。

5.資料返回後,瀏覽器解析資料發現還有一些靜態的資源(CSS,JS或者圖片),然後再次發起請求。這些靜態資源很有可能是在CDN上,如果在的話CDN伺服器會再次處理使用者的請求。

6.最終在瀏覽器端看到完整的網頁。

以上就是大致的請求資料的過程。

不管架構如何變化,有三個原則是始終不變的:

1)網際網路上的所有資源都要用一個URL表示。

2)必須基於HTTP與服務端互動。

3)資料展示必須在瀏覽器中進行。

如何發起請求

發起請求實質上就是建立一個Socket連線,但是這是一個特殊的Socket連線。

瀏覽器在建立Socket之前,必須根據位址列裡輸入的URL的域名DNS解析出IP地址,在根據這個IP地址和預設的80埠與遠端伺服器建立Socket連結,然後瀏覽器根據這個URL組裝成一個get型別的HTTP請求頭,通過outPutStream.write 傳送到目標伺服器,伺服器等待inputString.read返回資料,最後斷開這個連線

埠號:80

所以完全可以自己模擬瀏覽器發起一個HTTP請求。專門有個處理HTTP請求的開源工具包,叫HttpClient。

在linux中通過curl+URL可以簡單地發起一個HTTP請求。如:curl "www.google.com"

請求的解析

HTTP請求的最重要的部分就是HTTP的頭部。

HTTP請求頭:

Accept-Charset    用於指定客戶端接受的字符集
Accept-Encoding   可接受的內容編碼
Accept-Language   自然語言 比如zh-cn
Host              指定被請求資源的Internet主機和埠號
User-Agent        客戶端將它的作業系統、瀏覽器和其他屬性告訴伺服器
Connection        當前連線是否保持。

 

HTTP響應頭:

Server            使用的伺服器名稱
Content-type      指明傳送給接受者的實體正文的媒體型別,如Content_Type:text/html;charset = GBK
Content-Encoding: 告訴瀏覽器服務端採用的壓縮編碼
Content-Language: 描述了資源所用的自然語言
Content-Length  : 指明實體正文的長度
Keep-Alive      : 保持連線的時間

 

常見的狀態嗎:

200 客戶端請求成功
302 臨時跳轉,跳轉的地址通過Location
400 客戶端請求語法有錯誤,不能被伺服器識別
404 請求資源不存在 403 伺服器收到請求,但是拒絕提供服務 500 服務端發生不可預期的錯誤

 

瀏覽器的快取設定

在瀏覽器端Ctrl+F5可以重新發起請求而不使用快取資料。發出報文的請求頭裡面相關欄位告訴伺服器,不要快取要最新的資料。

這兩個欄位是:Pragma:no-cache Cache-Control:no-cache

public:所有內容都將被快取,在響應頭中設定
private:內容只快取到私有快取中,在響應頭中設定
no-cache:所有內容都不會被快取,在請求頭和響應頭中設定
no-store:所有內容都不會被快取到快取或Internet臨時檔案中,在響應頭中設定
must-revalidation/proxy-revalidation:如果快取的內容失效,請求必須傳送到伺服器/代理以重新驗證,在請求頭中設定
max-age=xxx:快取的內容將在XXX秒後失效,只在HTTP1.1可用,在請求頭中設定

Cache-Control和Expires同時出現時,Cache-Control會覆蓋其他欄位

Expires:一般後面跟一個日期時間,超過這個時間設定之後,快取內容將失效,也就是瀏覽器在發出請求之前檢查這個頁面的這個欄位,看頁面是否過期了,過期了就重新向瀏覽器發起服務

Last-Modified:一般表示伺服器上資源最後修改時間,根據這個修改時間可以判斷當前請求的資源是否是最新的,如果是最新的,伺服器就返回304狀態碼告知瀏覽器

Etag:伺服器給每個頁面分配一個唯一的編號,然後區分編號判斷頁面內容是否是最新的

DNS域名解析過程

1.使用者輸入URL,瀏覽器檢查自身有沒有快取該域名的IP地址。

2.如果沒有,瀏覽器檢查作業系統快取中是否有這個DNS解析結果。

3.如果快取中還沒有,則作業系統會把這個域名傳送給LDNS(Local DNS)即本地域名伺服器。

4.如果LDNS中還沒有,則只能去Root Server域名伺服器中請求解析了。這樣的情況比較罕見,因為全球只有13臺左右這樣的伺服器。

5.根域名伺服器會返回一個本地域名伺服器所查域的主域名伺服器(gTLD Server)地址。gTLD是國際頂級域名伺服器地址,如.com、.cn、.org,全球只有13臺

6.LDNS向gTLD傳送請求。

7.gTLD接受此請求,返回一個此域名對應的Name Server域名伺服器的地址。這個Name Server通常就是你註冊的域名伺服器。

8.Name Server返回該域名對應的IP和TTL值,然後Local DNS Server會快取這個對應關係,快取時間由TTL控制。

9.解析結果返回使用者。使用者根據TTL值快取在本地系統快取此對應關係。

TTL是域名解析的生命週期,TTL值全稱是“生存時間(Time To Live)”,簡單的說它表示DNS記錄在DNSf伺服器上的快取時間。

清除快取域名

Local DNS的快取由TTL來控制,很難人工介入。但是本地機器的快取可以用以下命令來清除:

Windows: ipconfig /flushdns
Linux:   /etc/init.d/nscd restart

幾種域名的解析方式

域名解析記錄主要分為:A 記錄、MX記錄、CNAME 記錄、NS記錄和 TXT記錄

A記錄:A 代表的是Address,用來指定域名對應的IP地址。域名可以多對一但是不能一對多。

MX記錄:Mail Exchange,就是講某個域名下的郵件伺服器指向自己的Mail Server。

CNAME記錄:別名解析。將一個域名設定一個或者多個別名。

NS記錄:為某個域名指定DNS解析伺服器。

TXT記錄:為某個主機名或者域名設定文字說明。

CDN

工作機制

CDN即內容分發網路。通過現有的Internet中增加一層新的網路架構,將網站的內容釋出到最接近使用者的網路邊緣,使使用者可以就近取得所需要的內容,提高使用者網站的響應速度。

負載均衡

對工作任務進行平衡、分攤到多個操作單元上去,共同完成任務。

三種架構:

1.鏈路負載均衡

由DNS解析來完成負載均衡,使用者直接訪問目標伺服器,而不需要經過其他的代理伺服器,通常訪問速度會更快。

缺點:一旦某臺伺服器掛掉,由於使用者本地和Local DNS都有DNS快取,快取沒有及時更新,則造成使用者無法訪問這個域名。

2.叢集負載均衡

硬體負載均衡:由一臺專門的硬體裝置負責轉發請求,太貴一般公司用不起,但是效能很好(一分錢一分貨啊)

軟體負載均衡:由多臺代理伺服器組成。網路延時較長。

3.作業系統負載均衡

利用作業系統級別的軟中斷或者硬體中斷來完成。

動態加速

在CDN的DNS解析過程中,通過動態鏈路探測來尋找回源最好的一條路徑,然後通過DNS排程將所有請求排程到選定這條路徑上回源,從而加速使用者訪問的效率。

回源:有使用者訪問某一個URL的時候,如果被解析到的那個CDN節點沒有快取響應的內容,或者是快取已經到期,就會回源站去獲取。如果沒有人訪問,那麼CDN節點不會主動去源站拿的。

相關文章