《圖解HTTP》讀書筆記
TITLE:《圖解HTTP》
AUTHOR:上野宣
TRANSLATOR:于均良
SHOP:http://csdn.com/
BUY:2017-11-03
READ:2017-11-10
NOTE:2017-11-25
INTENT:學習HTTP協議
TCP/IP協議簇分層:
應用層:
應用層決定了向用戶提供應用服務時通信的活動。
例如:HTTP,FTP 和 DNS
傳輸層:
傳輸層對上層應用層,提供處于網絡連接中的兩臺計算機之間的數據傳輸。
例如:TCP和UDP
網絡層:
網絡層用來處理在網絡上流動的數據包。
例如:IP協議
數據鏈路層:
用來處理連接網絡的硬件部分。
例如:操作系統、硬件的設備驅動、網卡
負責傳輸的IP協議
IP 協議的作用是把各種數據包傳送給對方。
使用ARP協議憑借 MAC地址進行通信,ARP是一種用以解析地址的協議,根據通信方的 IP 地址就可以反查出對應的 MAC 地址。
確保可靠性的TCP協議
TCP協議為了更容易傳送大數據才把數據分割,而且TCP協議能夠確認數據最終是否送達到對方。
負責域名解析的DNS服務
DNS 協議提供通過域名 查找IP地址,或逆向從IP 地址反查域名的服務。
各種協議與 HTTP 協議的關系
HTTP協議的內容:
在兩臺計算機之間使用HTTP協議通信時,在一條通信線路上必定有一端是客戶端,另一端則是服務器端。
通過請求和響應的交換達成通信。
告知服務器意圖的 HTTP 方法
HTTP報文
請求報文
響應報文
通用首部字段:
請求首部字段:
響應首部字段:
實體首部字段:
返回碼:
提升編碼傳輸速率:
持久連接
管線化
代理
代理是一種有轉發功能的應用程序,它扮演了位于服務器和客戶端“中間人”的角色,接收由客戶端發送的請求并轉發給服務器,同時也接收服務器返回的響應并轉發給客戶端。
壓縮傳輸的內容編碼
- gzip(GNU zip)
- compress(UNIX 系統的標準壓縮)
- deflate(zlib)
- identity(不進行編碼)
分割發送的分塊傳輸編碼
在傳輸大容量數據時,通過把數據分割成多塊,能夠讓瀏覽器逐步顯示頁面。
使用 Cookie 的狀態管理
HTTP安全性和HTTPS協議:
HTTP安全性的缺陷
- 通信使用明文(不加密),內容可能會被竊聽
- 不驗證通信方的身份,因此有可能遭遇偽裝
- 無法證明報文的完整性,所以有可能已遭篡改
HTTP + 加密 + 認證 + 完整性保護 = HTTPS
HTTPS 是身披 SSL 外殼的 HTTP
共享密鑰加密
公開密鑰加密
HTTPS采用混合加密機制
證明公開密鑰正確性的證書
[圖片上傳失敗...(image-9e4651-1511602975677)]
由自認證機構頒發的證書稱為自簽名證書
HTTPS 通信步驟
步驟 1: 客戶端通過發送 Client Hello 報文開始 SSL通信。報文中包 含客戶端支持的 SSL的指定版本、加密組件(Cipher Suite)列表(所使用的加密算法及密鑰長度等)。
步驟 2: 服務器可進行 SSL通信時,會以 Server Hello 報文作為應 154 答。和客戶端一樣,在報文中包含 SSL版本以及加密組件。服務器的加密組件內容是從接收到的客戶端加密組件內篩選出來的。
步驟 3: 之后服務器發送 Certificate 報文。報文中包含公開密鑰證書。
步驟 4: 最后服務器發送 Server Hello Done 報文通知客戶端,最初階段的 SSL握手協商部分結束。
步驟 5: SSL第一次握手結束之后,客戶端以 Client Key Exchange 報 文作為回應。報文中包含通信加密中使用的一種被稱為 Pre-master secret 的隨機密碼串。該報文已用步驟 3 中的公開密鑰進行加密。
步驟 6: 接著客戶端繼續發送 Change Cipher Spec 報文。該報文會提示服務器,在此報文之后的通信會采用 Pre-master secret 密鑰加密。
步驟 7: 客戶端發送 Finished 報文。該報文包含連接至今全部報文的整體校驗值。這次握手協商是否能夠成功,要以服務器是否能夠正確 解密該報文作為判定標準。
步驟 8: 服務器同樣發送 Change Cipher Spec 報文。
步驟 9: 服務器同樣發送 Finished 報文。
步驟 10: 服務器和客戶端的 Finished 報文交換完畢之后,SSL連接 就算建立完成。當然,通信會受到 SSL的保護。從此處開始進行應用 層協議的通信,即發送 HTTP 請求。
步驟 11: 應用層協議通信,即發送 HTTP 響應。
步驟 12: 最后由客戶端斷開連接。斷開連接時,發送 close_notify 報 文。
上圖做了一些省略,這步之后再發送 TCP FIN 報文來關閉與 TCP 的通信。