文:阿蜜果
日期: 2009-12-2
2. 协议详解篇
2.1 HTTP/1.0 和 HTTP/1.1 的比较
RFC 1945定义了 HTTP/1.0版本, RFC 2616定义了 HTTP/1.1版本。
笔者在 blog上提供了这两个 RFC中文版的下载地址。
RFC1945下载地址:
http://www.blogjava.net/Files/amigoxie/RFC1945( HTTP)中文版 .rar
RFC2616下载地址:
http://www.blogjava.net/Files/amigoxie/RFC2616( HTTP)中文版 .rar
2.1.1 建立连接方面
HTTP/1.0 每次请求都需要建立新的 TCP连接,连接不能复用。 HTTP/1.1 新的请求可以在上次请求建立的 TCP连接之上发送,连接可以复用。优点是减少重复进行 TCP三次握手的开销,提高效率。
注意:在同一个 TCP连接中,新的请求需要等上次请求收到响应后,才能发送。
2.1.2 Host 域
HTTP1.1在 Request消息头里头多了一个 Host域 , HTTP1.0则没有这个域。
Eg:
Host: www.w3.org
可能 HTTP1.0的时候认为,建立 TCP连接的时候已经指定了 IP地址,这个 IP地址上只有一个 host。
2.1.3 日期时间戳
(接收方向 )
无论是 HTTP1.0还是 HTTP1.1,都要能解析下面三种 date/time stamp:
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
(发送方向 )
HTTP1.0要求不能生成第三种 asctime格式的 date/time stamp;
HTTP1.1则要求只生成 RFC 1123(第一种 )格式的 date/time stamp。
2.1.4 状态响应码
状态响应码 100 (Continue) 状态代码的使用,允许客户端在发 request消息 body之前先用 request header试探一下 server,看 server要不要接收 request body,再决定要不要发 request body。
客户端在 Request头部中包含
Server看到之后呢如果回 100 (Continue) 这个状态代码,客户端就继续发 request body。这个是 HTTP1.1才有的。
另外在 HTTP/1.1中还增加了 101、 203、 205等等性状态响应码
2.1.5 请求方式
HTTP1.1增加了 OPTIONS, PUT, DELETE, TRACE, CONNECT这些 Request方法 .
Method = "OPTIONS " ; Section 9.2
| "GET" ; Section 9.3
| "HEAD" ; Section 9.4
| "POST" ; Section 9.5
| "PUT " ; Section 9.6
| "DELETE " ; Section 9.7
| "TRACE " ; Section 9.8
| "CONNECT " ; Section 9.9
| extension-method
extension-method = token
2.2 HTTP 请求消息
2.2.1 请求消息格式
请求消息格式如下所示:
请求行
通用信息头 |请求头 |实体头
CRLF(回车换行 )
实体内容
其中“请求行”为:请求行 = 方法 [空格 ] 请求 URI [空格 ] 版本号 [回车换行 ]
请求行实例:
Eg1:
Eg2:
POST http://192.168.2.217:8080/index.jsp HTTP/1.1
HTTP请求消息实例:
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Wed, 17 Oct 2007 02:15:55 GMT
If-None-Match: W/"158-1192587355000"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: 192.168.2.162:8080
Connection: Keep-Alive
2.2.2 请求方法
HTTP的请求方法包括如下几种:
q GET
q POST
q HEAD
q PUT
q DELETE
q OPTIONS
q TRACE
q CONNECT
2.3 HTTP响应消息
2.3.1 响应消息格式
HTTP响应消息的格式如下所示:
状态行
通用信息头 |响应头 |实体头
CRLF
实体内容
其中:状态行 = 版本号 [空格 ] 状态码 [空格 ] 原因 [回车换行 ]
状态行举例:
Eg1:
Eg2:
HTTP响应消息实例如下所示:
ETag: W/"158-1192590101000"
Last-Modified: Wed, 17 Oct 2007 03:01:41 GMT
Content-Type: text/html
Content-Length: 158
Date: Wed, 17 Oct 2007 03:01:59 GMT
Server: Apache-Coyote/1.1
2.3.2 http 的状态响应码
2.3.2 .1 1** :请求收到,继续处理
100——客户必须继续发出请求
101——客户要求服务器根据请求转换 HTTP协议版本
2.3.2 .2 2** : 操作成功收到 , 分析、接受
200——交易成功
201——提示知道新文件的 URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的 GET请求
2.3.2 .3 3** :完成此请求必须进一步处理
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他 URL或访问方式
304——客户端已经执行了 GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本 HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
2.3.2 .4 4** :请求包含一个错误语法或不能完成
400——错误请求,如语法错误
401——未授权
HTTP 401.1 - 未授权:登录失败
HTTP 401.2 - 未授权:服务器配置问题导致登录失败
HTTP 401.3 - ACL 禁止访问资源
HTTP 401.4 - 未授权:授权被筛选器拒绝
HTTP 401.5 - 未授权: ISAPI 或 CGI 授权失败
402——保留有效 ChargeTo头响应
403——禁止访问
HTTP 403.1 禁止访问:禁止可执行访问
HTTP 403.2 - 禁止访问:禁止读访问
HTTP 403.3 - 禁止访问:禁止写访问
HTTP 403.4 - 禁止访问:要求 SSL
HTTP 403.5 - 禁止访问:要求 SSL 128
HTTP 403.6 - 禁止访问: IP 地址被拒绝
HTTP 403.7 - 禁止访问:要求客户证书
HTTP 403.8 - 禁止访问:禁止站点访问
HTTP 403.9 - 禁止访问:连接的用户过多
HTTP 403.10 - 禁止访问:配置无效
HTTP 403.11 - 禁止访问:密码更改
HTTP 403.12 - 禁止访问:映射器拒绝访问
HTTP 403.13 - 禁止访问:客户证书已被吊销
HTTP 403.15 - 禁止访问:客户访问许可过多
HTTP 403.16 - 禁止访问:客户证书不可信或者无效
HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效
404——没有发现文件、查询或 URl
405——用户在 Request-Line字段定义的方法不允许
406——根据用户发送的 Accept拖,请求资源不可访问
407——类似 401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的 Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源 URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含 Range请求头字段,在当前请求资源范围内没有 range指示值,请求也不包含 If-Range请求头字段
417——服务器不满足请求 Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求 长。
2.3.2 .5 5** :服务器执行一个完全有效请求失败
HTTP 500 - 内部服务器错误
HTTP 500.100 - 内部服务器错误 - ASP 错误
HTTP 500-11 服务器关闭
HTTP 500-12 应用程序重新启动
HTTP 500-13 - 服务器太忙
HTTP 500-14 - 应用程序无效
HTTP 500-15 - 不允许请求 global.asa
Error 501 - 未实现
HTTP 502 - 网关错误
2.4 使用 telnet 进行 http 测试
在 Windows下,可使用命令窗口进行 http简单测试。
输入 cmd进入命令窗口,在命令行键入如下命令后按回车:
而后在窗口中按下 “ Ctrl+]” 后按回车可让返回结果回显。
接着开始发请求消息,例如发送如下请求消息请求 baidu的首页消息,使用的 HTTP协议为 HTTP/1.1:
注意: copy如上的消息到命令窗口后需要按两个回车换行才能得到响应的消息,第一个回车换行是在命令后键入回车换行,是 HTTP协议要求的。第二个是确认输入,发送请求。
可看到返回了 200 OK的消息,如下图所示:
可看到,当采用 HTTP/1.1时,连接不是在请求结束后就断开的。若采用 HTTP1.0,在命令窗口键入:
此时可以看到请求结束之后马上断开。
读者还可以尝试在使用 GET或 POST等时,带上头域信息,例如键入如下信息:
connection: close
Host: www.baidu.com
2.3 常用的请求方式
常用的请求方式是 GET和 POST.
l GET 方式 :是以实体的方式得到由请求 URI所指定资源的信息,如果请求 URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。
l POST 方式 :用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求 URI所指定资源的附加新子项, Post被设计成用统一的方法实现下列功能:
1:对现有资源的解释;
2:向电子公告栏、新闻组、邮件列表或类似讨论组发信息;
3:提交数据块;
4:通过附加操作来扩展数据库 。
从上面描述可以看出, Get是向服务器发索取数据的一种请求;而 Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。
GET与 POST方法有以下区别:
( 1) 在客户端, Get方式在通过 URL提交数据,数据在 URL中可以看到; POST方式,数据放置在 HTML HEADER内提交。
( 2) GET方式提交的数据最多只能有 1024字节,而 POST则没有此限制。
( 3) 安全性问题。正如在( 1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
( 4) 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。换句话说, GET 请求一般不应产生副作用。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。 POST 请求就不那么轻松了。 POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。
附录:参考资料
《 HTTP1.1和 HTTP1.0的区别》:
http://blog.csdn.net/yanghehong/archive/2009/05/28/4222594.aspx
《 HTTP请求( GET和 POST区别)和响应》: