HTTP訊息由用戶端到伺服器的請求和伺服器到用戶端的回應群組成。請求訊息和響應訊息都是由開始行(對於請求訊息,開始行就是請求行,對於響應訊息,開始行就是狀態行),訊息前序,空行(只有CRLF的行),訊息本文(可選)組成。
HTTP訊息前序包括通用前序、請求前序、響應前序、實體前序。每一個前序域都是由名字+“:”+空格+值組成,訊息前序域的名字是大小寫無關的。
1 請求訊息格式
HTTP請求內容由三部分組成:請求行、訊息頭(前序)、可選的請求本文(資訊體)
1.1 請求行格式:
請求行必須是放在所有內容的最前面,並且必須以換行斷行符號符結束,格式如下:
Method<空格>Request-URI<空格>HTTP/Version<換行斷行符號符>
1.2 Method:
表示對於Request-URI完成的方法,這個欄位是大小寫敏感的,有OPTIONS、GET、HEAD、POST、PUT、DELETE、 TRACE。方法GET和HEAD應該被所有的通用WEB伺服器支援,其他所有方法的實現是可選的。GET方法取回由Request-URI標識的資訊。 HEAD方法也是取回由Request-URI標識的資訊,只是可以在響應時,不返回訊息體。POST方法可以請求伺服器接收包含在請求中的實體資訊,可以用於提交表單,發送訊息等
1.3 Request-URI:
遵循URI格式,在此欄位為星號(*)時,說明請求並不用於某個特定的資源地址,而是用於伺服器本身
1.4 HTTP/Version
表示支援的HTTP版本,例如為HTTP/1.1。CRLF表示換行斷行符號符。
2 響應訊息格式
HTTP響應內容也是由三個部分組成:響應(狀態)行、訊息前序、響應本文,響應行必須是放在所有內容的最前面,並且必須以換行斷行符號符結束
2.1 響應行格式:
HTTP/Version<空格>Status-Code<空格>Reason-Phrase<換行斷行符號符>
2.2 HTTP/Version
表示支援的HTTP版本,例如為HTTP/1.1。
2.3 Status- Code
是一個三位元字組成的結果代碼(狀態代碼)。Status-Code的第一個數字定義響應的類別,後兩個數字沒有分類的作用。第一個數字可能取5個不同的值:
1xx:資訊響應類,表示接收到請求並且繼續處理
2xx:處理成功響應類,表示動作被成功接收、理解和接受
3xx:重新導向響應類,為了完成指定的動作,必須接受進一步處理
4xx:用戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行
5xx:服務端錯誤,伺服器不能正確執行一個正常的請求
常見狀態碼、狀態原因、說明:
200 OK //用戶端請求成功
400 Bad Request //用戶端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態碼必須和WWW-Authenticate報 頭域一起使用
403 Forbidden //伺服器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //伺服器發生不可預期的錯誤
503 Server Unavailable //伺服器當前不能處理用戶端的請求,一段時間後,可能恢複正常
2.4 Reason-Phrase
狀態原因,主要用於協助使用者理解。
3 通用頭域
通用頭域包含請求和響應訊息都支援的頭域,通用頭域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。對通用頭域的擴充要求通訊雙方都支援此擴充,如果存在不支援的通用頭域,一般將會作為實體頭域處理。
3.1
Cache-Control
頭域
Cache -Control指定請求和響應遵循的緩衝機制。在請求訊息或響應訊息中設定 Cache-Control並不會修改另一個訊息處理過程中的緩衝處理過程。請求時的緩衝指令(值)包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,響應訊息中的指令包括public、private、no-cache、no-
store、no-transform、must-revalidate、proxy-revalidate、max-age。各個訊息中的指令含義如下:
Public:指示響應可被任何緩衝區緩衝。
Private:指示對於單個使用者的整個或部分響應訊息,不能被共用快取處理。這允許伺服器僅僅描述當使用者的部分響應訊息,此響應訊息對於其他使用者的請求無效。
no-cache:指示請求或響應訊息不能緩衝
no-store:用於防止重要的資訊被無意的發布。在請求訊息中發送將使得請求和響應訊息都不使用緩衝。
max-age:指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
min-fresh:指示客戶機可以接收回應時間小於目前時間加上指定時間的響應。
max-stale:指示客戶機可以接收超出逾時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以接收超出逾時期指定值之內的響應訊息。
3.2
Date
頭域
Date頭域表示訊息發送的時間,時間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時間表示世界標準時,如果換算成本地時間,需要知道使用者所在的時區。
3.3 Pragma
頭域
Pragma頭域用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache- Control:no-cache相同。
3.4 Range頭域
Range頭域可以請求實體的一個或者多個子範圍。例如:
表示頭500個位元組:bytes=0-499
表示第二個500位元組:bytes=500-999
表示最後500個位元組:bytes= -500
表示500位元組以後的範圍:bytes=500-
第一個和最後一個位元組:bytes=0-0,-1
同時指定幾個範圍:bytes=500-600,601-999
但是伺服器可以忽略此要求標頭,如果無條件GET包含Range要求標頭,響應會以狀態代碼206(PartialContent)返回而不是以200 (OK)。
4 要求標頭域:
允許用戶端向伺服器傳遞關於請求或者關於客戶機的附加。要求標頭域可能包含下欄欄位Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。對要求標頭域的擴充,要求通訊雙方都支援,如果存在不支援的要求標頭域,一般將會作為實體頭域處理。
4.1
Host頭域
Host頭域指定請求資源的Intenet主機和連接埠號碼,必須表示請求url的原始伺服器或網關的位置。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀態代碼返回。
4.2
Referer頭域
Referer 頭域允許用戶端指定請求uri的源資源地址,這可以允許伺服器產生回退鏈表,可用來登陸、最佳化cache等。也允許廢除的或錯誤的串連由於維護的目的被追蹤。如果請求的uri沒有自己的uri地址,Referer不能被發送。如果指定的是部分uri地址,則此地址應該是一個相對位址。
4.3 User-Agent
頭域
User-Agent頭域的內容包含發出請求的使用者資訊。
5
請求訊息頭樣本:
GET http://www.ebdoor.com:80/ HTTP/1.0
Host: www.ebdoor.com
Accept:*/*
Pragma: no-cache
Cache-Control: no-cache
Referer: http://www.ebdoor.com/
User-Agent:Mozilla/4.0(…)
Range:bytes=554554-
訊息體….
上例第一行表示HTTP用戶端(可能是瀏覽器、下載程式)通過GET方法獲得指定URL下的檔案。綠色的部分表示要求標頭域的資訊,蘭色的部分表示通用頭部分。
6 回應標頭域
回應標頭域允許伺服器傳遞不能放在狀態行的附加資訊,這些域主要描述伺服器的資訊和 Request-URI進一步的資訊。回應標頭域包含Age、Location、Proxy-Authenticate、Public、Retry- After、Server、Vary、Warning、WWW-Authenticate。對回應標頭域的擴充要求通訊雙方都支援,如果存在不支援的回應標頭域,一般將會作為實體頭域處理。
6.1 Location回應標頭域
Location回應標頭用於重新導向接收者到一個新URI地址。
6.2 Server回應標頭域
Server回應標頭包含處理請求的原始伺服器的軟體資訊。此域能包含多個產品標識和注釋,產品標識一般按照重要性排序。
7 實體內容
指在頭域結束空行後的所有內容,請求訊息和響應訊息都可以包含實體資訊,實體可以是一個經過編碼的位元組流,它的編碼方式由實體頭域中的Content-Encoding或Content-Type定 義,它的長度由Content-Length或Content-Range定義。
8 實體頭域
實體頭域描述實體的資訊,實體頭包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header,允許用戶端定義新的實體頭,但是這些域可能無法被接受方識別。
8.1 Content-Type實體頭
Content-Type實體頭用於向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型,或GET方法發送的請求介質類型 Content-Range實體頭
8.2 Content-Range
指示了整個實體的長度。在伺服器向客戶返回一個部分響應,它必須描述響應覆蓋的範圍和整個實體長度。一般格式:
Content-Range:bytes-unit<空格>first-byte-pos-last-byte-pos/entity-legth
例如,傳送頭500個位元組次欄位的形式:Content-Range:bytes0- 499/1234如果一個http訊息包含此節(例如,對範圍請求的響應或對一系列範圍的重疊請求),Content-Range表示傳送的範圍,
8.3 Content-Length
表示實際傳送的位元組數。只有當瀏覽器使用持久HTTP串連時才需要這個資料。如果你想要利用持久串連的優勢,可以把輸出文檔寫入 ByteArrayOutputStram,完成後查看其大小,然後把該值放入Content-Length頭,最後通過 byteArrayStream.writeTo(response.getOutputStream()發送內容。
8.4 Allow
伺服器支援哪些要求方法(如GET、POST等)。
8.5 Content-Encoding
文檔的編碼(Encode)方法。只有在解碼之後才可以得到Content-Type頭指定的內容類型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的 下載時間。Java的GZIPOutputStream可以很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支援它。因此,Servlet應該通過查看Accept-Encoding頭(即request.getHeader("Accept- Encoding"))檢查瀏覽器是否支援gzip,為支援gzip的瀏覽器返回經gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面。
8.6 Expires
一個條件GET,只有改動時間遲於指定時間的文檔才會返回,否則返回一個304(Not Modified)狀態。應該在什麼時候認為文檔已經到期,從而不再緩衝它。
9 響應訊息樣本:
HTTP/1.0 200 OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3.14(Unix)
Content-type:text/html
Last-modified:Tue,17Apr200106:46:28GMT
Content-length:4359
Content-range:bytes554554-40279979/40279980
響應訊息體…
上例第一行表示HTTP服務端響應一個GET方法。綠色的部分表示回應標頭域的資訊,蘭色的部分表示通用頭部分,紅色的部分表示實體頭域的資訊。