目錄css
HTTP全稱是Hyper Text Transfer Protocol(超文本傳輸協議),它容許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。這也是Web程序之間的最基本的一個通訊協議,也是面試常考點。
@html
服務器返回的 響應報文 中第一行爲狀態行,包含了狀態碼以及緣由短語,用來告知客戶端請求的結果。
面試
HTTP 協議是無狀態的,主要是爲了讓 HTTP 協議儘量簡單,使得它可以處理大量事務。HTTP/1.1 引入 Cookie 來保存狀態信息。
Cookie 是服務器發送到用戶瀏覽器並保存在本地的一小塊數據,它會在瀏覽器以後向同一服務器再次發起請求時被攜帶上,用於告知服務端兩個請求是否來自同一瀏覽器。因爲以後每次請求都會須要攜帶 Cookie 數據,所以會帶來額外的性能開銷(尤爲是在移動環境下)。
Cookie 曾一度用於客戶端數據的存儲,由於當時並無其它合適的存儲辦法而做爲惟一的存儲手段,但如今隨着現代瀏覽器開始支持各類各樣的存儲方式,Cookie 漸漸被淘汰。新的瀏覽器 API 已經容許開發者直接將數據存儲到本地,如使用 Web storage API (本地存儲和會話存儲)或 IndexedDB。數據庫
用途瀏覽器
當瀏覽器訪問一個包含多張圖片的 HTML 頁面時,除了請求訪問 HTML 頁面資源,還會請求圖片資源。若是每進行一次 HTTP 通訊就要新建一個 TCP 鏈接,那麼開銷會很大。
長鏈接只須要創建一次 TCP 鏈接就能進行屢次 HTTP 通訊。
從 HTTP/1.1 開始默認是長鏈接的,若是要斷開鏈接,須要由客戶端或者服務器端提出斷開,使用 Connection : close;
在 HTTP/1.1 以前默認是短鏈接的,若是須要使用長鏈接,則使用 Connection : Keep-Alive。緩存
HTTP 有如下安全性問題:安全
HTTPs並非新協議,而是讓HTTP先和SSL(Secure Sockets Layer)通訊,再由SSL和TCP通訊,也就是說HTTPs 使用了隧道進行通訊。
經過使用 SSL,HTTPs 具備了加密(防竊聽)、認證(防假裝)和完整性保護(防篡改)服務器
對稱密鑰加密(Symmetric-Key Encryption),加密和解密使用同一密鑰。
優勢:運算速度快;
缺點:沒法安全地將密鑰傳輸給通訊方。cookie
非對稱密鑰加密,又稱公開密鑰加密(Public-Key Encryption),加密和解密使用不一樣的密鑰。
公開密鑰全部人均可以得到,通訊發送方得到接收方的公開密鑰以後,就可使用公開密鑰進行加密,接收方收到通訊內容後使用私有密鑰解密。
非對稱密鑰除了用來加密,還能夠用來進行簽名。由於私有密鑰沒法被其餘人獲取,所以通訊發送方使用其私有密鑰進行簽名,通訊接收方使用發送方的公開密鑰對簽名進行解密,就能判斷這個簽名是否正確。
優勢:能夠更安全地將公開密鑰傳輸給通訊發送方;
缺點:運算速度慢。網絡
詳細內容請見上文
HTTP/1.1 默認是長鏈接
HTTP/1.1 支持管線化處理
HTTP/1.1 支持同時打開多個 TCP 鏈接
HTTP/1.1 支持虛擬主機
HTTP/1.1 新增狀態碼 100
HTTP/1.1 支持分塊傳輸編碼
HTTP/1.1 新增緩存處理指令 max-age
HTTP/1.x 實現簡單是以犧牲性能爲代價的:
在通訊系統中,只有一個TCP鏈接存在,它承載了任意數量的數據雙向流(Stream)
幀(Fram)是最小的通訊單位,來自不一樣數據流的幀能夠交錯發送,而後再根據每一個幀頭的數據流標識符從新組裝。
HTTP/2.0 在客戶端請求一個資源時,會把相關的資源一塊兒發送給客戶端,客戶端就不須要再次發起請求了。例如客戶端請求 page.html 頁面,服務端就把 script.js 和 style.css 等與之相關的資源一塊兒發給客戶端。
HTTP/1.1 的首部帶有大量信息,並且每次都要重複發送。
HTTP/2.0 要求客戶端和服務器同時維護和更新一個包含以前見過的首部字段表,從而避免了重複傳輸。
不只如此,HTTP/2.0 也使用 Huffman 編碼對首部字段進行壓縮。
GET 用於獲取資源,而 POST 用於傳輸實體主體。
GET 和 POST 的請求都能使用額外的參數,可是 GET 的參數是以查詢字符串出如今 URL 中,而 POST 的參數存儲在實體主體中。不能由於 POST 參數存儲在實體主體中就認爲它的安全性更高,由於照樣能夠經過一些抓包工具(Fiddler)查看。
由於 URL 只支持 ASCII 碼,所以 GET 的參數中若是存在中文等字符就須要先進行編碼。例如 中文 會轉換爲 %E4%B8%AD%E6%96%87,而空格會轉換爲 %20。POST 參考支持標準字符集。
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 方法不是。
GET /pageX HTTP/1.1 是冪等的,連續調用屢次,客戶端接收到的結果都是同樣的:
GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1
POST /add_row HTTP/1.1 不是冪等的,若是調用屢次,就會增長多行記錄:
POST /add_row HTTP/1.1 -> Adds a 1nd row POST /add_row HTTP/1.1 -> Adds a 2nd row POST /add_row HTTP/1.1 -> Adds a 3rd row
DELETE /idX/delete HTTP/1.1 是冪等的,即使不一樣的請求接收到的狀態碼不同:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted DELETE /idX/delete HTTP/1.1 -> Returns 404
若是要對響應進行緩存,須要知足如下條件: