經過使用 Connection:keep-alive 進行長鏈接。客戶端只請求一次,可是服務器會將繼續保持鏈接,當再次請求時,避免了從新創建鏈接。瀏覽器
在同一個TCP鏈接裏面,客戶端能夠同時發送多個請求。這樣就進一步改進了HTTP協議的效率。緩存
舉例來講,客戶端須要請求兩個資源。之前的作法是,在同一個TCP鏈接裏面,先發送A請求,而後等待服務器作出迴應,收到後再發出B請求。管道機制則是容許瀏覽器同時發出A請求和B請求,可是服務器仍是按照順序,先回應A請求,完成後再回應B請求。安全
雖然1.1版容許複用TCP鏈接,可是同一個TCP鏈接裏面,全部的數據通訊是按次序進行的。服務器只有處理完一個迴應,纔會進行下一個迴應。要是前面的迴應特別慢,後面就會有許多請求排隊等着。這稱爲「隊頭堵塞」(Head-of-line blocking)。服務器
HTTP2使用的是二進制傳送,HTTP1.X是文本(字符串)傳送。cookie
你們都知道HTTP1.X使用的是明文的文本傳送,而HTTP2使用的是二進制傳送,二進制傳送的單位是幀和流。幀組成了流,同時流還有流ID標示,經過流ID就牽扯出了第二個區別網絡
HTTP2支持多路複用session
HTTP/2
中,有兩個很是重要的概念,分別是幀(frame)和流(stream)。TCP
鏈接中能夠存在多條流。換句話說,也就是能夠發送多個請求,服務端能夠經過幀中的標識知道屬於哪一個請求。經過這個技術,能夠避免 HTTP
舊版本中的隊頭阻塞問題,極大的提升傳輸性能。HTTP2頭部壓縮post
在 HTTP/1
中,咱們使用文本的形式傳輸 header
,在 header
攜帶 cookie 的狀況下,可能每次都須要重複傳輸幾百到幾千的字節。性能
HTTP2經過gzip和compress壓縮頭部而後再發送,同時客戶端和服務器端同時維護一張頭信息表,全部字段都記錄在這張表中,這樣後面每次傳輸只須要傳輸表裏面的索引Id就行,經過索引ID就能夠知道表頭的值了網站
HTTP2支持服務器推送 在 HTTP/2
中,服務端能夠在客戶端某個請求後,主動推送其餘資源。
簡單:每一個資源(好比圖片、頁面)都經過 url 來定位。這都是固定的,在http協議中,處理起來也比較簡單,想訪問什麼資源,直接輸入url便可。
http協議的頭部有一個數據類型
,經過http協議,就能夠完成不一樣數據類型的傳輸。
鏈接一次,就會斷開,不會繼續保持鏈接。
客戶端和服務器端是兩種身份。第一次請求結束後,就斷開了,第二次請求時,服務器端並無記住以前的狀態,也就是說,服務器端沒法區分客戶端是否爲同一我的、同一個身份。
有的時候,咱們訪問網站時,網站能記住咱們的帳號,這個是經過其餘的手段(好比 session)作到的,並非http協議能作到的。
請求行:請求方法、請求url、http協議及版本
請求頭
常見請求頭:
Accept:可接受的相應內容類型
Accept-Language:可接受的響應內容語言列表
User-Agent:瀏覽器的身份標識字符串
Content-Type:請求體的MIME類型 (用於POST和PUT請求中)
Content-Length:以8進製表示的請求體的長度
Connection:客戶端(瀏覽器)想要優先使用的鏈接類型
Cache-Control:用來指定當前的請求/回覆中的,是否使用緩存機制
Cookie
空行
請求體
狀態行:http協議及版本、狀態碼及描述、
響應頭
經常使用的響應頭:
Server:服務器的名稱
Content-Type:當前內容的MIME類型
Content-Length:響應消息體的長度,用8進制字節表示
Transfer-Encoding:表示實體傳輸給用戶的編碼形式
Date:此條消息被髮送時的日期和時間
空行
響應體
瀏覽器在回退時,get不會從新請求,可是post會從新請求。
get請求會被瀏覽器主動緩存,而post不會。
get請求的參數,會報保留在瀏覽器的歷史記錄裏,而post不會。作業務時要注意。爲了防止CSRF攻擊,不少公司把get統一改爲了post。
get請求在url中傳遞的參數有大小限制,基本是2kb,不一樣的瀏覽器略有不一樣。而post沒有注意。
get的參數是直接暴露在url上的,相對不安全。而post是放在請求體中的。
2XX 成功
200 OK
,表示從客戶端發來的請求在服務器端被正確處理204 No content
,表示請求成功,但響應報文不含實體的主體部分205 Reset Content
,表示請求成功,但響應報文不含實體的主體部分,可是與 204
響應不一樣在於要求請求方重置內容206 Partial Content
,進行範圍請求3XX 重定向
301 moved permanently
,永久性重定向,表示資源已被分配了新的 URL302 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
,代表服務器暫時處於超負載或正在停機維護,沒法處理請求不用請求服務器,直接使用本地的緩存。
強緩存是利用 http 響應頭中的**Expires
或Cache-Control
**實現的。
瀏覽器第一次請求一個資源時,服務器在返回該資源的同時,會把上面這兩個屬性放在response header中。
Expires
:服務器返回的絕對時間。Expires是http1.0提出的一個表示資源過時時間的header,它描述的是一個絕對時間,由服務器返回。 Expires 受限於本地時間,若是修改了本地時間,可能會形成緩存失效
Cache-Control
:服務器返回的相對時間。http1.1中新增的 response header。瀏覽器第一次請求資源以後,在接下來的相對時間以內,均可以利用本地緩存。超出這個時間以後,則不能命中緩存。從新請求時,Cache-Control
會被更新。
二者同時存在的話,Cache-Control優先級高於Expires
瀏覽器發現本地有資源的副本,可是不太肯定要不要使用,因而去問問服務器。
當瀏覽器對某個資源的請求沒有命中強緩存(也就是說超出時間了),就會發一個請求到服務器,驗證協商緩存是否命中。
Last-Modified
、If-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 存在一些缺點:
某些服務端不能獲取精確的修改時間
文件修改時間改了,但文件內容卻沒有變
既然根據文件修改時間來決定是否緩存尚有不足,可否能夠直接根據文件內容是否修改來決定緩存策略?
ETag
、If-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的響應,就會從緩存中加載資源。
https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。
http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。
http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。