首先整個HTTP的報文結構如下圖所示,我們這里主要專注于報文首部。
一. 請求報文首部
1. 請求報文首部結構:
(1)必須的:方法 | URI(發送方地址) | 協議版本
例如:
post | www.tom.org/form/entry | HTTP/1.1
(2)(請求首部字段(可選))
例如:
HOST:hack.jp(域名或IP地址)
Coonnection : keep-alive
Content-Type:application/x-www-form
2. HTTP方法
請求報文的第一項就是HTTP方法,常見的HTTP方法有:
(1)POST:傳輸實體主體
用來傳送較多的數據并需要服務器端對其處理,通常會修改數據。
(2)GET:獲取資源
用來請求訪問URI指定的資源,通常資源經過服務器端解析后返回響應主體。
POST和GET的區別:
- GET是冪等的,POST不是,所謂冪等是指請求多次和請求一次結果是相同的,原因是GET通常只讀數據,而不會寫數據(前提是多次請求之間數據本身沒有修改)。但POST可以通過別的輔助方式實現冪等,比如為每個請求加個唯一的id或版本號等。
- GET請求會被瀏覽器主動緩存,POST不會
- GET請求的參數只能通過URL傳遞,但是POST可以放在request body中(即可以通過報文主體傳遞);而且URL的長度通常都是有限的,但是POST就沒有這個限制;另外因為GET的參數暴露在URL上,所以沒有POST安全。
- GET產生一個數據包,POST產生兩個,GET:首部+實體數據 -> 返回 200 OK;POST:首部-> 返回100 continue,實體數據 -> 200 OK。
-但要注意GET和POST本質上都是TCP鏈接,并無差別,只是由于HTTP標準(RFC)的規定和服務器/瀏覽器的限制導致他們在應用過程中體現出了一些不同。
(3)PUT:傳輸文件
PUT用來傳輸文件,需要在請求報文的主體中包含文件內容,但由于存在安全問題,一般網站不使用該方法(或配合其他驗證使用)
(4)HEAD:獲得報文首部
HEAD方法和GET類似,只是不返回報文主體,用來確認URI的有效性及資源更新時間等。
(5)DELETE:刪除文件
用來按請求URI刪除指定的資源,與PUT相反,但同樣因為安全問題,如果不配合Web應用程序的驗證或遵守REST標準,一般很少單獨使用。
(6)OPTIONS:詢問支持的方法
咨詢針對指定(URI)資源支持的方法(如POST,GET)
(7)TRACE:追蹤路徑
讓服務器將之前的請求通信環回給客戶端,因為請求過程中可能會經過中轉,代理等的轉發以及修改,這個方法就是用來確認連接過程中發生的一系列操作,但不常用,而且容易引發XST(跨站追蹤)攻擊。
(8)CONNECT:要求用隧道協議連接代理
即:在于代理服務器通信時建立隧道,用協議(TLS和SSL)把內容加密后用隧道傳輸。
二. 響應報文首部
1. 響應報文首部結構:
響應報文首部的結構如下圖中例子所示:
主要由響應行和響應首部字段組成。
2. HTTP狀態碼
狀態碼 | 類別 | 原因短語 |
---|---|---|
1xx | Informational(信息性狀態碼) | 接受的請求正在處理 |
2xx | Success(成功狀態碼) | 請求正常處理完畢 |
3xx | Redirection(重定向狀態碼) | 需要進行附加操作以完成請求 |
4xx | Client Error(客戶端錯誤) | 服務器無法處理請求 |
5xx | Server Error(服務器錯誤狀態碼) | 服務器處理請求出錯 |
下面是一些常見的狀態碼:
(1)100 Continue 請求正在處理
(2)2xx 成功
- 200 OK : 成功
- 204 No Content : 成功但無內容
- 206 Partial Content : 成功響應部分請求
(3)3xx 重定向 - 301 Moved Permanently : 永久性重定向,應把地址改為新的URI
- 302 Found : 臨時性重定向
- 303 See Other : 和302類似,但要求用FET方法重發
- 304 Not Modified : 資源已找到,但未符合客戶端的附帶條件
- 305 Use Proxy : 必須通過代理訪問資源,代理的地址在Response的Location中
- 307 Temporary Redirect : 臨時重定向,與302類似
三. 首部字段
首部字段主要以鍵值對的形式給通信對象(瀏覽器或服務器)傳遞信息,如報文大小,語言等,是HTTP首部中很重要的一部分,其結構為:“首部字段名:字段值”;
HTTP首部字段分為請求首部,響應首部,通用首部和實體首部,下面將分別介紹。
1. 請求首部字段
- Accept:通知服務器用戶代理能處理的媒體類型及相對優先級(當不止一個時),優先級可用“q=?”來表示,0<q<1
- Accept-Charset:通知服務器支持的字符集及相對優先級
- Accept-Encoding:支持的內容編碼及優先級
- Accept-Language:能處理的自然語言及優先級
- Authorization:用來告訴服務器用戶代理的認證信息
- Expect:告知服務器期望出現的某種特定行為
- From:用戶的電子郵件地址
- Host:請求資源所處的主機名和端口號,唯一一個必須首部字段
- If-Match:當If-Match的值和ETag(實體標記)值匹配時,服務器才會接受請求
- If-Modified-Since:表示只接受這個時間以后更新的資源,太舊的不要
- If-None-Match:表示如果ETag值不匹配就采用這個值,與If-Match相反
- if-Range:表示如果資源與字段值(ETag或時間)匹配就返回范圍請求的內容,否則返回全部
- If-Unmodified-Since:表示如果資源在該事件之后發生過改變則不可以
- Max-Forwards:轉發的最大次數,每經過一次轉發就減一,當減為0時,停止轉發并相應
- Proxy-Authorization:給代理服務器發送認證質詢
- Range:范圍請求中指定資源的范圍,206表示成功響應范圍請求,200表示全部返回
- Referer:告知服務器請求的原始資源的URI
- TE:能處理響應的傳輸編碼方式及相對優先級
- User-Agent:創建請求的瀏覽器和用戶代理名稱等信息
2. 響應首部字段
- Accept-Ranges:none(無法處理范圍請求)/bytes(可處理范圍請求)
- Age:告知客戶端源服務器在多久前建立了響應
- Etag:每份資源的唯一標識,分為兩種:強ETag(任何細微變化都會改變其值)/弱ETag(僅資源發生根本改變才會變,附加“w/”)
- Location:新資源的位置
- Proxy-Authenticate:把代理服務器需要的信息發送給客戶端
- Retry-After:告知客戶端多久后再次嘗試,通常與503或3xx一起,可以是秒數,也可以是具體時間
- Server:服務器上安裝的HTTP服務器應用程序信息
- Vary:源服務器發送給代理服務器需要驗證的字段值,若字段符合要求則從代理返回緩存,否則從源請求返回。
- WWW-Authenticate:用于HTTP訪問認證,告知客戶端適用于訪問請求URI指定資源的認證方案
3. 通用首部字段
- Cache-Control:操作緩存的工作機制
- Connection:1.控制不再轉發的首部字段;2.管理持久連接(比如,Connection:Upgrade表示刪除Upgrade字段后再轉發)
- Date:表示報文創建時間
- Pragma:HTTP/1.0遺留,與Cache-Control:no-cache類似,表示不再接受緩存
- Trailer:事先說明在報文主體之后記錄了哪些首部字段
- Trans-Encoding:規定傳輸報文主體時采用的編碼方式
- Upgrade:檢測HTTP或其他協議是否可使用更高版本,或指定一個完全不同的通信協議,
- Via:通過附加經過的代理或網關的信息來追蹤傳輸路徑和避免請求回環。
- Warning:告知用戶一些與緩存相關問題的警告,格式為:[警告碼][警告主機:端口號][內容][時間(可選)]
4. 實體首部字段
- Allow:告知客戶端可使用的HTTP方法
- Content-Encoding:告知客戶端實體主體部分的編碼方式(gzip,compress,deflate,identity)
- Content-Language:實體主體的自然語言
- Content-Length:實體主體部分的大小
- Content-Location:報文主體的URI(有時為了符合要求,返回的資源并非請求的資源)
- Content-MD5:經過MD5算法加密后的主體的加密碼,用來驗證報文主體的完整性(但無法防止惡意修改)
- Content-Range:告知客戶端發送的報文內容的范圍(范圍請求)
- Content-Type:實體主體的媒體類型,編碼方式等
- Expires:緩存資源的失效日期(如果超過這個日期,就需要重新請求)。
- Last-Modified:告知客戶端,資源的最后修改時間
5. 其他首部字段
(1)為Cookie服務的首部字段
當前廣泛使用的Cookie是在網景公司制定的標準上進行擴展的產物,其作用是用戶識別和狀態管理,即保存用戶的身份信息,登錄時間等信息,為Cookie服務的首部字段是Set-Cookie,他有以下屬性:
- Name:Cookie的名稱和值,必須
- expires:Cookie有效期
- path:服務器上適用Cookie的文件目錄
- domin:Cookie適用域名(默認為創建的服務器的域名)
- Secure:僅在HTTP安全通信時才發送Cookie
- HTTPOnly:使Cookie不能被JavaScript訪問
(2)其他首部字段
- X-Frame-Options:屬于響應首部,用于控制網站內容在其他Web網站的Frame標簽中的顯示問題,主要是為了防止點擊劫持攻擊,其值有:DENY:拒絕;SAMEORIGIN:僅同源域名下的頁面允許被加載。
- X-XSS-Protextion:屬于響應首部字段,用于控制瀏覽器XSS(跨站腳本攻擊)防護機制的開關,"1"表示開啟。
- DNT:屬于請求首部,表示拒絕個人信息被收集,拒絕被精準廣告追蹤的一種方法,1表示開啟,需要服務器支持
- P3P:屬于響應首部,通過利用P3P可以讓個人信息變成一種僅供程序理解的形式,以達到保護用戶隱私的目的,但有很多輔助工作需要做。
參考:
《圖解HTTP》