【計算機網絡】應用層 - HTTP協議

概述

HTTP超文本傳輸協議規定了瀏覽器怎樣向萬維網服務器請求萬維網文檔, 以及服務器怎樣把文檔傳送給瀏覽器。

HTTP通過同一資源定位符URL獲得互聯網上資源的位置和訪問這些資源的方法。

URL, URN和URI

  • URI (Uniform Resource Identifier) : 統一資源標識符
    URI 是一種更高層次, 更抽象的概念, URN 和 URL 都是 URI 的子集
  • URL(Uniform Resource Locator) : 統一資源定位器
    URL是URI的一種, 不僅標識了Web 資源, 還指定了操作或者獲取方式, 同時指出了主要訪問機制和網絡位置。
  • URN( Uniform Resource Name) : 統一資源命名
    URN是URI的一種,用特定命名空間的名字標識資源。

HTTP報文

HTTP報文是由多行數據構成的字符串文本

客戶端發送的報文叫做請求報文,服務端回覆的報文爲響應報文。

報文結構

在這裏插入圖片描述

通用首部

首部字段名 說明
Cache-Control 控制緩存的行爲
Connection 控制不再轉發給代理的首部字段、管理持久連接
Date 創建報文的日期時間
Pragma 報文指令
Trailer 報文末端的首部一覽
Transfer-Encoding 指定報文主體的傳輸編碼方式
Upgrade 升級爲其他協議
Via 代理服務器的相關信息
Warning 錯誤通知

請求首部

首部字段名 說明
Accept 用戶代理可處理的媒體類型
Accept-Charset 優先的字符集
Accept-Encoding 優先的內容編碼
Accept-Language 優先的語言(自然語言)
Authorization Web 認證信息
Expect 期待服務器的特定行爲
From 用戶的電子郵箱地址
Host 請求資源所在服務器
If-Match 比較實體標記(ETag)
If-Modified-Since 比較資源的更新時間
If-None-Match 比較實體標記(與 If-Match 相反)
If-Range 資源未更新時發送實體 Byte 的範圍請求
If-Unmodified-Since 比較資源的更新時間(與 If-Modified-Since 相反)
Max-Forwards 最大傳輸逐跳數
Proxy-Authorization 代理服務器要求客戶端的認證信息
Range 實體的字節範圍請求
Referer 對請求中 URI 的原始獲取方
TE 傳輸編碼的優先級
User-Agent HTTP 客戶端程序的信息

響應首部

首部字段名 說明
Accept-Ranges 是否接受字節範圍請求
Age 推算資源創建經過時間
ETag 資源的匹配信息
Location 令客戶端重定向至指定 URI
Proxy-Authenticate 代理服務器對客戶端的認證信息
Retry-After 對再次發起請求的時機要求
Server HTTP 服務器的安裝信息
Vary 代理服務器緩存的管理信息
WWW-Authenticate 服務器對客戶端的認證信息

實體首部

首部字段名 說明
Accept-Ranges 是否接受字節範圍請求
Age 推算資源創建經過時間
ETag 資源的匹配信息
Location 令客戶端重定向至指定 URI
Proxy-Authenticate 代理服務器對客戶端的認證信息
Retry-After 對再次發起請求的時機要求
Server HTTP 服務器的安裝信息
Vary 代理服務器緩存的管理信息
WWW-Authenticate 服務器對客戶端的認證信息

在這裏插入圖片描述在這裏插入圖片描述

HTTP請求方法

  • GET
    請求獲取資源
  • POST
    傳輸實體主體, 用來傳輸數據
  • HEAD
    獲取報文首部,與GET類似
  • PUT
    上傳文件,沒有驗證機制,不安全,一般不用
  • PATCH
    對資源進行部分修改
  • DELETE
    刪除文件,與PUT功能相反
  • OPTIONS
    查詢URL能支持的方法
  • CONNECT
    用於代理服務器

HTTP狀態碼

狀態碼 類別 含義
1XX Informational(信息性狀態碼) 接收的請求正在處理
2XX Success(成功狀態碼) 請求正常處理完畢
3XX Redirection(重定向狀態碼) 需要進行附加操作以完成請求
4XX Client Error(客戶端錯誤狀態碼) 服務器無法處理請求
5XX Server Error(服務器錯誤狀態碼) 服務器處理請求出錯

1XX 信息

  • 100 Continue : 表明到目前爲止都很正常, 客戶端可以繼續發送請求或者忽略這個響應

2XX 成功

  • 200 OK
  • 204 No Content 請求成功處理, 返回的響應報文不包含實體的主體部分。 表示沒有數據返回。
  • 206 Partial Content 表示客戶端進行了範圍請求,相應報文包含指定範圍的內容。

3XX 重定向

  • 301 Moved Permanently 永久重定向
  • 302 Found 臨時重定向
  • 304 Not Modified 沒有滿足請求報文包含的一些條件。

4XX客戶端錯誤

  • 400 Bad Requset 請求報文出現語法錯誤
  • 401 Unauthorized 發送的請求需要有認證信息
  • 403 Forbidden 請求被拒絕
  • 404 Not Found 沒有找到對應的網頁信息

5XX服務器錯誤

  • 500 Internal Server Error 服務器正在執行請求時發生錯誤
  • 503 Service Unavailable 服務器處於超負荷或正停機維護

Cookie和Session

HTTP是無狀態的, 因此想要實現連接會話的管理(登陸狀態,信息記錄等),就需要引入Cookie來保存狀態信息。

Cookie是服務器發送到用戶瀏覽器並保存在本地的一塊小數據,它會在下次請求時被攜帶,用來維持會話。

創建過程
在這裏插入圖片描述
服務器發送響應報文時,在首部添加Set-Cookie字段

Set-Cookie: info=test

客戶端收到該報文時,取出Cookie信息並且在下次發送請求報文時攜帶上。

Cookie:info=test

Set-Cookie字段可設置一些Cookie的屬性

屬性 說明
NAME=VALUE 給Cookie賦予名稱和值(必選)
expires=DATA Cookie的有效期,默認到瀏覽器關閉
path=PATH 到服務器上的目錄爲Cookie適用對象
domain=域名 Cookie使用的域名
Secure 僅在HTTPS下發送Cookie
HttpOnly 防止Cookie被JavaScript訪問

在這裏插入圖片描述

長連接,短連接和流水線

在這裏插入圖片描述

當瀏覽器訪問一個HTML頁面是, 同時需要訪問多個頁面資源,還要請求圖片等,如果使用端連接每次請求訪問都建立一個TCP連接,那麼會有多餘的開銷浪費,如圖1。

HTTP/1.1 提出了長連接的方法,長連接如圖2, 只用建立一次連接即可進行多次HTTP通信,只要任意一段沒有明確提出斷開連接,則保持TCP連接狀態。

  • HTTP/1.1默認長連接,設置通用首部Connection:close;即可斷開連接
  • HTTP/1.1之前默認是短鏈接,使用長連接需設置Connection:Keep-Alive

流水線指在一條長連接上不等待響應返回而是連續發出請求,減少網絡傳輸的延遲開銷。

HTTPS

加密

對稱加密

加密和解密使用同一密鑰

  • 優點 : 加密和解密速度快, 適合大數據場景
  • 缺點 : 一對多的通信中需要維護多組密鑰, 且密鑰傳輸時容易被竊取。

非對稱加密

使用公鑰和私鑰一對密鑰,使用其中一個加密則需要用另一個解密。

  • 優點:加密和解密使用不同的密鑰, 方便密鑰的傳輸和分發。
  • 缺點:加密和解密的速度較慢。

HTTPS採用的加密方式

HTTPS採用混合的加密方式

  1. 客戶端向服務器發送請求, 獲取服務端的證書(帶有公鑰)
  2. 客戶端用公鑰加密對稱密鑰, 再發送給服務器.
  3. 服務器收到了加密的密鑰後, 用自己的私鑰進行解密, 這樣雙方就安全地獲得了對稱密鑰.
  4. 之後雙方使用對稱密鑰加密進行通信。

數字簽名

數字簽名就是加了密的校驗和

  • 簽名的作用: 數字簽名對原文的保密性沒有要求, 主要負責發送者身份的驗證和發送內容完整的檢驗。

  • 簽名原理:對要發送的內容採用哈希算法生成一段摘要,根據摘要可以驗證內容的完整性。 爲了防止摘要被篡改僞造,發送者可以用自己的私鑰對摘要進行加密,接受者將收到的內容生成的摘要和用公鑰就解密後的摘要進行對比,即可防止僞造摘要,也可以確認發送者身份。

  • 存在的問題: 公鑰會被僞造

認證

爲了解決公鑰被僞造的問題, 引入了證書中心(CA機構), 爲服務端的公鑰做認證。

證書的獲得:

  • A找CA證書中心, 提供私鑰,組織信息,個人信息等,申請認證
  • 證書中心通過線上,線下等手段驗證申請者的身份,向申請者發送數字證書。
  • 數字證書的內容:A的公開密鑰,A的名稱,過期時間,證書發佈者,來自證書發佈者的數字簽名

證書的驗證:

  • 客戶端收到證書後會對簽名的頒發機構進行檢查,如果堆機構一無所知,瀏覽器會提示是否信任該證書頒發機構
  • 如果該機構是可信任的,客戶端會用簽名頒發機構的公鑰密鑰解密證書附帶的數字簽名,驗證證書的完整性和發送方的可靠性。

GET和POST比較

GET POST
用途 從服務器上獲取數據 向服務器上傳數據
請求行 GET /url HTTP/1.1 POST /url HTTP/1.1
請求體 沒有請求體 在首部後 以空行分割
參數 參數拼接在URL裏, 安全性較低,參數只能是ASCII,長度最大2048 參數放在請求體裏, 安全性較高,參數類型和長度均無限制
冪等性 瀏覽器退回和刷新無害 退回和刷新會重複提交

HTTP1.0 HTTP1.1 和 HTTP2.0的區別

HTTP1.0 HTTP1.1
連接 默認使用短連接 默認長連接, 支持流水線
緩存 主要以header裏的If-Modified-Since,Expires爲判斷 增加了Entity tag, If-Unmodified-Since, If-Match等更多的緩存控制策略
帶寬優化 header和body一起發送 支持只發送header信息, 如果服務器認爲客戶端有權限則返回100, 客戶端可繼續發送body, 無權限返回401, 則不需發送body, 節約帶寬。支持range範圍請求。
Host請求首部 無法訪問同一個服務器IP地址上的不同主機 支持Host頭域,可以訪問同一服務器的不同主機。
HTTP1.1 HTTP2.0
多路複用 客戶端在同一時間對同一域名的請求有一定數目限制 採用多路複用技術,給request加上id區分,一個連接可以併發處理多個request
首部壓縮 不支持header數據壓縮 支持header數據壓縮,且雙方同時維護更新一個首部字段表,從而避免首部重複傳輸
服務器推送 不支持 在客戶端請求數據時,服務器會把相關的數據一同發送。比如請求一個page.html頁面時,服務器會將script.js和style.css等一起發送。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章