TA

TA

HTTP - 終極指南

第一部分. 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 架構#

第 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
  • 通過 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)

模組化和增強

第三部分。識別、授權和安全#

第 11 章。客戶端識別和 Cookies#

個人化觸感

  1. HTTP 標頭
  2. 客戶端 IP 地址
  3. 用戶登錄 (不久,Fred 將放棄互聯網,回去看 Oprah...)
  4. 瘦 URL
  • 醜陋的 URL
  • 不能共享 URL
  • 破壞緩存
  • 額外伺服器負載
  • 逃生口 (可能會丟失購物車)
  • 在會話之間不持久
  1. 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-AuthenticateProxy-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
MD5A1 = ::
MD5-sessA1 = 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
  • 密鑰長度和枚舉攻擊
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。