学习来源:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html#httprequestheader
1. HTTP消息的结构
HTTP消息具体可划分为Request消息和Response消息。
1.1 Request消息结构
Request Line | Method,path to resource,Http/Version number |
Request Header | Header name:value |
分隔Header和Body的空白行 | |
Body |
Request Line:
1.method:表示请求方法,比如“POST”和“GET”。
2.path to resource:表示请求的资源。
3.Http/Version number:表示Http协议的版本号。
例如:GET http://www.cnblogs.com/ HTTP/1.1
Request Header:
Request Header内容很多,按照Fiddle大致可以分为以下几类:
1.Cache头域
If-Modified-Since:指明浏览器端缓存页面的最后修改时间。服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果一致,返回304,客户端直接使用本地缓存文件。如果不一致,返回200和新的文件内容,客户端接到之后,会丢弃旧文件,缓存并显示新文件到浏览器中。
If-None-Match:和ETag一起工作。在Response中添加Etag信息,当用户再次请求该资源时,就将ETag的值赋给Request中的If-None-Match。如果服务器验证资源的ETag没有改变,就返回304告诉客户端使用本地缓存文件。否则就返回200和新的文件和ETag。这种机制可以提高网站的性能。
Pragma:通过设置Pragma:no-cache来防止页面被缓存,和Http/1.1版本中新增的Cache-Control:no-cache作用一样。
Cache-Control:用于指定Response-Request遵循的缓存机制。值为public时表示能被缓存到任何缓存中,值为private时表示内容只缓存到私有缓存中,值为no-cache时表示所有内容都不会被缓存。
2.Client头域
Accept:用于表明浏览器端可以接收的媒体类型。如果服务器无法返回Accept指定的文件类型,就会返回一个406错误(non acceptable)。这里一般会设置为接受所有文件类型:Accept:*/*
Accept-Encoding:用于表明浏览器接受的编码方法,通常用于指定压缩方法、是否支持压缩以及支持什么压缩方法(而不是字符集编码)。例如,Accept-Encoding:gzip,deflate
Accept-Language:用于表明浏览器接收的语言(而不是字符集编码)。
User-Agent:用于表明客户端使用的操作系统、浏览器的名称和版本。
Accept-Charset:用于表明浏览器接收的字符集。
3.Cookie/Login头域
Cookie:将Cookie的值发送给HTTP服务器
4.Entity头域
Content-Length:用于指明发送给服务器的数据的长度
Content-Type:
5.Miscellaneous头域
Referer:向服务器提供Request的上下文信息,用于告诉服务器客户端是从哪个链接过来的。例如,主页A有服务器S的链接,当在客户端C浏览A并点击S的链接时,该次Request的Refer值即为A
6.Transport头域
Connection:值为keep-alive和close
Host:用于指定被请求资源的Internet主机和端口号,该信息一般是从URL中提取出来的,在发送请求时,该信息是必须的。
Body:请求消息的body一般是存放一些请求的参数
1.2 Response消息结构
Response Line | Http/version number,status code,message |
Response Header | header name:value |
分隔Header和Body的空白行 | |
Body |
Response Line:
1.Http/version number:表示Http协议版本号。
2.status code:表示Http状态码,用来告诉客户端Http服务器是否产生了预期的Response。
3.message:表示Http状态消息。
例如:Http/1.1 200 OK
Response Header:
1.Cache头域:
Date:指明生产消息的具体时间和日期。
Expires:用于指定过期时间,浏览器会在指定过期时间内使用本地缓冲。
Vary:
2.Cookie/Login头域:
P3P:用于跨域设置Cookie,这样做可以解决iframe跨域访问Cookie的问题。例如,P3P:CP=CURa ADMa DEVa PSAo
Set-Cookie:用于把Cookie发送到客户浏览器,每一个写入Cookie都会生产一个Set-Cookie
3.Entity头域:
Etag:和If-None-Match配合使用
Last-Modified:用于指示资源的最后修改日期和时间
Content-Type:服务器告诉浏览器自己响应的对象的类型和字符集
Content-Length:指明实体正文的长度,用字节方式存储的十进制数字表示。
Content-Encoding:服务器表明自己使用了什么压缩方法来压缩响应中的对象。例如,gzip,deflate
Content-Language:服务器告诉浏览器自己响应的对象的语言者
4.Miscellaneous头域:
Server:用于指明HTTP服务器的软件信息。例如,Server:Microsoft-IIS/7.5
X-AspNet-Version:如果网站是用ASP.NET开发的,这个属性表示相应ASP.NET的版本
X-Powered-By:用于指明网站是用什么技术开发的,例如,X-Powered-By:Asp.Net
5.Transport头域:
Connection:
值为keep-alive时,表示当打开一个网页后,客户端可服务端之间用于传输Http数据的TCP连接不会关闭,当再次访问这个服务器上的网页时,使用上次建立的连接。
值为close时,表示一个Request完成后,客户端和服务端之间用于传输Http数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。
6.Location头域:
Location:用于重定向一个新的位置,包含新的URL。
Body:回复消息的body一般存放Html文档
2. HTTP状态码
Response消息的第一行又叫做状态行,由HTTP协议版本号、状态码、状态信息三部分组成。
HTTP/1.1中定义了5类状态码:
1XX:提示信息,表示请求已被成功接收,继续处理
2XX:成功,表示请求已被成功接收,理解,接受
3XX:重定向,表示要完成请求必须做更进一步处理
4XX:客户端错误,表示请求有语法错误或者请求无法实现
5XX:服务端错误,表示服务器未能实现合法的请求
常见的状态码+状态信息有:
200 OK:成功,请求被成功地完成,所请求的资源已发送回客户端
302 Found:重定向,新的URL会在Response中的Location中返回,浏览器会自动使用该URL发出新的Request
304 Not Modified:无变动,文件已缓存,可以继续使用
400 Bad Request:客户端请求有语法错误,无法被服务器理解
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在(可能是输错了URL)
500 Internal Server Error:服务器发生了不可预期的错误
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
3. HTTP是基于TCP的,但也是无状态的
HTTP是一个无状态的面向连接的协议。
无状态:
1.表示Http协议对事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,两次打开一个服务器上的网页之间是没有任何联系的。
2.不表示HTTP协议不能保持TCP连接,更不能因为HTTP是无状态的就说他是基于UDP的。
面向连接:是指在双方进行Http信息传递之前,需要先建立连接
从HTTP/1.1开始,默认设置Connection:Keep-Alive,以保持连接性。