1. 程式人生 > 其它 >面試題-http

面試題-http

強快取與協商快取

強快取

當瀏覽器去請求某個檔案的時候,服務端就在respone header裡面對該檔案做了快取配置

快取的時間、快取型別都由服務端控制,具體表現為:respone header 的cache-control 

http.0  Expries

http1.1  Cache-Control 優先順序較高

  • cache-control: max-age=xxxx,public
    客戶端和代理伺服器都可以快取該資源;
    客戶端在xxx秒的有效期內,如果有請求該資源的需求的話就直接讀取快取,statu code:200 ,如果使用者做了重新整理操作,就向伺服器發起http請求
  • cache-control: max-age=xxxx,private
    只讓客戶端可以快取該資源;代理伺服器不快取
    客戶端在xxx秒內直接讀取快取,statu code:200
  • cache-control: max-age=xxxx,immutable
    客戶端在xxx秒的有效期內,如果有請求該資源的需求的話就直接讀取快取,statu code:200 ,即使使用者做了重新整理操作,也不向伺服器發起http請求
  • cache-control: no-cache
    跳過設定強快取,但是不妨礙設定協商快取;一般如果你做了強快取,只有在強快取失效了才走協商快取的,設定了no-cache就不會走強快取了,每次請求都回詢問服務端。
  • cache-control: no-store
    不快取,這個會讓客戶端、伺服器都不快取,也就沒有所謂的強快取、協商快取了

from memory cache 記憶體中的快取

from disk cache 磁碟中的快取

給資源設定個過期時間,客戶端每次請求資源時都會看是否過期;只有在過期才會去詢問伺服器。

強快取就是為了給客戶端自給自足用的

客戶端請求該資源時發現其過期了,這是就會去請求伺服器了,這過程就可以設定協商快取。

協商快取就是需要客戶端和伺服器兩端進行互動的

 

協商快取

每次請求返回來 response header 中的 etag和 last-modified,在下次請求時在 request header 就把這兩個帶上,服務端把你帶過來的標識進行對比 然後判斷資源是否更改了,如果更改就直接返回新的資源,和更新對應的response header的標識etag、last-modified 如果資源沒有變,那就不變etag、last-modified,伺服器返回304 這時候對客戶端來說,每次請求都是要進行協商快取了  

response header中的etag、last-modified在客戶端重新向服務端發起請求時,會在request header中換個key名:

// response header
etag: '5c20abbd-e2e8'
last-modified: Mon, 24 Dec 2018 09:49:49 GMT

// request header 變為
if-none-matched: '5c20abbd-e2e8'
if-modified-since: Mon, 24 Dec 2018 09:49:49 GMT

 

 

你可能會覺得使用Last-Modified已經足以讓瀏覽器知道本地的快取副本是否足夠新,為什麼還需要Etag呢?

HTTP1.1中Etag的出現主要是為了解決幾個Last-Modified比較難解決的問題:

  • 一些檔案也許會週期性的更改,但是他的內容並不改變(僅僅改變的修改時間),這個時候我們並不希望客戶端認為這個檔案被修改了,而重新GET;

  • 某些檔案修改非常頻繁,比如在秒以下的時間內進行修改,(比方說1s內修改了N次),If-Modified-Since能檢查到的粒度是s級的,這種修改無法判斷(或者說UNIX記錄MTIME只能精確到秒);

  • 某些伺服器不能精確的得到檔案的最後修改時間。

這時,利用Etag能夠更加準確的控制快取,因為Etag是伺服器自動生成或者由開發者生成的對應資源在伺服器端的唯一識別符號。

Last-Modified與ETag是可以一起使用的,伺服器會優先驗證ETag,一致的情況下,才會繼續比對Last-Modified,最後才決定是否返回304

 

get請求傳參長度的誤區

誤區:我們經常說get請求引數的大小存在限制,而post請求的引數大小是無限制的?

實際上HTTP 協議從未規定 GET/POST 的請求長度限制是多少。

對get請求引數的限制是:瀏覽器或web伺服器限制了url的長度。

不同的瀏覽器和WEB伺服器,限制的最大長度不一樣要支援IE,則最大長度為2083byte,若只支援Chrome,則最大長度 8182byte

get和post請求在快取方面的區別

get請求類似於查詢的過程,使用者獲取資料,可以不用每次都與資料庫連線,所以可以使用快取。因此get請求適合於請求快取。

post不同,post做的一般是修改和刪除的工作,所以必須與資料庫互動,所以不能使用快取。

get、post的區別

1.get傳參方式是通過位址列URL傳遞,是可以直接看到get傳遞的引數,post傳參方式引數URL不可見,get把請求的資料在URL後通過?連線,通過&進行引數分割。psot將引數存放在HTTP的包體內

2.get傳遞資料是通過URL進行傳遞,對傳遞的資料長度是受到瀏覽器URL大小的限制,URL最大長度是2048個字元。post沒有長度限制

3.get後退不會有影響,post後退會重新進行提交

4.get請求可以被快取,post不可以被快取

5.get請求只URL編碼,post支援多種編碼方式

6.get請求的記錄會留在歷史記錄中,post請求不會留在歷史記錄

7.get只支援ASCII字元,post沒有字元型別限制

 

http和https

HTTP的發展

HTTP:超文字傳輸協議,用於在Web瀏覽器和網站伺服器之間傳遞資訊,以明文方式傳送內容,是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP)

HTTPS:是以安全為目標的,由http和ssl協議構建的可進行加密傳輸和身份認證的網路協議

SSL 是基礎, 在 SSL 上執行 WebSocket 協議就是 WSS; 在 SSL 上執行 HTTP 協議就是 HTTPS.

http傳輸的資料都是未加密的,也就是明文的,網景公司設定了SSL協議來對http協議傳輸的資料進行加密處理

主要的區別如下:

Https協議需要ca證書,費用較高。

http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

使用不同的連結方式,埠也不同,一般而言,http協議的埠為80,https的埠為443

http的連線很簡單,是無狀態的;

HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

HTTPS的優點

  儘管HTTPS並非絕對安全,掌握根證書的機構、掌握加密演算法的組織同樣可以進行中間人形式的攻擊,但HTTPS仍是現行架構下最安全的解決方案,主要有以下幾個好處:

  (1)使用HTTPS協議可認證使用者和伺服器,確保資料傳送到正確的客戶機和伺服器;

  (2)HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全,可防止資料在傳輸過程中不被竊取、改變,確保資料的完整性。

  (3)HTTPS是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻擊的成本

  (4)谷歌曾在2014年8月份調整搜尋引擎演算法,並稱“比起同等HTTP網站,採用HTTPS加密的網站在搜尋結果中的排名更高”。

HTTPS的缺點

  雖然說HTTPS有很大的優勢,但其相對來說,還是存在不足之處的:

  (1)HTTPS協議握手階段比較費時,會使頁面的載入時間延長近50%,增加10%到20%的耗電;

  (2)HTTPS連線快取不如HTTP高效,會增加資料開銷和功耗,甚至已有的安全措施也會因此而受到影響;

  (3)SSL證書需要錢,功能越強大的證書費用越高,個人網站、小網站沒有必要一般不會用。

    (4)SSL證書通常需要繫結IP,不能在同一IP上繫結多個域名,IPv4資源不可能支撐這個消耗。

  (5)HTTPS協議的加密範圍也比較有限,在黑客攻擊、拒絕服務攻擊、伺服器劫持等方面幾乎起不到什麼作用。最關鍵的,SSL證書的信用鏈體系並不安全,特別是在某些國家可以控制CA根證書的情況下,中間人攻擊一樣可行。

 

HTTPS的工作原理

客戶端在使用HTTPS方式與Web伺服器通訊時有以下幾個步驟

  (1)客戶使用https的URL訪問Web伺服器,要求與Web伺服器建立SSL連線。

  (2)Web伺服器收到客戶端請求後,會將網站的證書資訊(證書中包含公鑰)傳送一份給客戶端。

  (3)客戶端的瀏覽器與Web伺服器開始協商SSL連線的安全等級,也就是資訊加密的等級。

  (4)客戶端的瀏覽器根據雙方同意的安全等級,建立會話金鑰,然後利用網站的公鑰將會話金鑰加密,並傳送給網站。

  (5)Web伺服器利用自己的私鑰解密出會話金鑰。

  (6)Web伺服器利用會話金鑰加密與客戶端之間的通訊。

跨域問題-瀏覽器為什麼要阻止跨域請求,如何解決跨域?

1 跨越是產生於瀏覽器的"同源策略",主要解決安全問題。

1)協議:http、https
2)域名:www.baidu.com、www.taobao.com …
3)埠:80,8080…

2 以上三種都相同才能成為同源,有一個不同就是非同源,會造成:

1)無法獲取cookie,localstroage,indexedDB。
2) 無法訪問非同源網頁的 DOM(iframe)。
3) 無法向非同源地址傳送 AJAX 請求或 fetch 請求 (可以傳送,但瀏覽器拒絕接受相應)

3 解決跨域

1)jsonp跨域-瀏覽器對頁面html標籤中的src屬性發起的ajax請求不受同源策略影響

2)postMessage  iframe

3)跨域資源共享CORS-服務端 set("Access-Control-Allow-Origin", "*")

4)nginx反向代理-服務端

5)nodejs中介軟體正向代理 http-proxy-middleware

6)websocket協議跨域

4 注意

跨域並非瀏覽器限制了發起跨站請求,而是跨站請求可以正常發起,但是返回結果被瀏覽器攔截了。
每次需求都會發出,伺服器端也會做出響應,只是瀏覽器端在接受響應的時候會基於同源策略進行攔截。

 

cookie sessionStorage localStorage區別

相同:都儲存在客戶端

不同:

1 儲存大小   

  1)cookie資料大小不能超過4k   

  2)sessionStoragehe localStorage的儲存限制達到5M甚至更多

2 有效時間

  1)cookie   在設定的過期時間之前一直有效,即使視窗或瀏覽器關閉

  2)sessionStorage    資料在當前瀏覽器串列埠關閉後自動刪除

  3)localStorage   儲存持久資料,瀏覽器關閉後資料不丟失,除非主動刪除

3 資料與服務端之間的互動方式

  1)cookie 的資料會自動的傳遞到伺服器,伺服器端也可以寫cookie到客戶端

  2)sessionStoragehe localStorage 不會自動把資料發給伺服器,僅在本地儲存

TCP/IP 的具體含義

一般是指利用 IP 進行通訊時所必須用到的協議群的統稱

 

瀏覽器輸入URL後發生了什麼

1.DNS域名解析;
2.建立TCP連線;
3.傳送HTTP請求;
4.伺服器處理請求;
5.返回響應結果;
6.關閉TCP連線;
7.瀏覽器解析HTML;
8.瀏覽器佈局渲染;

1.DNS域名解析

瀏覽器(客戶端)進行地址解析,補全域名,然後DNS域名解析;

dns解析分為以下幾個步驟:
1、先檢視瀏覽器dns快取中是否有域名對應的ip。
2、如果沒有,則檢視作業系統dns快取中是否有對應的ip(例如windows的hosts檔案)。
3、依舊沒有就對本地區的dns伺服器發起請求,
4、如果還是沒有,就直接到Root Server域名伺服器請求解析。

2.建立TCP連線

在拿到域名對應的IP地址後,會以隨機埠(1024~~65535)向WEB伺服器程式80埠發起TCP的連線請求

通過ip定址和arp,找到目標(伺服器)地址,三次握手建立TCP連線:

客戶端傳送一個帶有SYN標誌的資料包給服務端,服務端收到後,回傳一個帶有SYN/ACK標誌的資料包以示傳達確認資訊,最後客戶端再回傳一個帶ACK標誌的資料包,代表握手結束,連線成功。

通俗化之後就是:

客戶端:老弟我要跟你連結

服務端:好的,同意了

客戶端:好嘞

3.傳送HTTP請求

建立TCP連線之後,發起HTTP請求

一個HTTP請求報文由請求行(request line)、請求頭部(headers)、空行(blank line)和請求資料(request body)4個部分組成。

請求行:GET /index.html HTTP/1.1

 

4.伺服器處理請求

瀏覽器請求報文到達伺服器之後,伺服器介面會對請求報文進行處理,執行介面對應的程式碼,處理完成後響應客戶端

由於http是無狀態的,正常情況下,客戶端收到響應後就會直接斷開連線,然後一次http事物就完成了。

但是http1.0有一個keep-alive的請求欄位,可以在一定時間內不斷開連線(有時時間甚至很長)。http1.1預設開啟了keep-alive選項。

5.返回響應結果

請求頭accept代表傳送端(客戶端)希望接受的資料型別,這是瀏覽器自動封裝的

如果伺服器返回的content-type是accept中的任何一個,瀏覽器都能解析,並直接展示在網頁上。

如果伺服器返回的content-type是其他型別,此時瀏覽器有三種處理狀態:
1、正常顯示。例如返回型別為text/javascript,瀏覽器能直接處理並展示。
2、下載。例如返回型別為application/octet-stream(二進位制流,不知道下載檔案型別),這種瀏覽器不能直接處理的,會被下載。
3、報錯。當我們返回一個字串hello world,卻使用text/xml,格式時,瀏覽器不能正確解析,就會報錯,並把報錯資訊呈現在網頁中。

瀏覽器能直接處理很多種格式,並直接呈現在網頁中,並不限於accept中規定的字

6.關閉TCP連線

關閉TCP連線,需要4次握手

通俗化:

客戶端:老弟,我這邊沒資料要傳了,咱們關閉連結吧

服務端:好的,接收到了,我看看我這邊還有沒有要傳的

服務端:我這邊也沒有了,關閉吧

客戶端:好嘞

7.瀏覽器解析

瀏覽器通過解析HTML,生成DOM樹,解析CSS,生成CSS規則樹,然後通過DOM樹和CSS規則樹生成渲染樹

渲染樹與DOM樹不同,渲染樹中並沒有head、display為none等不必顯示的節點。

8.瀏覽器佈局渲染

layout: 根據Render Tree,瀏覽器已經能知道網頁中有哪些節點、各個節點的CSS定義以及他們的從屬關係,從而去計算出每個節點在螢幕中的位置。

painting: 按照算出來的規則,通過顯示卡,把內容畫到螢幕上。

 reflow(迴流):當頁面上某些元素的佔位面積、定位方式、邊距等屬性的變化,影響了佈局,需要倒回去重新渲染,這個回退的過程叫 reflow。

 repaint(重繪):改變某個元素的背景色、文字顏色、邊框顏色等等不影響它周圍或內部佈局的屬性時,螢幕的一部分要重畫,但是元素的幾何尺寸沒有變。