HTTP應知應會知識點複習手冊(上)
前言
本文快速回顧了常考的的知識點,用作面試複習,事半功倍。
知乎閱讀體驗較差,請移步CSDN,見下方鏈接。
上篇主要內容: 狀態碼、Http1.0/1.1/2.0、Https、GET和POST
下篇主要內容: Web攻擊技術、HTTP基礎概念、HTTP Header詳解、HTTP應用
面試知識點複習手冊
全複習手冊文章導航
Csdn全複習手冊文章導航:
https://blog.csdn.net/qqxx6661/article/details/86775594
已發布知識點複習手冊
- Java基礎知識點面試手冊
- Java容器(List、Set、Map)知識點快速複習手冊
- Java並發知識點快速複習手冊(上)
- Java並發知識點快速複習手冊(下)
- Java虛擬機知識點快速複習手冊(上)
- Java虛擬機知識點快速複習手冊(下)
- 快速梳理23種常用的設計模式
- Redis基礎知識點面試手冊
- Leetcode題解分類匯總(前150題)
- 面試常問的小演算法總結
- 查找演算法總結及其部分演算法實現Python/Java
- 排序演算法實現與總結Python/Java
- ......等(請查看全複習手冊導航)
本文參考
本文內容主要參考來自CyC2018的Github倉庫:CS-Notes
有刪減,修改,補充額外增加內容
本作品採用知識共享署名-非商業性使用 4.0 國際許可協議進行許可。
--------------------正文-----------------------
狀態碼
圖片文件夾兩張圖
有拓展參考:https://zhuanlan.zhihu.com/p/34648453
1XX 信息
- 100 Continue :表明到目前為止都很正常,客戶端可以繼續發送請求或者忽略這個響應。
- 101 Switching Protocols 協議升級:請求者要求伺服器切換協議,伺服器確認並準備切換
- 主要用於websocket:表示服務端接受 WebSocket 協議的客戶端連接
- 也可以用於http2的升級。
2XX 成功
- 200 OK
- 204 No Content :請求已經成功處理,但是返回的響應報文不包含實體的主體部分。一般在只需要從客戶端往伺服器發送信息,而不需要返回數據時使用。
- 206 Partial Content :表示客戶端進行了範圍請求。響應報文包含由 Content-Range 指定範圍的實體內容。
3XX 重定向
- 301 Moved Permanently :永久性重定向
- 302 Found :臨時性重定向
- 303 See Other :和 302 有著相同的功能,但是 303 明確要求客戶端應該採用 GET 方法獲取資源。
- 註:雖然 HTTP 協議規定 301、302 狀態下重定向時不允許把 POST 方法改成 GET 方法,但是大多數瀏覽器都會在 301、302 和 303 狀態下的重定向把 POST 方法改成 GET 方法。
- 304 Not Modified :如果請求報文首部包含一些條件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不滿足條件,則伺服器會返回 304 狀態碼。 瀏覽器緩存分為強制緩存和協商緩存,優先讀取強制緩存。
強制緩存分為expires和cache-control:
- expires是一個特定的時間,是比較舊的標準。
- cache-control通常是一個具體的時間長度,比較新,優先順序也比較高。
協商緩存包括etag和last-modified:
- last-modified的設置標準是資源的上次修改時間
- etag是為了應對資源修改時間可能很頻繁的情況出現的,是基於資源的內容計算出來的值,因此優先順序也較高。
如果 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
- 307 Temporary Redirect :臨時重定向,與 302 的含義類似,但是 307 要求瀏覽器不允許把重定向請求的 POST 方法改成 GET 方法。 關於303和307:https://blog.csdn.net/liuxingen/article/details/51511034 303、307其實就是把原來301、302不」合法」的處理動作給」合法化」,因為發現大家都不太遵守,所以乾脆就增加一條規定。 額外功能:也用於hsts跳轉。hsts全稱HTTP嚴格傳輸安全(HTTP Strict Transport Security,縮寫:HSTS) - 功能是要求瀏覽器下次訪問該站點時使用https來訪問,而不再需要先是http再轉https。這樣可以避免ssl剝離攻擊:即攻擊者在用戶使用http訪問的過程中進行攻擊,對伺服器冒充自己是用戶,在攻擊者和伺服器中使用https訪問,在用戶和伺服器中使用http訪問。具體使用方法是在伺服器響應頭中添加Strict-Transport-Security,可以設置 max-age。
4XX 客戶端錯誤
- 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的提示
- 408 請求超時
5XX 伺服器錯誤
- 500: Internal Server Error :伺服器正在執行請求時發生錯誤。
- 502:Bad Gateway:進程響應的內容是nginx無法理解的響應
- 503 Service Unavilable :伺服器暫時處於超負載或正在進行停機維護,現在無法處理請求。(瞬時請求量過大)
- 504:Gateway Time-out:進程阻塞超過nginx的時間閾值返回504
- 505:不支持該http版本
Http1.0/1.1/2.0
參考:
- https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A
- https://github.com/CyC2018/Interview-Notebook/blob/master/notes/HTTP.md
1.1相比1.0
長連接和流水線(Pipelining)處理
HTTP 1.1支持長連接(PersistentConnection)和管線化(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。
如果要斷開 TCP 連接,需要由客戶端或者伺服器端提出斷開,使用 Connection : close
在HTTP1.1中默認開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要創建連接的缺點。
Host頭處理/虛擬主機
在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欄位可以是空值。
- 在http 1.0中可以缺失host欄位。
支持分塊傳輸編碼
HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而伺服器卻將整個對象送過來了,並且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和連接。
另一種解釋:可以把數據分割成多塊,讓瀏覽器逐步顯示頁面。
錯誤通知的管理/新增狀態碼
在HTTP1.1中新增了24個錯誤狀態響應碼,如: - 409(Conflict)表示請求的資源與資源的當前狀態發生衝突; - 410(Gone)表示伺服器上的某個資源被永久性的刪除。
緩存處理(協商緩存)
在HTTP1.0中主要使用header里的If-Modified-Since,Expires來做為緩存判斷的標準。
HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
新增緩存處理指令 max-age
支持同時打開多個 TCP 連接
新增狀態碼 100
2.0相比1.1
https://mp.weixin.qq.com/s/NMhNVDP47npMqx5ruVy43w
HTTP/1.x 缺陷
HTTP/1.x 實現簡單是以犧牲性能為代價的:
- 客戶端需要使用多個連接才能實現並發和縮短延遲;
- 不會壓縮請求和響應首部,從而導致不必要的網路流量;
- 不支持有效的資源優先順序,致使底層 TCP 連接的利用率低下。
二進位分幀層
HTTP/2.0 將報文分成 HEADERS 幀和 DATA 幀,它們都是二進位格式的。
在通信過程中,只會有一個 TCP 連接存在,它承載了任意數量的雙向數據流(Stream)。
- 一個數據流(Stream)都有一個唯一標識符和可選的優先順序信息,用於承載雙向信息。
- 消息(Message)是與邏輯請求或響應對應的完整的一系列幀。
- 幀(Frame)是最小的通信單位,來自不同數據流的幀可以交錯發送,然後再根據每個幀頭的數據流標識符重新組裝。