關於http協議,相信一般的人都知道,相關的文章網上一抓一大把。但是對http協議的細節真的都清楚了嗎?我自問了一下,很是慚愧,於是決定好好捋捋。
刨開表層看內在,首先裝上httpwatch親眼目睹一下http的真容:訪問google看看
請求報頭
GET http://www.google.com/ HTTP/1.1 Accept: application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */* Accept-Language: zh-cn User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Accept-Encoding: gzip, deflate Proxy-Connection: Keep-Alive Host: www.google.com Cookie: PREF=ID=f3aa0c45021b6ab1:U=b049e7b9deea7680:FF=0:NW=1:TM=1286955376:LM=1286956336:S=mA1groKA...
- GET http://www.google.com/ HTTP/1.1
指明http協議中信息提交的方式,最常用的有兩種方式,第一種為GET,第二種為POST
- Accept: application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel…
Accept請求報頭域用於指定客戶端接受哪些類型的信息,如:Accept:image/gif,表明客戶端希望接受GIF圖象格式的資源;Accept:text/html,表明客戶端希望接受html文本。
- Accept-Language: zh-cn
指定Accept-Language指定返回的字符集,這里zh-cn表示是中文
- User-Agent
我們上網登陸論壇的時候,往往會看到一些歡迎信息,其中列出了你的操作系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這往往讓很多人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息。User-Agent請求報頭域允許客戶端將它的操作系統、瀏覽器和其它屬性告訴服務器。
- Accept-Encoding
Accept-Encoding請求報頭域類似於Accept,但是它是用於指定可接受的內容編碼。如果請求消息中沒有設置這個域服務器假定客戶端對各種內容編碼都可以接受
- Proxy-Connection
這里表示我是通過代理服務器訪問的,嘿嘿,你懂的。Kepp-Alive表示使用socket長連接。
- Host
Host請求報頭域主要用於指定被請求資源的Internet主機和端口號,此處使用缺省端口號80
- Cookie
表示我的cookie信息
響應報頭與實體報頭:
當服務器接收到這個請求后,根據這個請求的描述,返回相應的內容:
HTTP/1.1 200 OK Date: Wed, 26 Jan 2011 03:04:20 GMT Server: gws Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=UTF-8 Content-Encoding: gzip Content-Length: 5575 X-XSS-Protection: 1; mode=block X-Cache: MISS from google.com X-Cache-Lookup: MISS from google.com:86 Connection: close
- HTTP/1.1 200 OK:指定http的協議和返回碼,指定使用的是http/1.1協議,返回碼是200 ok
- Server:包含服務器用來處理請求的軟件信息。與User-Agent請求報頭域是相對應的,GWS是google專用的web服務器.
- Expires:表示超時時間
- Cache-Control:表示使用的緩存機制;
Cache-Control: cache-directive
cache-directive可以為以下:
request時用到:
| "no-cache"
| "no-store"
| "max-age" "=" delta-seconds
| "max-stale" [ "=" delta-seconds ]
| "min-fresh" "=" delta-seconds
| "no-transform"
| "only-if-cached"
| "cache-extension"
response時用到:
| "public"
| "private" [ "=" <;"> field-name <"> ]
| "no-cache" [ "=" <;"> field-name <"> ]
| "no-store"
| "no-transform"
| "must-revalidate"
| "proxy-revalidate"
| "max-age" "=" delta-seconds
| "s-maxage" "=" delta-seconds
| "cache-extension"
部分說明:
根據是否可緩存分為
Public 指示響應可被任何緩存區緩存。
Private 指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當用戶的
部分響應消息,此響應消息對於其他用戶的請求無效。
no-cache 指示請求或響應消息不能緩存(HTTP/1.0用Pragma的no-cache替換)
根據什么能被緩存
no-store 用於防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。
根據緩存超時
max-age 指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
min-fresh 指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。
max-stale 指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以
接收超出超時期指定值之內的響應消息。
- Content-Encoding:表示采用的編碼方式,這里是采用gzip壓縮
- Content-Type: 用於指明發送給接收者的實體正文的媒體類型
- Content-Length:用於指明實體正文的長度,以字節方式存儲的十進制數字來表示。
- X-Cache: 表示我的 http request 是由 proxy server 回的 ,MISS 表 proxy 無資料
以上只是http協議報頭的一部分內容,未完待續…