前言
1. http和tcp有什麼區別和聯絡?
2. http報文格式是什麼樣的?
3. http常用的頭部欄位分別代表什麼含義?
4. http常用的狀態碼分別代表什麼含義?
5. https提供了哪些機制保證安全?
6. websocket解決了http的什麼弊端?
目錄
http相關基本概念
http報文
http響應狀態碼
http安全-https
http認證
websocket協議
一. 基本概念
1. 概述
- web理念:文件之間相關關聯,連成可相互參閱的全球資訊網(www)
- web互連(通訊)的基礎:tcp/ip協議族,http屬於它內部的子集
- web(www)的三項構建技術:
- html:頁面使用什麼語言展示
- URL:頁面在什麼位置
- http:文件之間傳遞的協議是什麼
- tcp/ip協議族分層包括:資料鏈路層,網路層,傳輸層 ,應用層
- tcp/ip協議族分層作用:各層各司其職,模組劃分清晰,便於維護,解耦
2. 各分層概述
2.1 應用層
- 決定了向使用者提供應用服務時通訊的活動
- 包括:FTP,DNS,HTTP等
2.2 傳輸層
- 提供網路中兩臺計算機之間的資料傳輸
- 包括:TCP,UDP
2.3 網路層
- 眾多選項中選擇合適的傳輸路徑傳輸資料包
2.4 鏈路層
- 用來處理網路的硬體部分
3. tcp/ip資料傳輸方式
- 利用tcp/ip協議族通訊時,通過分層順序通訊。
- 傳送端從應用層往下走,接收端從應用層往上走
- 傳送端每經過一層都會被打上該層所屬的首部資訊,接收端每經過一層將把首部去掉
4. 與http協議密不可分的協議
4.1 IP協議
- 位於網路層
- 作用是把各種資料包傳送給對方
- 確保傳送正確的兩個條件
- IP地址:指明瞭節點被分配到的地址。可變。
- MAC地址:網路卡所屬的固定地址。不可變。
4.2 TCP協議
- 位於傳輸層
- 作用是提供可靠的位元組流服務
- 位元組流服務:將大塊資料分割成以報文段為單位的資料包
- 可靠:採用三次握手策略
4.3 DNS協議
- 應用層協議
- 作用是提供域名到ip地址之間的解析服務
4.4 各種協議的關係
4.5 http協議和tcp協議的區別與聯絡
區別
- 所屬協議層不同:tcp屬於傳輸層,http屬於應用層
- 職責不同:tcp解決資料傳輸問題,http解決資料包裝問題
聯絡
- http協議是構建在tcp協議之上的
- 打個比方:ip是高速公路,tcp是跑在高速公路上的卡車,http是卡車裡面的包裹
5. URL與URI
- URL:統一資源定位符,資源的地址。是URI的子集
- URI:統一資源識別符號,用字串標識某一網際網路資源
- URI的格式
6. 應用程式劃分
- 客戶端:請求資源的一端
- 服務端:提供資源響應的一端
- 代理:有轉發功能的應用程式,位於客戶端和伺服器的中間人角色
- 作用:快取,訪問控制
- 閘道器:轉發其他伺服器通訊資料的伺服器。與代理類似,不過閘道器能使通訊線路上的伺服器提供非http協議服務
- 作用:提高安全性:客戶端與閘道器之間的通訊線路加密
- 隧道:客戶端與服務端建立一條特殊通訊線路,使用ssl等手段加密,提高安全性
二. HTTP報文
1. 概述
- 用於http協議互動的資訊被稱為報文
- 報文分為請求報文和響應報文
- 報文首部欄位包括很多維度:內容編碼,分塊傳輸,多部分物件集合,範圍請求,內容協商等
2. 報文格式
- 報文由報文首部和報文主體兩部分組成,中間由空行分開
- 請求行:包含請求方法(get,post),請求URI,http版本
- 狀態行:響應結果狀態碼,原因,http版本
- 首部欄位:通用首部,實體首部,請求首部,響應首部
- 其他:cookie等資訊
3. 內容編碼
- 指明內容等編碼格式,客戶端負責解碼
- 能有效地處理大量等訪問請求,不過會消耗更多cpu
- 常用的內容編碼
- gzip(GNU zip)
- compress(unix系統標識壓縮)
- deflate(zlib)
- identity(不編碼)
4. 分塊傳輸
- 把實體主體分塊的功能
- 用於傳輸大容量資料
- 每一塊都標記大小,最後一塊用0標記
5. 多部分物件集合
- 傳送一份報文主體內可包含多型別實體
- 使用時需要在首部欄位裡新增:Content-type
- 包含的物件如下(content-type的值):
- multipart/form-data:web表單檔案上傳時使用
- multipart/byteranges:響應報文包含多個範圍的內容時使用
6. 範圍請求
- 指定範圍傳送的請求
- 解決網路中斷必須從頭下載的問題
- 用到首部欄位Range指定資源的byte範圍:Ranges:bytes=5001-10000
- 響應會返回206狀態碼和響應報文
7. 內容協商
- 客戶端和服務端就響應內容進行交涉,提供最合適的資源
- 協商判斷的依據有:響應資源的語言,字符集,編碼方式
- 包含的首部欄位:Accept,Accept-Charset,Accept-Encoding,Accept-Language,Content-Language
三. 響應狀態碼
1. 概述
- 描述請求的處理結果
- 狀態碼的類別
狀態碼 類別 描述 1XX 資訊性狀態碼 接收的請求正在處理 2XX 成功的狀態碼 請求正常處理完畢 3XX 重定向狀態碼 需要進行附加操作以完成請求 4XX 客戶端錯誤狀態碼 伺服器無法處理請求 5XX 伺服器錯誤狀態碼 伺服器處理請求出錯
2. 2XX成功
- 200: OK:正常處理
- 204: No Content,伺服器接受的請求成功處理,但返回但響應報文不包含主體部分
- 206: Partial Content,伺服器成功執行客戶端的範圍請求,響應報文中包含Content-Range指定範圍的內容
3. 3XX重定向
-
301: 永久性重定向,表示請求的資源已經分配了新的uri,以後應使用新的uri
-
302: 臨時性重定向,表示請求的資源uri臨時性被移動
-
303: 指明客戶端應該用Get方法去請求,而不是post
當301, 302, 303狀態碼返回時,幾乎所有瀏覽器都會把Post改為Get,並刪除請求報文的主體,之後請求會自動再次傳送
-
304: Get請求中含有附加條件時,請求的資源不滿足這些條件。這些附加條件包括:If-Math,If-Modified-Since,If-None-Match,If-Range,If-UnModified-Since中的任意一個
-
307:臨時重定向,類似302,不過不會從post變為get
4. 4XX客戶端錯誤
- 400:請求報文中存在語法錯誤
- 401: 使用者認證失敗
- 403: 無許可權訪問
- 404: 無法找到請求的資源,url不存在
5. 5XX服務端錯誤
- 500: 伺服器處理出錯,可能是內部的bug
- 502: 錯誤的閘道器,資源傳送給上游伺服器時傳送不了
- 503: 伺服器處理高負載或停機維護狀態,無法處理請求
四. Http首部
1. 首部欄位的格式
- 首部欄位名:欄位值(可為多個)
- 單值:Content-Type: text/html
- 多值:Keep-Alive:timeout=15, max=100
- 首部欄位重複,規範裡沒有明確規定如何處理,各個瀏覽器不同
2. 首部欄位分類
- 通用首部欄位:請求和響應都使用的欄位
- 請求首部欄位:客戶端資訊,請求的附加資訊等
- 響應首部欄位:響應的附加資訊
- 實體首部欄位:請求和響應的實體部分使用的欄位
3. 首部欄位概覽
- http1.1共規定裡47中首部欄位
3.1 通用首部欄位有:
- Cache-Control:控制快取的行為
- Connection:連線的管理
- Keep-Alive:維持持續連線(http1.1預設持久連線,之前版本沒有)
- close:表示關閉持久連線
- 其他首部欄位:表示這個首部欄位不再轉發給代理伺服器
- Date:建立時間
- Pragma:報文指令
- http1.0及向前版本的相容欄位
- Trailer:報文末端的首部
- Transfer-Encoding:報文主體傳輸編碼方式
- http1.1僅對分塊傳輸有效
- Upgrade:升級為其他協議
- Via:代理伺服器相關資訊
- Warning:錯誤通知
3.2 常用的請求首部欄位有:
- Accept:使用者代理可處理的媒體型別
- Accept-Charset:優先的字符集
- Accept-Encoding:優先的內容編碼
- gizp
- compress
- deflate
- identity
- Accept-Language:優先的語言
- Authorization:web認證資訊
- Host:請求資源的伺服器
- User-Agent:客戶端程式資訊
- Range:欄位範圍請求
- Referer:請求的原始資源的URI
3.3 常用的響應首部欄位有:
- Accept-Ranges:是否接受欄位範圍請求
- Age:推算欄位建立經過時間
- Server:伺服器的安裝資訊
- Retry-After:再次發起請求的時機要求
3.4 常用的實體首部欄位有:
- Allow:可支援的http方法
- Content-Encoding:實體主體的編碼方式
- Content-Language:實體主體的自然語言
- Content-Length:實體主體大小
- Content-Type:實體主體的媒體型別
- Expires:過期時間
- Last-Modified:最後修改時間
3.5 其他首部欄位
- Cookie:請求首部欄位,伺服器收到客戶端傳來的cookie
- Set-Cookie:響應欄位,伺服器傳給客戶端的cookie。包含的屬性:
- name=value:cookie的名稱和值
- expires:有效期,不指定則預設為瀏覽器關閉時
- path:伺服器上的檔案目錄作為Cookie的適用物件
- domain:cookie適用物件的域名
- Secure:僅在https安全通訊時才會傳送cookie
- HttpOnly:Cookie不能被javascript指令碼訪問
- Connection
- Keep-Alive
五. HTTPS
1. http的缺點
- 通訊適用明文(不加密),內容可能會被竊聽
- 不驗證通訊方的身份,可能遭遇偽裝。典型如:DOS攻擊
- 無法證明報文的完整性,內容可以被篡改。典型如:中間人攻擊(MITM)
2. 解決策略
2.1 防止被竊聽的對策
- 內容的加密:將http報文所含的內容進行加密。該方案的缺點:
- 需要客戶端和伺服器都有加密和解密機制
- 內容也有被篡改的風險
- 通訊的加密:http協議中沒有加密機制,通過和SSL,TLS組合使用,加密http的通訊內容。SSL在客戶端和伺服器建立安全的通訊線路。
2.2 防止偽裝的對策
- SSL提供的證照,可以作為通訊雙方身份認證的功能
2.3 防止內容被篡改的策略
- SSL提供的摘要功能可以解決
3. HTTPS
3.1 概述
- https = http + 加密 + 認證 + 完整性保護
- https並非應用層新協議,只是通訊介面部分用SSL和TLS協議代替而已
- http直接和tcp通訊。使用ssl時,http先和ssl通訊,再由ssl和tcp通訊
3.2 常用的加密方式
共享金鑰加密
- 也叫對稱金鑰加密,加密和解密用同一個金鑰
- 缺點:無法安全的將金鑰傳送給接收方
公開金鑰加密
- 使用一對非對稱的金鑰,一把交私有金鑰,一把交公開金鑰。
- 傳送密文的一方使用對方的公開金鑰進行加密,對方收到加密資訊後用自己的私鑰解密
- 不需要傳送私鑰,不用擔心資訊被竊取
- 要根據密文和公鑰恢復原文資訊,以目前的技術是非常困難的
- 缺點:處理速度較慢
3.3 https的加密方式
- 採用共享金鑰加密和公開金鑰加密兩種方式
- 交換金鑰環節採用公開金鑰加密
- 建立通訊之後,報文交換階段採用共享金鑰加密
3.4 數字證照
- 公開金鑰加密的問題:無法證明公開金鑰本身的正確性
- 解決方案:由數字證照機構和相關機構頒發的公開金鑰證照
3.5 為什麼不一直使用https
- 加密通訊會消耗更多的cpu和記憶體資源,伺服器處理的請求量會降低。所以一般非敏感資訊使用http,敏感資訊才使用https
- 購買證照的開銷比較大
六. http認證
1. 概述
http1.1使用的認證方式有:
- Basic認證
- Digest認證
- SSL客戶端認證
- FormBase認證
2. Basic認證
- http1.0就定義的認證方式
- 原理:將”使用者名稱:密碼”字串做base64加密,然後作為首部Authorization欄位的值傳給服務端
- 缺點:沒有加密,安全等級低
- 使用率:並不常用
3. Digest認證
- http1.1定義的認證,為了彌補basic認證的不足
- 原理:傳送方請求認證->接收方返回質詢碼->傳送方根據質詢碼計算響應碼發給接收方做驗證
- 優點:提供防止密碼被竊聽的保護機制
- 缺點:無法保證使用者被偽裝
- 使用率:仍達不到web網站安全要求,使用受限
4. SSL客戶端認證
- 藉助客戶端的證照完成認證
- 雙因素認證方式:密碼+證照。
- 使用率:客戶端證照需要一定費用,尚未普及
5. FormBase認證
- web應用程式各自實現的認證方式
- 使用率:web應用常用的認證方式
6. 狀態的管理
- http本身沒有狀態管理,每次請求並不知道上次請求內容
- 使用Cookie和Session作為狀態管理,彌補了http的不足
六. WebSocket協議
1. 概述
- 是html5提供的一種在單個tcp連線上進行全雙工通訊的協議
2. 為什麼會出現該協議?
http協議有以下弊端:
- 一條連線上只可以傳送一條請求
- 請求只能從客戶端開始,客戶端不可用接受除響應以外的指令
- 首部資訊沒有壓縮,延遲大
- 每次請求都要傳送冗長的首部資訊
- 可任意選擇壓縮格式,沒有強制壓縮
websocket協議為解決這些弊端而生。
3. websocket的特點
- 支援伺服器向客戶端推送資料的功能。伺服器可直接傳送資料,不用等待客戶端請求
- 減少通訊量:只要建立連線,就一直保持連線狀態。不僅連線開銷小,且首部資訊很少,減少通訊量
4. websocket通訊機制
- 在http建立連線後,需要完成一次“握手”步驟
- 附加頭資訊中新增"Upgrade: WebSocket",表明這是一個申請協議升級的 HTTP 請求
- Sec-WebSocket-Key:記錄握手過程中的鍵值
- Sec-WebSocket-Protocol:記錄使用的子協議
參考文獻
《圖解http》