前端在面試過程當中,也會遇到網絡層面的一些問題,這些有的可能會在平時業務中用到,有的可能就是單純造火箭。下面我彙總了一些我在面試中遇到的,以及我複習的一些面試相關的東西。html
http緩存基本面試中都會考到,主要記憶點爲強緩存、協商緩存。前端
加分點:web
強緩存:from memory cache,from disk cache什麼區別?Expires和Cache-Control的區別面試
協商緩存:兩個標誌位的區別。chrome
http緩存分爲強緩存和協商緩存。強緩存就是瀏覽器緩存,資源直接從瀏覽器中獲取。協商緩存就是資源會從cdn去獲取。瀏覽器
強緩存的判斷標誌有兩個,Expires這個標識實在http1.0以前用的,表示的是過時時間,可是客戶端和服務端時間存在不一樣步問題,因此在http1.1以後加入了Cache-Control,這個表示的是距離請求發出時的時間,是一個相對時間比較精確。緩存
強緩存即爲瀏覽器緩存,分爲兩類from memory cache,from disk cache,返回的狀態碼都爲200.二者的區別是from memory cache是從內存中取。from disk cache是從硬盤中取。若是是刷新當前頁面,且內存環境比較充裕的狀況下,返回from memory cache。可是若是是返回上一個頁面或者當前內存環境不充裕的狀況下,返回的是from disk cache。安全
協商緩存的判斷標識:Last-Modified和ETag。ETag是文件每次生成的hash,是惟一的準確性高,可是比較繁瑣以及消耗性能。而Last-Modified是以秒級爲單位的文件生成時間,比較不精確。由於1s中文件可能屢次生成。判斷的優先標準是ETag。其次是Last-Modified。服務器
http緩存的判斷過程:先判斷Cache-Control的值,這裏不細講,好比max-age=300,那麼在五分鐘以內都會觸發強緩存。若是已通過了5分鐘以後,會進入協商緩存階段。發出去的http請求中會帶有兩個標示位, If-Modified-Since(來自第一次請求返回頭中的Last-Modified)和If-None-Match(來自第一次請求返回頭中的ETag)。兩個標示位的區別我在上面已經說了,根據標示位判斷文件是否更新,若是更新返回狀態碼200以及資源。若是沒有更新,只返回狀態碼304網絡
TCP握手過程:客戶端發送ACK包給服務端。當服務端接收到ACK包以後,向客戶端發送ACK+SYN包。客戶端接收到ACK+SYN包以後,向服務端返回SYN包。
三次握手是識別客戶端發送和接收能力的最小安全次數。
四次揮手過程:
一、客戶端像服務端發送fin包,以後客戶端不能發送數據,只能讀取數據。
二、服務端收到fin包以後,像客戶端發送ACK包,此時服務端只能發送數據,不能接收數據。
三、當數據發送完畢以後,服務端會發送fin包給客戶端。此時服務端不能讀取數據也不能接收數據
四、當客戶端收到fin包時,將發送ack包給服務端,本身等待足夠多的時間,便進入closed狀態。服務端接收到ack包的時候,也會進入到closed狀態。
爲何揮手過程要4次?
由於TCP是雙工通道,服務端和客戶端都可以發送和接收數據。兩邊是同時運轉的。
https的握手過程分爲兩步:證書校驗和數據傳輸
一、客戶端訪問web服務器,服務器返回數字簽名(公鑰,證書信息,服務端信息,hash值)。
二、客戶端經過證書機構頒發的私鑰對數字簽名進行解密。校驗證書信息和服務端信息以後,生成隨機數,用公鑰進行加密。
三、數據返回給服務端以後,服務端使用相應的私鑰進行解密,獲得隨機數。
四、以後服務端與客戶端就經過隨機數的對稱加密方式進行交互。
拿到服務端給的數字簽名以後,客戶端會根據機構頒發的私鑰對數字簽名的東西進行解密。解密出來,內部會含有服務端信息和證書的信息。
證書信息須要校驗如下幾方面:
一、頒發證書的第三方機構(CA)是否受客戶端的信任。
二、對比系統時間校驗證書是否在有效期。
三、經過CRL或者OCSP的方式校驗證書是否被吊銷。
四、經過校驗對方是否存在證書的私鑰,判斷證書的網站域名是否與證書頒發的域名一致。
對稱加密的加解密鑰匙是同一個,密鑰在傳輸過程當中容易被第三方截取,安全性相對較低。
非對稱加密一共有一對鑰匙,分爲公鑰和私鑰。公鑰進行加密過程,私鑰用於解密過程。性能上相對於對稱加密來的低。
非對稱加密和對稱加密在https中的應用:因爲性能緣由,https只有在第一次創建的時候會使用非對稱加密,以後的過程都是走隨機數的對稱加密方式。
中間人攻擊就是在沒有ca證書以前,公鑰在傳輸過程當中也能夠被截獲。
中間人截獲公鑰以後,將公鑰替換成本身的公鑰。
而後客戶端收到僞造公鑰以後,用其進行加密操做以後,返回給服務端。
在返回過程當中,中間者再次將數據截獲,用私鑰進行解密。
解密完成以後,將數據在用真公鑰進行加密,返回給服務端。
全部數據至關於在明文傳輸。
主要區別在如下4個點:
一、二進制傳輸:http2.0的數據是以二進制的形式傳輸的,最小單位是幀,多個幀組成數據流的形式傳輸。而http1.1如下是以明文文本格式傳輸的。明顯二進制傳輸方式更加高效
二、頭部壓縮:http1.1的時候在每次請求都會攜帶大量重複頭部信息。可是在http2.0的時候,只須要發送改變的頭部信息就行。
三、服務器推送:服務端能夠在發送html的時候主動推送其餘資源,不須要等瀏覽器在請求到相應位置的時候再去請求。
四、多路複用,詳細能夠看下面一個問題
http/1每次請求都會創建一次tcp連接,也就是咱們說的三次握手四次揮手。這個過程是很是耗時的,儘管能夠開啓keep-alive去避免屢次鏈接的問題。可是仍是存在一下兩個問題:
一、串行的文件傳輸方式。文件傳輸的過程是,當a文件傳輸時,b文件只能等待。而a文件在傳輸過程當中,須要經歷鏈接服務,服務器處理文件,以及斷開服務等三個過程。假設每一個過程耗時1s,那麼a文件耗時就是3s,那麼b文件傳輸完成就是6s
二、鏈接數過多。當客戶端發起多個請求時,瀏覽器會對請求的併發數作一個限制,chrome的最大併發數是6個,那麼第7個請求的時候就須要等前面的請求完成以後,才能拿到相應的結果。
而http2以後,改爲了二進制傳輸,也就多了幀和流的概念。
數據在一個tcp鏈接中按流的形式傳輸,幀就是其中最小的傳輸單位,而幀中帶有標示位,能夠識別是從哪一個流中來的,到服務端以後,服務端會將幀數據從新整合成流,也就是所說的多路複用。
http報文分爲請求報文和相應報文。他們分別分爲4個部分:
一、請求行/響應行:請求行由方法,URL,http版本組成。好比:GET /index.html HTTP/1.1。響應行由http版本和狀態碼組成,好比:HTTP/1.1 200ok
二、請求頭部/響應頭部:頭部由一些key:value的字段組成
三、空行:做用主要是用來分割頭部和實體。
四、請求體/響應體:請求體主要攜帶post時候的一些參數。響應體主要攜帶服務端返回的一些數據。
這裏就介紹一些經常使用的狀態碼
1XX:臨時響應
2XX:成功
3XX:重定向
4XX:客戶端錯誤
5XX:服務端錯誤
請求字段:
響應字段: