关于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协议报头的一部分内容,未完待续…