3)問:HTTP 緩存
HTTP 緩存又分爲強緩存和協商緩存:前端
- 首先經過 Cache-Control 驗證強緩存是否可用,若是強緩存可用,那麼直接讀取緩存
- 若是不能夠,那麼進入協商緩存階段,發起 HTTP 請求,服務器經過請求頭中是否帶上 If-Modified-Since 和 If-None-Match 這些條件請求字段檢查資源是否更新:
- 若資源更新,那麼返回資源和 200 狀態碼
- 若是資源未更新,那麼告訴瀏覽器直接使用緩存獲取資源
(5)問:HTTP 經常使用的狀態碼及使用場景?
- 1xx:表示目前是協議的中間狀態,還須要後續請求
- 2xx:表示請求成功
- 3xx:表示重定向狀態,須要從新請求
- 4xx:表示請求報文錯誤
- 5xx:服務器端錯誤
經常使用狀態碼:git
- 101 切換請求協議,從 HTTP 切換到 WebSocket
- 200 請求成功,有響應體
- 301 永久重定向:會緩存
- 302 臨時重定向:不會緩存
- 304 協商緩存命中
- 403 服務器禁止訪問
- 404 資源未找到
- 400 請求錯誤
- 500 服務器端錯誤
- 503 服務器繁忙
你知道 302 狀態碼是什麼嘛?你平時瀏覽網頁的過程當中遇到過哪些 302 的場景?
而 302 表示臨時重定向,這個資源只是暫時不能被訪問了,可是以後過一段時間仍是能夠繼續訪問,通常是訪問某個網站的資源須要權限時,會須要用戶去登陸,跳轉到登陸頁面以後登陸以後,還能夠繼續訪問。github
301 相似,都會跳轉到一個新的網站,可是 301 表明訪問的地址的資源被永久移除了,之後都不該該訪問這個地址,搜索引擎抓取的時候也會用新的地址替換這個老的。能夠在返回的響應的 location 首部去獲取到返回的地址。301 的場景以下:web
(2)問:HTTP 經常使用的請求方式,區別和用途?
http/1.1 規定以下請求方法:ajax
- GET:通用獲取數據
- HEAD:獲取資源的元信息
- POST:提交數據
- PUT:修改數據
- DELETE:刪除數據
- CONNECT:創建鏈接隧道,用於代理服務器
- OPTIONS:列出可對資源實行的請求方法,經常使用於跨域
- TRACE:追蹤請求-響應的傳輸路徑
()問:你對計算機網絡的認識怎麼樣
應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層算法
(3)問:HTTPS 是什麼?具體流程
HTTPS 是在 HTTP 和 TCP 之間創建了一個安全層,HTTP 與 TCP 通訊的時候,必須先進過一個安全層,對數據包進行加密,而後將加密後的數據包傳送給 TCP,相應的 TCP 必須將數據包解密,才能傳給上面的 HTTP。json
瀏覽器傳輸一個 client_random 和加密方法列表,服務器收到後,傳給瀏覽器一個 server_random、加密方法列表和數字證書(包含了公鑰),而後瀏覽器對數字證書進行合法驗證,若是驗證經過,則生成一個 pre_random,而後用公鑰加密傳給服務器,服務器用 client_random、server_random 和 pre_random ,使用公鑰加密生成 secret,而後以後的傳輸使用這個 secret 做爲祕鑰來進行數據的加解密。後端
(4)問:三次握手和四次揮手
爲何要進行三次握手:爲了確認對方的發送和接收能力。跨域
三次握手
三次握手主要流程:瀏覽器
- 一開始雙方處於 CLOSED 狀態,而後服務端開始監聽某個端口進入 LISTEN 狀態
- 而後客戶端主動發起鏈接,發送 SYN,而後本身變爲 SYN-SENT,seq = x
- 服務端收到以後,返回 SYN seq = y 和 ACK ack = x + 1(對於客戶端發來的 SYN),本身變成 SYN-REVD
- 以後客戶端再次發送 ACK seq = x + 1, ack = y + 1給服務端,本身變成 EASTABLISHED 狀態,服務端收到 ACK,也進入 ESTABLISHED
SYN 須要對端確認,因此 ACK 的序列化要加一,凡是須要對端確認的,一點要消耗 TCP 報文的序列化
爲何不是兩次?
沒法確認客戶端的接收能力。
若是首先客戶端發送了 SYN 報文,可是滯留在網絡中,TCP 覺得丟包了,而後重傳,兩次握手創建了鏈接。
等到客戶端關閉鏈接了。可是以後這個包若是到達了服務端,那麼服務端接收到了,而後發送相應的數據表,就創建了連接,可是此時客戶端已經關閉鏈接了,因此帶來了連接資源的浪費。
爲何不是四次?
四次以上均可以,只不過 三次就夠了
四次揮手
- 一開始都處於 ESTABLISH 狀態,而後客戶端發送 FIN 報文,帶上 seq = p,狀態變爲 FIN-WAIT-1
- 服務端收到以後,發送 ACK 確認,ack = p + 1,而後進入 CLOSE-WAIT 狀態
- 客戶端收到以後進入 FIN-WAIT-2 狀態
- 過了一會等數據處理完,再次發送 FIN、ACK,seq = q,ack = p + 1,進入 LAST-ACK 階段
- 客戶端收到 FIN 以後,客戶端收到以後進入 TIME_WAIT(等待 2MSL),而後發送 ACK 給服務端 ack = 1 + 1
- 服務端收到以後進入 CLOSED 狀態
客戶端這個時候還須要等待兩次 MSL 以後,若是沒有收到服務端的重發請求,就代表 ACK 成功到達,揮手結束,客戶端變爲 CLOSED 狀態,不然進行 ACK 重發
爲何須要等待 2MSL(Maximum Segement Lifetime):
由於若是不等待的話,若是服務端還有不少數據包要給客戶端發,且此時客戶端端口被新應用佔據,那麼就會接收到無用的數據包,形成數據包混亂,因此說最保險的方法就是等服務器發來的數據包都死翹翹了再啓動新應用。
- 1個 MSL 保證四次揮手中主動關閉方最後的 ACK 報文能最終到達對端
- 1個 MSL 保證對端沒有收到 ACK 那麼進行重傳的 FIN 報文可以到達
爲何是四次而不是三次?
** 若是是三次的話,那麼服務端的 ACK 和 FIN 合成一個揮手,那麼長時間的延遲可能讓 TCP 一位 FIN 沒有達到服務器端,而後讓客戶的不斷的重發 FIN
參考資料
問:在交互過程當中若是數據傳送完了,還不想斷開鏈接怎麼辦,怎麼維持?
在 HTTP 中響應體的 Connection 字段指定爲 keep-alive
你對 TCP 滑動窗口有了解嘛?
在 TCP 連接中,對於發送端和接收端而言,TCP 須要把發送的數據放到發送緩存區, 將接收的數據放到接收緩存區。而常常會存在發送端發送過多,而接收端沒法消化的狀況,因此就須要流量控制,就是在經過接收緩存區的大小,控制發送端的發送。若是對方的接收緩存區滿了,就不能再繼續發送了。而這種流量控制的過程就須要在發送端維護一個發送窗口,在接收端維持一個接收窗口。
TCP 滑動窗口分爲兩種: 發送窗口和接收窗口。
參考資料
問:WebSocket與Ajax的區別
本質不一樣
Ajax 即異步 JavaScript 和 XML,是一種建立交互式網頁的應用的網頁開發技術
websocket 是 HTML5 的一種新協議,實現了瀏覽器和服務器的實時通訊
生命週期不一樣:
- websocket 是長鏈接,會話一直保持
- ajax 發送接收以後就會斷開
適用範圍:
- websocket 用於先後端實時交互數據
- ajax 非實時
發起人:
- AJAX 客戶端發起
- WebSocket 服務器端和客戶端相互推送
瞭解 WebSocket 嘛?
長輪詢和短輪詢,WebSocket 是長輪詢。
具體好比在一個電商場景,商品的庫存可能會變化,因此須要及時反映給用戶,因此客戶端會不停的發請求,而後服務器端會不停的去查變化,無論變不變,都返回,這個是短輪詢。
而長輪詢則表現爲若是沒有變,就不返回,而是等待變或者超時(通常是十幾秒)才返回,若是沒有返回,客戶端也不須要一直髮請求,因此減小了雙方的壓力。
參考連接
HTTP 如何實現長鏈接?在何時會超時?
經過在頭部(請求和響應頭)設置 Connection: keep-alive,HTTP1.0協議支持,可是默認關閉,從HTTP1.1協議之後,鏈接默認都是長鏈接
- HTTP 通常會有 httpd 守護進程,裏面能夠設置 keep-alive timeout,當 tcp 連接閒置超過這個時間就會關閉,也能夠在 HTTP 的 header 裏面設置超時時間
- TCP 的 keep-alive 包含三個參數,支持在系統內核的 net.ipv4 裏面設置:當 TCP 連接以後,閒置了 tcp_keepalive_time,則會發生偵測包,若是沒有收到對方的 ACK,那麼會每隔 tcp_keepalive_intvl 再發一次,直到發送了 tcp_keepalive_probes,就會丟棄該連接。
- tcp_keepalive_intvl = 15
- tcp_keepalive_probes = 5
- tcp_keepalive_time = 1800
實際上 HTTP 沒有長短連接,只有 TCP 有,TCP 長鏈接能夠複用一個 TCP 連接來發起屢次 HTTP 請求,這樣能夠減小資源消耗,好比一次請求 HTML,可能還須要請求後續的 JS/CSS/圖片等
參考連接
問:Fetch API與傳統Request的區別
- fetch 符合關注點分離,使用 Promise,API 更加豐富,支持 Async/Await
- 語意簡單,更加語意化
- 可使用 isomorphic-fetch ,同構方便
參考資源
(2)問:POST通常能夠發送什麼類型的文件,數據處理的問題
- 文本、圖片、視頻、音頻等均可以
- text/image/audio/ 或 application/json 等
問:TCP 如何保證有效傳輸及擁塞控制原理。
可靠體如今:有狀態、可控制
- 有狀態是指 TCP 會確認發送了哪些報文,接收方受到了哪些報文,哪些沒有收到,保證數據包按序到達,不容許有差錯
- 可控制的是指,若是出現丟包或者網絡情況不佳,則會跳轉本身的行爲,減小發送的速度或者重發
因此上面能保證數據包的有效傳輸。
擁塞控制原理
緣由是有可能整個網絡環境特別差,容易丟包,那麼發送端就應該注意了。
主要用三種方法:
慢啓動閾值 + 擁塞避免
對於擁塞控制來講,TCP 主要維護兩個核心狀態:
- 擁塞窗口(cwnd)
- 慢啓動閾值(ssthresh)
在發送端使用擁塞窗口來控制發送窗口的大小。
而後採用一種比較保守的慢啓動算法來慢慢適應這個網絡,在開始傳輸的一段時間,發送端和接收端會首先經過三次握手創建鏈接,肯定各自接收窗口大小,而後初始化雙方的擁塞窗口,接着每通過一輪 RTT(收發時延),擁塞窗口大小翻倍,直到達到慢啓動閾值。
而後開始進行擁塞避免,擁塞避免具體的作法就是以前每一輪 RTT,擁塞窗口翻倍,如今每一輪就加一個。
快速重傳
在 TCP 傳輸過程當中,若是發生了丟包,接收端就會發送以前重複 ACK,好比 第 5 個包丟了,六、7 達到,而後接收端會爲 5,6,7 都發送第四個包的 ACK,這個時候發送端受到了 3 個重複的 ACK,意識到丟包了,就會立刻進行重傳,而不用等到 RTO (超時重傳的時間)
選擇性重傳:報文首部可選性中加入 SACK 屬性,經過 left edge 和 right edge 標誌那些包到了,而後重傳沒到的包
快速恢復
若是發送端收到了 3 個重複的 ACK,發現了丟包,以爲如今的網絡情況已經進入擁塞狀態了,那麼就會進入快速恢復階段:
- 會將擁塞閾值下降爲 擁塞窗口的一半
- 而後擁塞窗口大小變爲擁塞閾值
- 接着 擁塞窗口再進行線性增長,以適應網絡情況
問:OPTION是幹啥的?舉個用到OPTION的例子?
旨在發送一種探測請求,以肯定針對某個目標地址的請求必須具備怎麼樣的約束,而後根據約束髮送真正的請求。
好比針對跨域資源的預檢,就是採用 HTTP 的 OPTIONS 方法先發送的。用來處理跨域請求
問:http知道嘛?哪一層的協議?(應用層)
- 靈活可擴展,除了規定空格分隔單詞,換行分隔字段之外,其餘都沒有限制,不只僅能夠傳輸文本,還能夠傳輸圖片、視頻等任意資源
- 可靠傳輸,基於 TCP/IP 因此繼承了這一特性
- 請求-應答,有來有回
- 無狀態,每次 HTTP 請求都是獨立的,無關的、默認不須要保存上下文信息
缺點:
- 明文傳輸不安全
- 複用一個 TCP 連接,會發生對頭擁塞
- 無狀態在長鏈接場景中,須要保存大量上下文,以免傳輸大量重複的信息
問:OSI七層模型和TCP/IP四層模型
- 應用層
- 表示層
- 會話層
- 傳輸層
- 網絡層
- 數據鏈路層
- 物理層
TCP/IP 四層概念:
- 應用層:應用層、表示層、會話層:HTTP
- 傳輸層:傳輸層:TCP/UDP
- 網絡層:網絡層:IP
- 數據鏈路層:數據鏈路層、物理層
(3)問:TCP 協議怎麼保證可靠的,UDP 爲何不可靠?
- TCP 是面向鏈接的、可靠的、傳輸層通訊協議
- UDP 是無鏈接的傳輸層通訊協議,繼承 IP 特性,基於數據報
爲何 TCP 可靠?TCP 的可靠性體如今有狀態和控制
- 會精準記錄那些數據發送了,那些數據被對方接收了,那些沒有被接收,並且保證數據包按序到達,不容許半點差錯,這就是有狀態
- 當意識到丟包了或者網絡環境不佳,TCP 會根據具體狀況調整本身的行爲,控制本身的發送速度或者重發,這是可控制的
反之 UDP 就是無狀態的和不可控制的
HTTP 2 改進
改進性能: