imagecss
本文快速回顧了常考的的知識點,用做面試複習,事半功倍。html
上篇主要內容: 狀態碼、Http1.0/1.1/2.0、Https、GET和POSTnginx
下篇主要內容: Web***技術、HTTP基礎概念、HTTP Header詳解、HTTP應用git
全複習手冊文章導航github
點擊公衆號下方:技術推文——面試衝刺web
已發佈知識點複習手冊面試
Java基礎知識點面試手冊(上)算法
Java基礎知識點面試手冊(下)chrome
Java容器(List、Set、Map)知識點快速複習手冊(上)數據庫
Java容器(List、Set、Map)知識點快速複習手冊(中)
Java容器(List、Set、Map)知識點快速複習手冊(下)
Redis基礎知識點快速複習手冊(上)
Redis基礎知識點快速複習手冊(下)
Java併發知識點快速複習手冊(上)
Java併發知識點快速複習手冊(下)
Java虛擬機知識點快速複習手冊(上)
Java虛擬機知識點快速複習手冊(下)
阿里巴巴Java開發手冊閱讀筆記
雙非碩士的春招秋招經驗總結——對校招,複習以及面試心態的理解
本文內容主要參考來自CyC2018的Github倉庫:CS-Notes
有刪減,修改,補充額外增長內容
本做品採用知識共享署名-非商業性使用 4.0 國際許可協議進行許可。
有拓展參考:
https://zhuanlan.zhihu.com/p/34648453
100 Continue :代表到目前爲止都很正常,客戶端能夠繼續發送請求或者忽略這個響應。
主要用於websocket:表示服務端接受 WebSocket 協議的客戶端鏈接
也能夠用於http2的升級。
200 OK
204 No Content :請求已經成功處理,可是返回的響應報文不包含實體的主體部分。通常在只須要從客戶端往服務器發送信息,而不須要返回數據時使用。
301 Moved Permanently :永久性重定向
302 Found :臨時性重定向
303 See Other :和 302 有着相同的功能,可是 303 明確要求客戶端應該採用 GET 方法獲取資源。
注:雖然 HTTP 協議規定 30一、302 狀態下重定向時不容許把 POST 方法改爲 GET 方法,可是大多數瀏覽器都會在 30一、302 和 303 狀態下的重定向把 POST 方法改爲 GET 方法。
瀏覽器緩存分爲強制緩存和協商緩存,優先讀取強制緩存。
強制緩存分爲expires和cache-control:
協商緩存包括etag和last-modified:
若是 Last-Modified 和 ETag 同時被使用,則要求它們的驗證都必須經過纔會返回304,若其中某個驗證沒經過,則服務器會按常規返回資源實體及200狀態碼。
協商緩存與強制緩存的區別在於強制緩存不須要訪問服務器,返回結果是200,協商緩存須要訪問服務器,命中協商緩存的話,返回結果是304。
步驟:客戶端發送附帶條件的請求時(if-matched,if-modified-since,if-none-match,if-range,if-unmodified-since任一個)服務器端容許請求訪問資源,但因發生請求未知足條件的狀況後,直接返回304Modified(服務器端資源未改變,可直接使用客戶端未過時的緩存)。
補充網頁:expires/cache-control/last-modified/etag詳解以及解釋爲什麼應chrome該顯示304卻顯示200:
http://www.cnblogs.com/vajoy/p/5341664.html
last-modified的設置標準是資源的上次修改時間
etag是爲了應對資源修改時間可能很頻繁的狀況出現的,是基於資源的內容計算出來的值,所以優先級也較高。
expires是一個特定的時間,是比較舊的標準。
cache-control一般是一個具體的時間長度,比較新,優先級也比較高。
關於303和307:https://blog.csdn.net/liuxingen/article/details/51511034
30三、307其實就是把原來30一、302不」合法」的處理動做給」合法化」,由於發現你們都不太遵照,因此乾脆就增長一條規定。
額外功能:也用於hsts跳轉。hsts全稱HTTP嚴格傳輸安全(HTTP Strict Transport Security,縮寫:HSTS)
400 Bad Request :請求報文中存在語法錯誤。提交json時,若是json格式有問題,接收端接收json,也會出現400 bad request。好比常見的json串,數組不該該有",可是有"了。
401 Unauthorized :該狀態碼錶示發送的請求須要有認證信息(BASIC 認證、DIGEST 認證)。若是以前已進行過一次請求,則表示用戶認證失敗。
403 Forbidden :請求被拒絕,服務器端沒有必要給出拒絕的詳細理由。
404 Not Found
405 method not allowed
問題緣由:請求的方式(get、post、delete)方法與後臺規定的方式不符合。好比: 後臺方法規定的請求方式只接受get,若是用post請求,就會出現 405 method not allowed的提示
500: Internal Server Error :服務器正在執行請求時發生錯誤。
502:Bad Gateway:進程響應的內容是nginx沒法理解的響應
503 Service Unavilable :服務器暫時處於超負載或正在進行停機維護,如今沒法處理請求。(瞬時請求量過大)
504:Gateway Time-out:進程阻塞超過nginx的時間閾值返回504
參考:
長鏈接和流水線(Pipelining)處理
HTTP 1.1支持長鏈接(PersistentConnection)和管線化(Pipelining)處理,在一個TCP鏈接上能夠傳送多個HTTP請求和響應,減小了創建和關閉鏈接的消耗和延遲。
若是要斷開 TCP 鏈接,須要由客戶端或者服務器端提出斷開,使用 Connection : close
在HTTP1.1中默認開啓Connection: keep-alive,必定程度上彌補了HTTP1.0每次請求都要建立鏈接的缺點。
在HTTP1.0中認爲每臺服務器都綁定一個惟一的IP地址,所以,請求消息中的URL並無傳遞主機名(hostname)。但隨着虛擬主機技術的發展,在一臺物理服務器上能夠存在多個虛擬主機(Multi-homed Web Servers),而且它們共享一個IP地址。HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中若是沒有Host頭域會報告一個錯誤(400 Bad Request)。(Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務器或網關的位置。)
在http 1.1中不能缺失host字段,若是缺失, 服務器返回400 bad request,http1.1中不能缺失host字段,但host字段能夠是空值。
HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是須要某個對象的一部分,而服務器卻將整個對象送過來了,而且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它容許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和鏈接。
另外一種解釋:能夠把數據分割成多塊,讓瀏覽器逐步顯示頁面。
在HTTP1.1中新增了24個錯誤狀態響應碼,如:
在HTTP1.0中主要使用header裏的If-Modified-Since,Expires來作爲緩存判斷的標準。
HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
新增緩存處理指令 max-age
https://mp.weixin.qq.com/s/NMhNVDP47npMqx5ruVy43w
HTTP/1.x 缺陷
HTTP/1.x 實現簡單是以犧牲性能爲代價的:
HTTP/2.0 將報文分紅 HEADERS 幀和 DATA 幀,它們都是二進制格式的。
在通訊過程當中,只會有一個 TCP 鏈接存在,它承載了任意數量的雙向數據流(Stream)。
幀(Frame)是最小的通訊單位,來自不一樣數據流的幀能夠交錯發送,而後再根據每一個幀頭的數據流標識符從新組裝。
在這裏插入圖片描述
和1.1區別在於:
HTTP1.x的解析是基於文本。基於文本協議的格式解析存在自然缺陷,文本的表現形式有多樣性,要作到健壯性考慮的場景必然不少
即鏈接共享,即每個request都是是用做鏈接共享機制的。一個request對應一個id,這樣一個鏈接上能夠有多個request,每一個鏈接的request能夠隨機的混雜在一塊兒,接收方能夠根據request的 id將request再歸屬到各自不一樣的服務端請求裏面。
單鏈接多資源的方式,減小服務端的連接壓力,內存佔用更少,鏈接吞吐量更大;
HTTP2.0的多路複用和HTTP1.X中的長鏈接複用有什麼區別?
關鍵點:一個是串行,一個是並行,一個阻塞不影響其餘request。
如上文中所言,對前面提到過HTTP1.x的header帶有大量信息,並且每次都要重複發送,HTTP2.0使用encoder來減小須要傳輸的header大小,通信雙方各自cache一份header fields表,既避免了重複header的傳輸,又減少了須要傳輸的大小。
在這裏插入圖片描述
在這裏插入圖片描述
同SPDY同樣,HTTP2.0也具備server push功能。
在這裏插入圖片描述
在這裏插入圖片描述
針對HTTP高延遲的問題,SPDY優雅的採起了多路複用(multiplexing)。多路複用經過多個請求stream共享一個tcp鏈接的方式,解決了HOL blocking的問題,下降了延遲同時提升了帶寬的利用率。
多路複用帶來一個新的問題是,在鏈接共享的基礎之上有可能會致使關鍵請求被阻塞。SPDY容許給每一個request設置優先級,這樣重要的請求就會優先獲得響應。好比瀏覽器加載首頁,首頁的html內容應該優先展現,以後纔是各類靜態資源文件,腳本文件等加載,這樣能夠保證用戶能第一時間看到網頁內容。
前面提到HTTP1.x的header不少時候都是重複多餘的。選擇合適的壓縮算法能夠減少包的大小和數量。
採用了SPDY的網頁,例如個人網頁有一個sytle.css的請求,在客戶端收到sytle.css數據的同時,服務端會將sytle.js的文件推送給客戶端,當客戶端再次嘗試獲取sytle.js時就能夠直接從緩存中獲取到,不用再發請求了。
大大提升了傳輸數據的可靠性。
HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
HTTP2.0 消息頭的壓縮算法採用 HPACK
SPDY 消息頭的壓縮算法採用 DEFLATE
HTTPS和HTTP的區別主要以下:
一、https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。
二、http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。
三、用的端口也不同,前者是80,後者是443。
四、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證、完整性保護的網絡協議,比http協議安全。
內容可能會被竊聽;
通訊方的身份有可能遭遇假裝;
報文有可能遭篡改。
HTTPs 並非新協議,而是讓 HTTP 先和 SSL(Secure Sockets Layer)通訊,再由 SSL 和 TCP 通訊。也就是說 HTTPs 使用了隧道進行通訊。
隧道:它是將原始IP包(其報頭包含原始發送者和最終目的地)封裝在另外一個數據包(稱爲封裝的IP包)的數據淨荷中進行傳輸。使用隧道的緣由是在不兼容的網絡上傳輸數據,或在不安全網絡上提供一個安全路徑。
經過使用 SSL,HTTPs 具備了:
加密(防竊聽)、認證(防假裝)和完整性保護(防篡改)
在這裏插入圖片描述
請看下面加黑字體是重點:
在這裏插入圖片描述
服務方 S 向第三方機構CA提交公鑰、組織信息、我的信息(域名)等信息並申請認證;
CA 經過線上、線下等多種手段驗證申請者提供信息的真實性,如組織是否存在、企業是否合法,是否擁有域名的全部權等;
客戶端:
客戶端 C 向服務器 S 發出請求時,S 返回證書文件;
客戶端 C 讀取證書中的相關的明文信息,採用相同的散列函數計算獲得信息摘要,而後,利用對應 CA 的公鑰解密簽名數據,
對比證書的信息摘要(明文的信息摘要和簽名解密後的一致),若是一致,則能夠確認證書的合法性,即公鑰合法;
客戶端而後驗證證書相關的域名信息、有效時間等信息;
在這個過程注意幾點:
1.申請證書不須要提供私鑰,確保私鑰永遠只能服務器掌握;
2.證書的合法性仍然依賴於非對稱加密算法,證書主要是增長了服務器信息以及簽名;
3.內置 CA 對應的證書稱爲根證書,頒發者和使用者相同,本身爲本身簽名,即自簽名證書;
HTTPs 採用混合的加密機制,使用公開密鑰加密用於傳輸對稱密鑰來保證安全性,以後使用對稱密鑰加密進行通訊來保證效率。(下圖中的 Session Key 就是對稱密鑰)
在這裏插入圖片描述
SSL 提供報文摘要功能來進行完整性保護。
HTTP 也提供了 MD5 報文摘要功能,可是卻不是安全的。例如報文內容被篡改以後,同時從新計算 MD5 的值,通訊接收方是沒法
意識到發生篡改。
HTTPs 的報文摘要功能之因此安全,是由於它結合了加密和認證這兩個操做。試想一下,加密以後的報文,遭到篡改以後,也很難從新計算報文摘要,由於沒法輕易獲取明文。
GET 用於獲取資源,而 POST 用於傳輸實體主體。
GET 的傳參方式相比於 POST 安全性較差,由於 GET 傳的參數在 URL 中是可見的,可能會泄露私密信息。
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1 POST /test/demo_form.asp HTTP/1.1 Host: w3schools.com name1=value1&name2=value2
安全的 HTTP 方法不會改變服務器狀態,也就是說它只是可讀的。GET 方法是安全的,而 POST 卻不是
由於 POST 的目的是傳送實體主體內容,這個內容多是用戶上傳的表單數據,上傳成功以後,服務器可能把這個數據存儲到數據庫中,所以狀態也就發生了改變。
安全的方法除了 GET 以外還有:HEAD、OPTIONS。
不安全的方法除了 POST 以外還有 PUT、DELETE。
冪等的 HTTP 方法,一樣的請求被執行一次與連續執行屢次的效果是同樣的,服務器的狀態也是同樣的。
GET,HEAD,PUT 和 DELETE 等方法都是冪等的,
而POST 方法不是。全部的安全方法也都是冪等的。
請求報文的 HTTP 方法自己是可緩存的,包括 GET 和 HEAD
爲了闡述 POST 和 GET 的另外一個區別,須要先了解 XMLHttpRequest:
XMLHttpRequest 是一個 API,它爲客戶端提供了在客戶端和服務器之間傳輸數據的功能。它提供了一個經過 URL 來獲取數據的簡單方式,而且不會使整個頁面刷新。這使得網頁只更新一部分頁面而不會打擾到用戶。XMLHttpRequest 在 AJAX 中被大量使用。
在使用 XMLHttpRequest 的 POST 方法時,瀏覽器會先發送 Header 再發送 Data。
但並非全部瀏覽器會這麼作,例如火狐就不會。而 GET 方法 Header 和 Data 會一塊兒發送。
我是蠻三刀把刀,目前爲後臺開發工程師。主要關注後臺開發,網絡安全,Python爬蟲等技術。
來微信和我聊聊:yangzd1102
Github:https://github.com/qqxx6661
擁有專欄:Leetcode題解(Java/Python)、Python爬蟲開發、面試助攻手冊
https://www.zhihu.com/people/yang-zhen-dong-1/
擁有專欄:碼農面試助攻手冊
https://juejin.im/user/5b48015ce51d45191462ba55
https://www.jianshu.com/u/b5f225ca2376
我的公衆號:Rude3Knife
若是文章對你有幫助,不妨收藏起來並轉發給您的朋友們~