在地址欄輸入網址後:html
GET /index.html HTTP1.1
,準備發起網絡請求1991年提出,最初的目的只是爲了傳輸體積很小的HTML文件,所以稱爲超文本傳輸協議。特色:瀏覽器
GET /index.html
,沒有請求頭和請求體1994年出現了撥號上網,同年網景推出了瀏覽器,萬維網進入了高速發展的階段。爲支持多種類型的文件下載HTTP/1.0引入了請求頭和響應頭。引入了狀態碼、提供了Cache機制來緩存下載過的資源、加入了用戶代理字段。緩存
例如HTTP請求頭告訴服務器本身但願服務器返回的文件類型、壓縮方法、文件的編碼方式、語種:安全
accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh
複製代碼
服務器返回本身最終選擇的方式,如壓縮方法、文件類型:bash
content-encoding: br
content-type: text/html; charset=UTF-8
複製代碼
HTTP/1.0中每一對請求響應都須要單獨的TCP鏈接,HTTP/1.1增長了持久鏈接,在一個TCP鏈接上進行屢次請求和響應。服務器
默認是Connection: keep-alive
,即開啓,設置Connection: close
手動關閉。markdown
配合Keep-Alive: timeout=5, max=1000
來設定鏈接時長。其中timeout指定一個空閒鏈接須要保持打開狀態而最小時長(單位:秒)。max指定這次鏈接的最大請求數。cookie
目前瀏覽器對於同一域名容許最多同時創建6個TCP持久鏈接。網絡
管線化指將多個HTTP請求批量提交給服務器,服務器依然根據請求順序來回復瀏覽器的請求。因爲種種緣由,這個技術的嘗試失敗了。併發
HTTP/1.0中一個IP地址只能綁定一個域名,所以服務器只能支持一個域名。隨着虛擬主機技術的發展,須要實現一臺物理主機上綁定多個各自擁有域名的虛擬主機。HTTP/1.1在請求頭中增長了Host字段,用來表示當前域名,供服務器區分。
HTTP/1.0中須要在響應頭中設置完整的數據大小如Content-Length: 901
,以便瀏覽器根據數據大小準確接收數據。但對於動態生成的內容,傳輸前不知道最終大小,致使瀏覽器沒法正確接收全部數據。
HTTP/1.1引入了Chunk transfer機制,服務器將數據分割成若干大小的數據塊,每一個數據塊發送時都會附上數據塊的長度,最後使用一個零長度的塊來結束。這樣就能夠支持動態內容了。
用戶登陸時,服務器驗證用戶登陸信息正確後,會生成一段表示用戶身份的字符串,並寫入響應頭Set-Cookie字段裏,而後發送給瀏覽器,如Set-Cookie: UID=3431uad;
。
瀏覽器將Set-Cookie字段中的值保存到本地,當用戶再次訪問服務器時,瀏覽器會讀取以前保存的Cookie數據並寫入請求頭的Cookie字段中,如Cookie: UID=3431uad;
。
服務器根據Cookie字段中的值查找該用戶的信息,判斷是否已登陸,而後生成包含該用戶信息的頁面數據,返回給瀏覽器。
HttpOnly:Set-Cookie: id=a3fWa; HttpOnly
。禁止JavaScript經過document.cookie訪問cookie,以阻止XSS攻擊。
SameSite: Set-Cookie: id=a3fWa; SameSite=Strict
。SameSite有三個值:
TCP通道中,須要等待前面的請求返回後才能進行下一次請求,若是某個請求由於某些緣由沒有及時返回,就會阻塞後面的全部請求,這就是隊頭阻塞的問題。
2015年5月正式發佈HTTP/2協議規範,該協議使用多路複用機制,實現一個域名只使用一個TCP長鏈接,並消除了隊頭阻塞問題。多路複用技術能充分利用帶寬,最大限度規避了TCP慢啓動所帶來的問題,使得頁面資源的傳輸速度獲得了大幅提高。 使用HTTP/2能帶來20% ~ 60%的效率提高。
HTTP/2添加了一個二進制分幀層,將通過的請求轉換爲一個個帶有請求ID編號的幀,服務器接收到全部幀以後,將全部相同ID的幀合併爲一條完整的請求信息,處理完請求後,將響應也一樣用二進制分幀層轉換爲一個個帶有請求ID編號的幀,瀏覽器接收到響應幀後根據ID編號將數據提交給對應的請求。
瀏覽器能夠隨時發送請求,而沒必要等待前一個請求接收到響應以後;一樣,服務器也能夠按需決定優先返回哪些內容,而沒必要在乎順序,由於每份數據都有ID來標識。這樣就實現了資源的並行傳輸。
HTTP/2解決了應用層面的隊頭阻塞問題,但只要仍是基於TCP,就避免不了TCP的隊頭阻塞問題。而TCP在設計之初就是爲了單連接而設計。
HTTP/3基於UDP協議實現了相似於TCP的多路複用數據流、傳輸可靠性等功能,這套功能被稱爲QUIC協議。