零.額外的常識
OSI(Open System Internetwork)參考模型:
- 應用層
給應用程序提供網絡通信接口
-
表示層
-
會話層
-
傳輸層
數據傳輸單元是報文
- 網絡層
數據傳輸單元是分組
- 數據鏈路層
數據傳輸單元是幀
- 物理層
數據傳輸單元是比特 bit
OSI7 層是用來研究的理論模型,實際應用起來太繁瑣,所以有了 TCP/IP 參考模型:
P.S.此處的 TCP/IP 指協議體系,或者說是協議族,包含各種網絡協議,如 SNMP、ICMP、UDP、DNS 等等
- 應用層
如 HTTP、FTP、DNS
- 傳輸層
如 TCP、UDP
- 網絡層
如 IP
- 數據鏈路層
HTTP 是應用層協議,內部是傳輸層的 TCP 和網絡層的 IP,所以 HTTP 也需要三次握手、四次揮手
所以存在建立/釋放連接的消耗,作為性能優化 HTTP/1.1 版本默認都是持久連接,而 HTTP/1.0 並沒有
此外,有必要簡單區分一些概念:
- 代理
一種有轉發功能的應用程序
- 網關
轉發其它服務器通信數據的服務器
- 隧道
能夠保持 Client 與 Server 之間的通信連接的應用程序
- 隧道
一.URI 與 URL
-
URI(Uniform Resource Identifier):統一資源標識符,用來標識特定互聯網資源的字符串
-
URL(Uniform Resource Locator):統一資源定位符,用來標識特定互聯網資源的地點的字符串
URL 中必不可少的是模式(Scheme)、主機名(Host)和資源路徑(URL Path)
所以 URL 是 URI 的子集,或者說 URL 是 URI 的一部分
二.HTTP 方法
- GET:獲取資源
1.0/1.1 支持,常用
- POST:傳輸實體主體
1.0/1.1 支持,常用
- PUT:傳輸文件
1.0/1.1 支持,一般網站不使用該方法,因為 PUT 方法自身不帶驗證機制,任何人都可以上傳文件,存在安全性問題
- HEAD:獲取報文首部
1.0/1.1 支持,常用
- DELETE:刪除文件
1.0/1.1 支持,存在與 PUT 方法相同的問題
- OPTIONS:詢問支持的方法
1.1 支持
- TRACE:追蹤路徑
1.1 支持,配合 Max-Forward 首部字段檢查路徑
- CONNECT:要求用隧道協議連接代理
1.1 支持,配合 SSL(Secure Sockets Layer 安全套接層)、TLS(Transport Layer Security 傳輸層安全)實現用隧道進行 TCP 通信
- (LINK):建立和資源之間的聯繫
1.0 支持,已被 1.1 廢棄
- (UNLINK):斷開連接關係
1.0 支持,已被 1.1 廢棄
三.HTTP 狀態碼
- 1XX:Informational(信息性狀態碼)
接收的請求正在處理
- 101:Switching Protocol,切換協議,配合 Upgrade 首部字段請求切換協議,不是很常見
- 2XX:Success(成功狀態碼)
請求正常處理完畢
- 200:OK,請求正常處理
- 204:No Content,請求處理成功但沒有資源可返回(響應體為空)
- 206:Partial Content,請求部分內容,響應頭中的 Content-Range 表明範圍
- 3XX:Redirection(重定向狀態碼)
需要進行附加操作以完成請求
- 301:Moved Permanently,永久性重定向,瀏覽器應該自動更新書簽
- 302:Found,臨時性重定向,不更新書簽
- 303:See Other,類似於 302,但要求用 GET 方法訪問新 URL
注意:規範要求是遇到 301、302 不改變請求方法(本來是 POST 就接著用 POST),但*事實標準*是幾乎所有瀏覽器遇到 301、302、303 都會改用 GET 方法,這與規範不符
- 304:Not Modified,找到了資源,但不滿足請求條件(If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since)
注意:雖然 304 屬於 3XX,但是*和重定向沒關係*
- 307:Temporary Redirection,臨時重定向,與 302 意義一樣
為了糾正事實標準推出的狀態碼,希望嚴格遵守 302 不要改變方法,結果現在瀏覽器並不一定會這麼做,標準再次失敗
- 4XX:Client Error(客戶端錯誤狀態碼)
服務器無法處理請求
- 400:Bad Request,請求報文存在語法錯誤
- 401:Unauthorized,表示需要認證(BASIC 認證或者 DIGEST 認證)或者認證失敗
- 403:Forbidden,對指定資源的訪問請求被拒絕
- 404:Not Found,服務器無法找到請求的資源,可以代替不想說明理由的 403 響應
- 405:Method Not Allowed,方法不支持,不是很常見
- 412:Precondition Failed,前提失敗,不是很常見
- 417:Expectation Failed,期望失敗,不是很常見
- 5XX:Server Error(服務器錯誤狀態碼)
服務器處理請求出錯
-
500:Internal Server Error,服務器在執行請求時發生了錯誤
-
503:Service Unavailable,服務器超負載或者正在維護
四.HTTP 報文首部
HTTP 報文首部 = 報文首部 + 空行(CR+LF) + 報文主體
= 起始行(請求行/狀態行) + 首部 + 空行 + 報文主體
= 起始行 + 請求/響應首部字段 + 通用首部字段 + 實體首部字段 + 空行 + 報文主體
P.S.不要小看這個空行(CR+LF),HTTP 首部注入攻擊的存在就是因為有這個空行
1.起始行
起始行分為請求行和狀態行(分別對應 HTTP 請求報文和響應報文):
-
請求行:說明請求使用的方法、URI 和 HTTP 版本
-
狀態行:說明返回響應的 HTTP 版本和狀態碼
2.首部字段
| 首部字段名 | 說明 |
|---|---|
| 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* | Web 認證信息 |
| TE | 傳輸編碼的優先級 |
| User-Agent | HTTP 客戶端程序的信息 |
| 首部字段名 | 說明 |
|---|---|
| Accept-Ranges | 是否接受字節範圍請求 |
| Age | 推算資源創建經過時間 |
| ETag | 資源的匹配信息 |
| Location | 另客戶端重定向至指定 URI |
| Proxy-Authenticate | 代理服務器對客戶端的認證信息 |
| Retry-After | 對再次發起請求的時機要求 |
| Server | HTTP 服務器的安裝信息 |
| Vary | 代理服務器緩存的管理信息 |
| WWW-Authenticate | 服務器對客戶端的認證信息 |
| 首部字段名 | 說明 |
|---|---|
| Cache-Control | 控制緩存的行為 |
| Connection | 逐跳首部、連接的管理 |
| Date | 創建報文的日期時間 |
| Pragma | 報文指令 |
| Trailer | 報文末端的首部一覽 |
| Transfer-Encoding | 指定報文主體的傳輸編碼方式 |
| Upgrade | 升級為其它協議 |
| Via | 代理服務器的相關信息 |
| Warning | 錯誤通知 |
| 首部字段名 | 說明 |
|---|---|
| Allow | 資源可支持的 HTTP 方法 |
| Content-Encoding | 實體主體適用的編碼方式 |
| Content-Language | 實體主體的自然語言 |
| Content-Length | 實體主體的大小(單位:字節) |
| Content-Location | 代替對應資源的 URI |
| Content-MD5 | 實體主體的報文摘要 |
| Content-Range | 實體主體的位置範圍 |
| Content-Type | 實體主體的媒體類型 |
| Expires | 實體主體過期的日期時間 |
| Last-Modified | 資源的最後修改日期時間 |
P.S.其它首部字段以及更詳細的首部字段信息請查看 博客園:HTTP 報文
參考資料:
- 《圖解 HTTP》
暫無評論,快來發表你的看法吧