HTTP相關知識點

1、http版本

1. http1.1

1.1 持久鏈接

經過使用 Connection:keep-alive 進行長鏈接。客戶端只請求一次,可是服務器會將繼續保持鏈接,當再次請求時,避免了從新創建鏈接。瀏覽器

1.2 管道機制(pipelining)

在同一個TCP鏈接裏面,客戶端能夠同時發送多個請求。這樣就進一步改進了HTTP協議的效率。緩存

舉例來講,客戶端須要請求兩個資源。之前的作法是,在同一個TCP鏈接裏面,先發送A請求,而後等待服務器作出迴應,收到後再發出B請求。管道機制則是容許瀏覽器同時發出A請求和B請求,可是服務器仍是按照順序,先回應A請求,完成後再回應B請求。安全

1.3 對頭阻塞問題(Head-of-line blocking)

雖然1.1版容許複用TCP鏈接,可是同一個TCP鏈接裏面,全部的數據通訊是按次序進行的。服務器只有處理完一個迴應,纔會進行下一個迴應。要是前面的迴應特別慢,後面就會有許多請求排隊等着。這稱爲「隊頭堵塞」(Head-of-line blocking)。服務器

2. http2與http1.1的區別(優勢)

  1. HTTP2使用的是二進制傳送,HTTP1.X是文本(字符串)傳送。cookie

    你們都知道HTTP1.X使用的是明文的文本傳送,而HTTP2使用的是二進制傳送,二進制傳送的單位是幀和流。幀組成了流,同時流還有流ID標示,經過流ID就牽扯出了第二個區別網絡

  2. HTTP2支持多路複用session

    • HTTP/2 中,有兩個很是重要的概念,分別是幀(frame)和流(stream)。
    • 幀表明着最小的數據單位,每一個幀會標識出該幀屬於哪一個流,流也就是多個幀組成的數據流。
    • 多路複用,就是在一個 TCP 鏈接中能夠存在多條流。換句話說,也就是能夠發送多個請求,服務端能夠經過幀中的標識知道屬於哪一個請求。經過這個技術,能夠避免 HTTP 舊版本中的隊頭阻塞問題,極大的提升傳輸性能。
  3. HTTP2頭部壓縮post

    HTTP/1 中,咱們使用文本的形式傳輸 header,在 header 攜帶 cookie 的狀況下,可能每次都須要重複傳輸幾百到幾千的字節。性能

    HTTP2經過gzip和compress壓縮頭部而後再發送,同時客戶端和服務器端同時維護一張頭信息表,全部字段都記錄在這張表中,這樣後面每次傳輸只須要傳輸表裏面的索引Id就行,經過索引ID就能夠知道表頭的值了網站

  4. HTTP2支持服務器推送 在 HTTP/2 中,服務端能夠在客戶端某個請求後,主動推送其餘資源。

2、http協議的主要特色

1. 簡單快速

簡單:每一個資源(好比圖片、頁面)都經過 url 來定位。這都是固定的,在http協議中,處理起來也比較簡單,想訪問什麼資源,直接輸入url便可。

2. 靈活

http協議的頭部有一個數據類型,經過http協議,就能夠完成不一樣數據類型的傳輸。

3. 無鏈接

鏈接一次,就會斷開,不會繼續保持鏈接。

4. 無狀態

客戶端和服務器端是兩種身份。第一次請求結束後,就斷開了,第二次請求時,服務器端並無記住以前的狀態,也就是說,服務器端沒法區分客戶端是否爲同一我的、同一個身份。

有的時候,咱們訪問網站時,網站能記住咱們的帳號,這個是經過其餘的手段(好比 session)作到的,並非http協議能作到的。

3、http報文的組成部分

1. 請求報文

  • 請求行:請求方法、請求url、http協議及版本

  • 請求頭

    常見請求頭:

    ​ Accept:可接受的相應內容類型

    ​ Accept-Language:可接受的響應內容語言列表

    ​ User-Agent:瀏覽器的身份標識字符串

    ​ Content-Type:請求體的MIME類型 (用於POST和PUT請求中)

    ​ Content-Length:以8進製表示的請求體的長度

    ​ Connection:客戶端(瀏覽器)想要優先使用的鏈接類型

    ​ Cache-Control:用來指定當前的請求/回覆中的,是否使用緩存機制

    ​ Cookie

  • 空行

  • 請求體

2. 響應報文

  • 狀態行:http協議及版本、狀態碼及描述、

  • 響應頭

    經常使用的響應頭:

    ​ Server:服務器的名稱

    ​ Content-Type:當前內容的MIME類型

    ​ Content-Length:響應消息體的長度,用8進制字節表示

    ​ Transfer-Encoding:表示實體傳輸給用戶的編碼形式

    ​ Date:此條消息被髮送時的日期和時間

  • 空行

  • 響應體

4、http方法

1. 經常使用方法

  • GET:獲取資源
  • POST:傳輸資源
  • put:更新資源
  • DELETE:刪除資源
  • HEAD:得到報文首部

2. get和post區別

  1. 瀏覽器在回退時,get不會從新請求,可是post會從新請求。

  2. get請求會被瀏覽器主動緩存,而post不會。

  3. get請求的參數,會報保留在瀏覽器的歷史記錄裏,而post不會。作業務時要注意。爲了防止CSRF攻擊,不少公司把get統一改爲了post。

  4. get請求在url中傳遞的參數有大小限制,基本是2kb,不一樣的瀏覽器略有不一樣。而post沒有注意。

  5. get的參數是直接暴露在url上的,相對不安全。而post是放在請求體中的。

5、http狀態碼

2XX 成功

  • 200 OK,表示從客戶端發來的請求在服務器端被正確處理
  • 204 No content,表示請求成功,但響應報文不含實體的主體部分
  • 205 Reset Content,表示請求成功,但響應報文不含實體的主體部分,可是與 204 響應不一樣在於要求請求方重置內容
  • 206 Partial Content,進行範圍請求

3XX 重定向

  • 301 moved permanently,永久性重定向,表示資源已被分配了新的 URL
  • 302 found,臨時性重定向,表示資源臨時被分配了新的 URL
  • 303 see other,表示資源存在着另外一個 URL,應使用 GET 方法獲取資源
  • 304 not modified,表示服務器容許訪問資源,但因發生請求未知足條件的狀況
  • 307 temporary redirect,臨時重定向,和302含義相似,可是指望客戶端保持請求方法不變向新的地址發出請求

4XX 客戶端錯誤

  • 400 bad request,請求報文存在語法錯誤
  • 401 unauthorized,表示發送的請求須要有經過 HTTP 認證的認證信息
  • 403 forbidden,表示對請求資源的訪問被服務器拒絕
  • 404 not found,表示在服務器上沒有找到請求的資源

5XX 服務器錯誤

  • 500 internal sever error,表示服務器端在執行請求時發生了錯誤
  • 501 Not Implemented,表示服務器不支持當前請求所須要的某個功能
  • 503 service unavailable,代表服務器暫時處於超負載或正在停機維護,沒法處理請求

6、http緩存

1. 強緩存

不用請求服務器,直接使用本地的緩存。

強緩存是利用 http 響應頭中的**ExpiresCache-Control**實現的。

瀏覽器第一次請求一個資源時,服務器在返回該資源的同時,會把上面這兩個屬性放在response header中。

  1. Expires:服務器返回的絕對時間

Expires是http1.0提出的一個表示資源過時時間的header,它描述的是一個絕對時間,由服務器返回。 Expires 受限於本地時間,若是修改了本地時間,可能會形成緩存失效

  1. Cache-Control:服務器返回的相對時間

http1.1中新增的 response header。瀏覽器第一次請求資源以後,在接下來的相對時間以內,均可以利用本地緩存。超出這個時間以後,則不能命中緩存。從新請求時,Cache-Control會被更新。

二者同時存在的話,Cache-Control優先級高於Expires

2. 協商緩存

瀏覽器發現本地有資源的副本,可是不太肯定要不要使用,因而去問問服務器。

當瀏覽器對某個資源的請求沒有命中強緩存(也就是說超出時間了),就會發一個請求到服務器,驗證協商緩存是否命中。

  1. Last-ModifiedIf-Modified-Since

(1)瀏覽器第一次請求一個資源,服務器在返回這個資源的同時,會加上Last-Modified這個 response header,這個header表示這該資源在服務器上的最後修改時間

(2)瀏覽器再次請求這個資源時,會加上If-Modified-Since這個 request header,這個header的值就是上一次返回的Last-Modified的值

(3)服務器收到第二次請求時,會比對瀏覽器傳過來的If-Modified-Since和資源在服務器上的最後修改時間Last-Modified,判斷資源是否有變化。若是沒有變化則返回304 Not Modified,但不返回資源內容(此時,服務器不會返回 Last-Modified 這個 response header);若是有變化,就正常返回資源內容(繼續重複整個流程)。這是服務器返回304時的response header

(4)瀏覽器若是收到304的響應,就會從緩存中加載資源

但last-modified 存在一些缺點:

  • 某些服務端不能獲取精確的修改時間

  • 文件修改時間改了,但文件內容卻沒有變

既然根據文件修改時間來決定是否緩存尚有不足,可否能夠直接根據文件內容是否修改來決定緩存策略?

  1. ETagIf-None-Match

(1)瀏覽器第一次請求一個資源,服務器在返回這個資源的同時,會加上ETag這個 response header,這個header是服務器根據當前請求的資源生成的惟一標識。這個惟一標識是一個字符串,只要資源有變化這個串就不一樣,跟最後修改時間無關,因此也就很好地補充了Last-Modified的不足。

(2)瀏覽器再次請求這個資源時,會加上If-None-Match這個 request header,這個header的值就是上一次返回的ETag的值

(3)服務器第二次請求時,會對比瀏覽器傳過來的If-None-Match和服務器從新生成的一個新的ETag,判斷資源是否有變化。若是沒有變化則返回304 Not Modified,但不返回資源內容(此時,因爲ETag從新生成過,response header中還會把這個ETag返回,即便這個ETag並沒有變化)。若是有變化,就正常返回資源內容(繼續重複整個流程)。這是服務器返回304時的response header

(4)瀏覽器若是收到304的響應,就會從緩存中加載資源。

7、http和https區別

  1. https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。

  2. http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。

  3. http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。

  4. http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

相關文章
相關標籤/搜索