http会话过程
一次普通的http会话过程
有代理服务器时的会话过程
URL(Uniform Resource Locator)
URL的格式为http://www.cnblogs.com:8080/
scheme://host[:port]/path/.../[;url-params][?query-string][#anchor]
方括号表示可选项目,其中:
scheme 指定协议(例如:http, https, ftp)
host 服务器的IP地址或域名
port 服务器的端口。http服务的默认端口是80,如果使用别的端口,必须指明,例如http://www.cnblogs.com:8080/
path 资源路径
url-params 参数
query-string 发送给服务器的数据。多个数据之间以&连接
anchor 锚
例如,http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
request的结构
请求方式(如GET,POST等) URI(要操作的资源) HTTP/http协议的版本号(这一行称为请求行)
字段1:值1
字段2:值2
...
字段N:值N(这几行称为请求头)
(空行)
[请求正文]
圆括号内的只是注释,所有的换行都是\r\n,即使没有请求正文也必须有空行。
例如,
GET /index.jsp HTTP/1.1
Host: www.javathinker.org
URI中开始的那个“/”表示服务器根目录。
请求方式
GET,POST,PUT,DELETE分别对应于资源的查,改,增,删四项基本操作。
GET资源的时候有时要先把少量数据发给服务器(比如登陆时),这些数据要放在URL的query-string中而不是请求正文中,例如EditPosts.aspx?name=test1&id=123456.
由于浏览器对URL的长度有限制,所以只能发送少量的数据。
另外,由于用户名和密码在URL中可见,所以翻看历史纪录就能够得知用户名和密码,因此,这样的GET请求有风险。
POST请求把要提交的数据放在请求正文中,对数据的长度无限制。
请求头
Host字段:指明服务器的域名和端口,同样的,如果端口是80则可以省略。
例如:Host:http://www.guet.edu.cn:8088
Content-Length字段:请求正文的长度。
例如,Content-Length: 38
Content-Type字段:请求正文向服务器提交时所采用的编码类型。
例如,Content-Type: application/x-www-form-urlencoded
User-Agent字段:客户端浏览器的名称和版本。
例如,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; .NET4.0C; InfoPath.2; .NET4.0E)
Accept字段:浏览器可以接受的资源类型。
例如,Accept: text/html,代表客户端可以接受text/html类型的资源,如果服务器无法返回text/html资源,则返回406 non acceptable.
*是通配符,一般浏览器发给服务器的都是Accept: */*,表示浏览器可以处理任何类型。
Accept-Encoding字段:为了节约带宽,服务器把数据发给客户端前先进行压缩,本字段给出客户端浏览器所支持的压缩编码方式。
例如,Accept-Encoding: gzip,deflate
Accept-Language字段:指明浏览器所接受的语言。
例如,Accept-Language: zh-cn
Accept-Charset字段:指明浏览器所接受的字符集。
例如,Accept-Charset: gb2312
注意语言和字符集不是一个概念,比如中文有多种字符集:big5,gb2312,gbk.
If-Modified-Since字段:浏览器缓存的页面的最后修改时间。
例如,If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
服务器会把它与服务器上实际文件的最后修改时间进行比对。如果时间一致,则返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。
If-None-Match字段:上次请求该资源时,服务器response中的Etag字段值。
例如,If-None-Match: "03f2b33c0bfcc1:0"
如果服务器发现资源现在的Etag相比上次请求时没有改变,说明资源没更新,就返回304告诉客户端使用本地缓存文件,否则将返回200以及新的资源和Etag.
Cookie字段:通过本字段将所请求域名下的所有cookie发给服务器。
编码类型有两种,application/x-www-form-urlencoded(默认值)和multipart/form-data。前者主要用于向服务器发送表单数据,前者发送大量数据、包含非ASCII字符的文本和二进制数据时编码效率很低;而后者既可以发送文本数据,也可以发送二进制数据,提交文件时一般采用后者。
Referer字段:告诉服务器客户是从哪个页面点链接到达这里的。
例如:Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
如果在网页A上有网页B的链接,那么网页B所在的服务器就可以根据Referer字段统计出每天有多少人通过网页A进入网页B。
Connection字段:Connection: keep-alive表示本次会话完成后,TCP连接暂时先不要断,下次和这个服务器会话时还用这条连接,这样就省去了TCP连接建立和关闭的开销。连接保持的时间可以通过Keep-Alive字段指定,单位是秒,例如Keep-Alive: 300
HTTP/1.1中,keep-alive默认是开启的,HTTP/1.0中需要手动开启。
Connection: close表示本次会话完成后关闭TCP连接。
以上很多字段的值可能都会有多个,值与值之间用逗号分开,如果要表达对各个值的偏好程度,则在值的后面跟一个分号,再跟上q=多少。q值介于0-1之间,默认为1,q值越大表示越偏好。例如,Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c表示浏览器最喜欢text/html和text/x-c型资源,text/x-dvi也行,text/plain也能接受但是喜欢程度最低。
response的结构
HTTP/http协议的版本号 状态码 状态描述(这一行称为响应行)
字段1:值1
字段2:值2
...
字段N:值N(这几行称为响应头)
(空行)
[响应正文]
所有的换行都是\r\n,即使没有响应正文也必须有空行。
HTTP/1.1定义的状态码
1XX 请求已被成功接收,继续处理
2XX 成功,请求已被成功地接收,理解,并接受
3XX 重定向,要完成请求,客户端必须进行进一步处理
4XX 客户端错误,非法请求
5XX 服务器端错误,服务器未能实现合法的请求
常见的状态码:
200 OK
302 Found,重定向,新的URL在响应头的Location字段给出,浏览器将会用新的URL重新发出request
304 Not Modified,上次缓存完文件之后,文件并没有改变,缓存文件还可以用
400 BadRequest,request的语法有误,服务器无法理解
403 Forbidden,服务器理解请求,但是拒绝提供服务
404 Not Found,请求的资源不存在,一般是URI输错了
500 Internal Server Error,服务器发生了不可预知的错误,一般是服务器源码有误
502 Bad Gateway,作为网关或代理的服务器执行请求时,从上游服务器收到无效的响应
503 Service Unavailable,服务器当前不能处理客户端的请求,过一段时间后可能恢复正常。可能是由于服务器过载引起的
响应头
Date字段:产生响应的时间。
例如,Date: Sat, 11 Feb 2012 11:35:14 GMT
Expires字段:响应过期的时间,在此之前浏览器都会使用本地缓存。
例如,Expires: Tue, 08 Feb 2022 11:35:14 GMT
Location字段:需要重定向时在本字段指明新的URL.
Content-Length字段:响应正文的长度,以字节为单位,十进制表示。
例如,Content-Length: 19847
Content-Type字段:服务器返回数据的类型和字符集。
例如,Content-Type: text/html; charset=utf-8
Content-Type: image/jpeg
Content-Encoding字段:服务器返回数据的压缩方式(gzip,deflate)。
例如,Content-Encoding: gzip
Content-Language字段:服务器返回数据的语言。
例如,Conent-Language: zh
Last-Modified字段:资源最后修改的日期和时间。
例如,Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT
Etag字段:前面If-None-Match那里说过了。
Set-Cookie字段:用于把cookie发送到客户端浏览器。
例如,Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
可以连续地使用Set-Cookie字段向客户端浏览器发cookie.
Server字段:指明服务器的软件信息。
例如,Server: Microsoft-IIS/7.5
X-AspNet-Version字段:如果网站是用ASP.NET开发的,用本字段给出ASP.NET的版本。
例如,X-AspNet-Version: 4.0.30319
X-Powered-By字段:指明网站是用什么技术开发的。
例如,X-Powered-By: ASP.NET
Connection字段:Connection: keep-alive和Connection: close的用法和请求头一样。
参考资料:HTTP协议详解,http://kb.cnblogs.com/page/130970/
HTTP HEADER详解,http://www.open-open.com/lib/view/open1342064478859.html
更多关于请求头、响应头字段的详细介绍参见http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html