第一部分. HTTP: 網路的基礎#
第 01 章. HTTP 概述#
關鍵字:
- MIME, URIs, URLs, URNs
- 交易:
- GET
- PUT
- DELETE
- POST
- HEAD
- 狀態碼
- 請求 / 響應消息:
- 開始行
- 標頭
- 內容類型標頭
- 內容長度標頭
- 主體 (可選,< 一個空行 (CRLF)> + < 主體 >)
- 連接:
- TCP/IP
- 連接、IP 地址和端口號
- 協議版本:
- 0.9
- 1.0
- 1.0+
- 1.1
- 2.0(HTTP-NG)
- 網路的架構組件
- 代理
- 緩存 (網路緩存或緩存代理)
- 閘道
- 隧道
- 代理 (Web 瀏覽器等)
第 02 章. URLs 和資源#
方案 (如何)、主機 (在哪裡)、路徑 (什麼)
[<scheme>://][<user>[:<password>]@]<host>[:<port>][/<path>][;<params>][?<query>][#<frag>]
- 參數 (Parameters),名稱 / 值對。
- 基本 URL:
<BASE>
HTML 標籤。將相對 URL 轉換為絕對 URL - 擴展 URL
- 主機名擴展 (
www.
.com
等) - 歷史擴展
- 主機名擴展 (
- 可疑字符
第 03 章. HTTP 消息#
要點:
- 交易方向:進站、出站
- 消息流:上游、下游
- 消息語法
- 請求消息
<method> <request-URL> <version> <headers> <entity-body>
- 響應消息
<version> <status-code> <reason-phrase> <headers> <entity-body>
- ?
- 版本 2.22 > 2.3
- 標頭延續行
- 方法: GET, PUT, POST, TRACE, OPTIONS, DELETE
- UA (用戶代理): UA-OS, UA-CPU 等。
- 標頭
- 一般標頭: Date: Tue, 3 Oct 1974 02:16:00 GMT
- 請求標頭: Accept: /
- 接受標頭
- 條件請求標頭
- 請求安全標頭
- 代理請求標頭
- 響應標頭: Server: Tiki-Hut/1.0
- 實體標頭: Content-Type: text/html; charset=iso-latin-1
- 內容標頭
- 實體緩存標頭
- 擴展標頭:
- 請求消息
另見
第 04 章。連接管理#
TCP 可靠數據管道
TCP 流被分段並通過 IP 數據包傳輸
保持 TCP 連接的正確性
一個 TCP 連接
<source-IP-address, source-port, destination-IP-address, destination-port>
- 使用 TCP 套接字編程
- s = socket(): 創建一個新的、未命名的、未附加的套接字。
- bind(s, ): 將本地端口號和接口分配給套接字。
TCP 性能考慮
- HTTP 交易延遲
- 性能重點領域
- 延遲確認
- TCP 慢啟動
- Nagle 算法和 TCP_NODELAY
- TIME_WAIT 累積和端口耗盡
- 串行交易延遲
並行連接
- 並行連接可能使頁面加載更快
- 並行連接並不總是更快
- 並行連接可能 “感覺” 更快
持久連接
持久連接與並行連接
HTTP/1.0 + 保持活動連接
- 保持活動操作
- 保持活動和愚蠢的代理
- 連接標頭和盲中繼
- 代理和逐跳標頭
代理連接黑客
HTTP/1.1 持久連接
管道連接
連接關閉的奧秘
- “隨意” 斷開連接
- 內容長度和截斷
- 連接關閉容忍度、重試和冪等性
- 優雅的連接關閉
另見
- http://www.w3.org/Protocols/HTTP/Performance/
- http://www.acm.org/sigcomm/ccr/archive/2001/jan01/ccr-200101-mogul.pdf
第二部分. HTTP 架構#
第 05 章。網頁伺服器#
網頁伺服器實現: HTTP, TCP
通用軟體網頁伺服器
網頁伺服器設備
嵌入式網頁伺服器
真正的網頁伺服器的工作
* 步驟 1: 接受客戶端連接
* 處理新連接
* 客戶端主機名識別 (反向 DNS)
* 通過 ident 確定客戶端用戶
* 步驟 2: 接收請求消息
* 消息的內部表示
* 連接輸入 / 輸出處理架構
* 步驟 3: 處理請求
* 步驟 4: 映射和訪問資源
* 文檔根 (文檔根)
* 虛擬主機文檔根
xml <VirtualHost www.marys-antiques.com> ServerName www.marys-antiques.com DocumentRoot /docs/mary TransferLog /logs/mary.access_log ErrorLog /logs/mary.error_log </VirtualHost>
* 用戶主目錄文檔根 (GET /~Bob/index.html
==> /home/Bob/index.html)
* 目錄列表
* 動態內容資源映射
ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-programs/ AddHandler cgi-script .cgi
* 伺服器端包含 (SSI)
* 訪問控制
* 步驟 5: 建立響應
* 響應實體
* MIME 類型
* mime.types
* 魔術類型
* 明確類型 (忽略文件擴展名或內容 (可能是魔術數字))
* 類型協商
* 重定向
* 永久 / 臨時移動的資源
* URL 增強
* 負載均衡
* 步驟 6: 發送響應
* 步驟 7: 日誌記錄
第 06 章。代理#
網頁中介
私人和共享代理
代理 (中介) 與閘道 (協議轉換器)
為什麼使用代理?
- 兒童過濾器
- 文檔訪問控制器
- 安全防火牆
- 網頁緩存
- 代理
- 內容路由器
- 轉碼器 (
*.gif
==>*.jpeg
等) - 匿名化器
代理的去向?
代理伺服器部署
* 出口代理 (成人內容)
* 訪問 (入口) 代理 (ISP 訪問代理:下載速度)
* 代理
* 網路交換代理
代理層次結構
- 進站
- 出站
- 父級
- 代理層次結構內容路由
代理如何獲取流量
- 修改客戶端 (代理插件)
- 修改網路 (攔截代理,如 GFW)
- 修改 DNS 命名空間
- 修改網頁伺服器
客戶端代理設置
-
手動配置
-
瀏覽器預配置
-
代理自動配置:代理自動配置 (PAC)
- 後綴: ".pac"
- MIME 類型: "application/x-ns-proxy-autoconfig"
-
客戶端代理配置:網頁代理自動發現協議 (WPAD)
- 動態主機發現協議 (DHCP)
- 服務位置協議 (SLP)
- DNS 知名主機名
- DNS SRV 記錄
- DNS 服務 URI 在 TXT 記錄中
-
代理請求的棘手問題
- 代理 URI 與伺服器 URI 不同
- 伺服器請求、明確代理請求、代理 (反向代理) 請求、攔截代理請求
-
虛擬主機的相同問題 (index.html ==> bob/index.html? 或 tom/index.html?)
-
攔截代理獲取部分 URI
-
代理可以處理代理和伺服器請求
-
在途 URI 修改
- URI 客戶端自動擴展和主機名解析
- 無代理的 URI 解析
- 使用明確代理的 URI 解析
- 使用攔截代理的 URI 解析
追蹤消息
- Via 標頭
- Via 語法
- Via 請求和響應路徑
- Via 和閘道
- 伺服器和 Via 標頭
- Via 的隱私和安全影響
- TRACE 方法
- Max-Forwards
代理身份驗證
代理互操作
處理不支持的標頭和方法
- OPTIONS: 發現可選功能支持
允許標頭
第 07 章。緩存#
冗餘數據傳輸
帶寬瓶頸
閃電人潮
距離延遲
命中和未命中 (命中、未命中、重新驗證 (新鮮度檢查))
- 緩存命中
- 緩存未命中
- 重新驗證命中 (慢命中)
- 重新驗證未命中
使用 If-Modified-Since 重新驗證請求
- ==> 重新驗證命中: 304 (未修改) 響應 ("仍然新鮮")
- ==> 重新驗證未命中:正常 HTTP 200 OK 響應 + 完整內容,
命中率 / 比例 (請求的比例)
字節命中率
區分命中和未命中
緩存拓撲
- 私有緩存 (Firefox:
about:cache
) - 共享公共緩存 (公共代理緩存)
代理緩存層次結構
緩存網格、內容路由和對等 (兄弟緩存)
緩存處理步驟
- 步驟 1: 接收
- 步驟 2: 解析
- 步驟 3: 查找
- 步驟 4: 新鮮度檢查
- 步驟 4: 新鮮度檢查
- 步驟 5: 響應創建
- 步驟 6: 發送
- 步驟 7: 日誌記錄
緩存處理流程圖
保持副本新鮮
- 文檔過期
- Cache-Control: max-age=<max-age (秒)>
- Expires: <日期>
- 伺服器重新驗證
- 使用條件方法重新驗證 (條件請求)
- If-Modified-Since: <日期>
- If-None-Match: ETags (實體標籤)
弱和強驗證器
何時使用實體標籤和最後修改日期
控制緩存性
- No-Cache 和 No-Store 響應標頭
- Cache-Control: no-store
- Cache-Control: no-cache # (可能在本地緩存)
- Pragma: no-cache
- Max-Age 響應標頭
- Cache-Control: max-age=3600
- Cache-Control: s-maxage=3600 # 共享 (公共) 緩存
- Expires 響應標頭
- Expires: <日期>
- Must-Revalidate 響應標頭
- Cache-Control: must-revalidate
- 啟發式過期
- LM-Factor 算法
- 客戶端新鮮度約束
- Max-Age 響應標頭
- 客戶端新鮮度約束
設置緩存控制
- 使用 Apache 控制 HTTP 標頭
- mod_headers (mod_headers 模塊)
<Files *.html> Header set Cache-control no-cache </Files>
- mod_expires
- ExpiresDefault M86400
- ExpiresByType text/html "修改加 2 天 6 小時 12 分鐘"
- mod_cern_meta
- mod_headers (mod_headers 模塊)
- 通過 HTTP-EQUIV 控制 HTML 緩存
詳細算法
- 年齡和新鮮度壽命
- 年齡計算
- 明顯年齡基於 Date 標頭
- 逐跳年齡計算
- 補償網路延遲
- 新鮮度壽命計算
...
緩存和廣告
- 廣告商的困境
- 出版商的回應 (緩存破壞)
日誌遷移
第 08 章。整合點:閘道、隧道和中繼#
客戶端和伺服器端閘道
/
協議閘道
- HTTP/*: 伺服器端網頁閘道
- HTTP/HTTPS: 伺服器端安全閘道
- HTTPS/HTTP: 客戶端安全加速閘道
資源閘道
- 通用閘道介面 (CGI)
- 伺服器擴展 API
應用介面和網頁服務
隧道
- 使用 CONNECT 建立 HTTP 隧道 (原始字節中繼)
- CONNECT 請求
CONNECT home.netscape.com:443 HTTP/1.0
User-agent: Mozilla/4.0 - CONNECT 響應
- 數據隧道、計時和連接管理
- SSL 隧道
- SSL 隧道與 HTTP/HTTPS 閘道
- 隧道身份驗證
- 隧道安全考慮
中繼
第 09 章。網頁機器人#
爬蟲和爬行
從哪裡開始: “根集”
- 被困 — 孤立,
提取鏈接和標準化相對鏈接
- 循環和重複
麵包屑的痕跡
- 樹和哈希表
- 有損存在位圖
- 檢查點
- 分區
別名和機器人循環
- 標準化 URL
- 文件系統鏈接循環
- 動態虛擬網頁空間
避免循環和重複
- 標準化 URL
- 廣度優先爬行
- 限制
- 限制 URL 大小
- URL / 網站黑名單
- 模式檢測 (
/subdir/subdir/subdir...
) - 內容指紋識別
- 人工監控
機器人 HTTP
- 識別請求標頭
- 虛擬主機
- 條件請求
- 響應處理
- 狀態碼
- 實體
- 用戶代理目標
行為不當的機器人
- 失控的機器人
- 過時的 URL
- 長的錯誤 URL
- 好奇的機器人
- 動態閘道訪問
排除機器人
- 機器人排除標準 (robots.txt)
- 網站和 robots.txt 文件
- 檢索
robots.txt
並檢查響應碼 - robots.txt 文件格式
User-Agent: <robot-name> # 不區分大小寫的機器人名稱子串
- 不允許 / 允許前綴匹配
- 其他 robots.txt 智慧
robots.txt 的緩存和過期
機器人排除 Perl 代碼
HTML 機器人控制 META 標籤
NOINDEX, NOFOLLOW, INDEX, FOLLOW, NOARCHIVE, ALL, NONE
機器人禮儀
第 10 章. HTTP-NG#
HTTP 的成長痛苦
HTTP-NG 活動 = HTTP: 下一代 (HTTP-NG)
模組化和增強
- 層 {1..3}
- 分佈式對象
- 層 1: 消息傳遞 (WebMUX)
- 層 2: 遠程調用 (二進制線協議)
- 層 3: 網頁應用
第三部分。識別、授權和安全#
第 11 章。客戶端識別和 Cookies#
個人化觸感
- HTTP 標頭
- 客戶端 IP 地址
- 用戶登錄 (不久,Fred 將放棄互聯網,回去看 Oprah...)
- 瘦 URL
- 醜陋的 URL
- 不能共享 URL
- 破壞緩存
- 額外伺服器負載
- 逃生口 (可能會丟失購物車)
- 在會話之間不持久
- Cookies
- Cookies 類型:會話和持久
- Cookies 的工作原理
- Cookie 罐:客戶端狀態
- 域
- allh
- 路徑
- 安全
- 過期
- 名稱
- 值
- 不同網站的不同 Cookies (
Set-Cookie: key=val
, Cookie: key=value)
- Cookie 域屬性:
domain=<SITE>
, 例如 "www.jianshu.com" - Cookie 路徑屬性:
path=/autos/
- Cookie 成分
- 版本 0 (Netscape) Cookies
- 版本 1 (RFC 2965) Cookies
- Cookies 和會話跟踪
- Cookies 和緩存
- 如果文檔不可緩存,則標記文檔
- 對緩存 Set-Cookie 標頭要謹慎
- 對帶有 Cookie 標頭的請求要謹慎
- Cookies、安全性和隱私
第 12 章。基本身份驗證#
- 身份驗證
- 身份驗證協議和標頭
- 安全領域
- 基本身份驗證
- 挑戰 / 響應
- 挑戰 (伺服器到客戶端):
WWW-Authenticate: Basic realm=<quoted-realm>
- 響應 (客戶端到伺服器):
Authorization: Basic <base64-username-and-password>
- Base-64 用戶名 / 密碼編碼: BASE64ENC (:)
- 代理身份驗證
網頁伺服器 | 代理伺服器 |
---|---|
未授權狀態碼: 401 | 未授權狀態碼: 407 |
WWW-Authenticate | Proxy-Authenticate |
授權 | Proxy-Authorization |
身份驗證信息 | Proxy-Authentication-Info |
- 基本身份驗證的安全缺陷
第 13 章。摘要身份驗證#
摘要身份驗證的改進
- 傳輸層安全性 (TLS)
- 安全 HTTP (HTTPS)
使用摘要保持密碼秘密
單向摘要
-
摘要函數的別名 =
加密檢查和和
,單向哈希函數
或指紋函數
-
MD5
輸入 | MD5 摘要 |
---|---|
“Hi” | C1A5298F939E87E8F962A5EDFC206918 |
“bri!” | BEAAA0E34EBDB072F8627C038AB211F8 |
“3.1415926535897” | 475B977E19ECEE70835BC6DF46F4F6DE |
使用隨機數防止重放
- 一個稱為
隨機數
的特殊令牌
摘要身份驗證握手
- 挑戰、隨機數、算法...
摘要計算#
摘要算法輸入數據
摘要是從三個組件計算得出的:
- 一對函數,由單向哈希函數 H (d) 和摘要 KD (s,d) 組成,其中 s 代表秘密,d 代表數據
- 一塊包含安全信息的數據,稱為 A1,包括秘密密碼
- 一塊包含請求消息的非秘密屬性數據,稱為 A2
這兩塊數據 A1 和 A2 由 H 和 KD 處理以產生摘要。
H() = MD5()
KD(,) = H(concatenate(:))
qop: 保護質量
: HTTP 請求方法
: 請求行中的請求 URI
nc: 隨機數計數
與安全相關的數據 (A1)
算法 | A1 |
---|---|
MD5 | A1 = :: |
MD5-sess | A1 = MD5(::):: |
消息相關數據 (A2)
| qop | A2 |
| undefined | : |
| auth | : |
| auth-int | :() |
整體摘要算法
- 舊的和新的摘要算法
| qop | 摘要算法 | 備註 |
| :---: | :---: | :---: |
| undefined | KD(H(A1), (A2)) | 已棄用 |
| auth 或 auth-int | KD (H (A1), :::(A2)) | 優選 | - 展開的摘要算法備忘單
| qop | 算法 | 展開算法 |
| :---: | :---: | :---: |
| undefined | , MD5, MD5-sess | MD5(MD5(A1):(A2)) |
| auth | , MD5, MD5-sess | MD5(MD5(A1)::::(A2)) |
| auth-int | , MD5, MD5-sess | MD5(MD5(A1)::::(A2)) |
摘要身份驗證會話
預先授權
- 下一個隨機數預生成
- 限制隨機數重用
- 同步隨機數生成
隨機數選擇
- RFC 2617 建議,隨機數 = BASE64 (時間戳 H (時間戳 ":" ETag ":" 私鑰))
- ETag: 與請求實體相關的 HTTP ETag 標頭
對稱身份驗證
- 按算法定義 A2 (請求摘要)
| qop | A2 |
| :---: | :---: |
| undefined | : |
| auth | : |
| auth-int | :() | - 按算法定義 A2 (響應摘要)
| qop | A2 |
| :---: | :---: |
| undefined | : |
| auth | : |
| auth-int | :() |
保護質量增強
- 使用 qop 是可選的,但僅用於向後兼容舊的 RFC 2069 規範。
消息完整性保護
摘要身份驗證標頭
實際考慮
- 多重挑戰
- 錯誤處理
- 保護空間
- 重寫 URI
- 緩存
安全考慮
- 標頭篡改
- 重放攻擊
- 多重身份驗證機制
- 字典攻擊
- 敵對代理和中間人攻擊
- 選擇明文攻擊
- 存儲密碼
第 14 章。安全 HTTP#
使 HTTP 安全
HTTPS
數字加密:秘密編碼的藝術與科學
密碼
對稱密鑰加密
- (e=k),編碼 = 解碼
- P = D(C, d)
- DES、Triple-DES、RC2 和 RC4
- 密鑰長度和枚舉攻擊