HTTP协议
http是一种协议;协议只是一种大家都遵守的规范,协议是不会定义某种具体实现的,它只是定义:为了达到某种目的或者为了完成某些任务而需要什么样的体系结构,而这种体系结构只有当大家都遵守了才会变得有意义;比如:像有些应用软件,特别是网络应用软件,它的说明文档中都会描述:此软件支持某某某协议。协议的内容只是一种高层次的抽象,是一些概念上的东西,它离真正用代码去实现还有一段距离,并且实现的方式可能有很多种。
那么HTTP协议的目的是什么?
HTTP协议的目的在于:互联网数据传输服务;不过这样说可能范围太广,更具体一些是:HTTP允许不同的应用程序对资源进行基本的超媒体访问。
如果学过TCP/IP协议簇的读者就知道:HTTP协议是应用层的协议之一。它的消息格式类似于MIME邮件报文格式(参见我写的MIME邮件格式;也在豆丁网和百度文库中)。
HTTP是基于请求/响应机制的,所以它的消息分为:请求消息和响应消息(格式几乎一样)。
HTTP的大体内容
基于HTTP协议的客户端访问包括4个过程:建立TCP套接字连接、发送HTTP请求报文、接收HTTP响应报文、关闭TCP套接字连接。
请求报文的格式
请求消息:请求行 CRLF
实体头信息CRLF
[实体内容] CRLF
说明:
请求行:方法 URL HTTP版本号(属性)
方法属性(值):GET|HEAD|POST|扩展方法
URL属性(值) :协议名称 + 宿主名 + 目录与文件名
其中CRLF表示回车换行
方法表示对所指定的资源执行的动作,常用的有3个:GET、POST、HEAD;含义如下表所示:
方法名 | 功能 |
GET | 从WEB服务器中(服务器端)获取对象,不同类型的对象将获取不同的信息,比如: · 文件类型对象,获取该文件的内容。 · 程序类型对象,获取该程序执行的结果。 · 数据库查询类型对象,获取该查询的结果。 例如:你在浏览器的地址栏中输入网址的方式访问网页时,浏览器就是采用GET方法向服务器获取资源。 |
HEAD | 要求服务器查找对象的元信息。 |
POST | 从客户端向WEB服务器发送数据。 |
其它方法:
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
实体头信息中记载了报文的属性,利用这些信息可以实现客户端与WEB服务器(服务器端)之间的请求或应答,它包括报文的数据类型、压缩方法、语言、长度、压缩方法、最后一次修改时间、数据有效期等信息。
实体内容是报文传送的附加信息,一般供POST请求填写,常用于提交表单。
下面给出一个GET请求报文的例子:
如果你在浏览器的地址栏内输入“http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱云翔” ;那么浏览器会发送此GET请求报文,其格式如下:
GET http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱云翔 HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: www.zhiliaowang.com
Connection: Keep-Alive
其中"/toupiaoceshi.asp?name=朱云翔"是URL信息,语句"ACCEPT:*/*"及其后的语句是"实体头信息"。
注意:在语句"Connection:Keep-Alive"下的空行是必须的。
下面是HTTP协议中关于POST请求报文例子:
POST /sp.cgi HTTP/1.0 /* 请求行,服务程序为sp.cgi */
Host: www.spserver.com /* 以下为实体头信息 */
Authorization: Basic <Base64 串>
Content-Length: <Content-Length>
<CommandId>=<4> /* 以下为POST请求的实体信息 */
<SequenceNumber>=<205502327125025327> /* 实体部分传送报文 */
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=<ABCD 1234>
可以看到在其实体部分的内容是<名,值>对的形式。
HTTP响应报文
WEB服务器处理客户请求,并向客户机发送响应报文,HTTP协议的响应报文格式为:
应答报文:状态行 CRTF
实体头信息CRLF
[实体内容] CRLF
状态行:HTTP版本号 状态码 原因叙述(属性)
状态码属性描述了WEB服务器执行客户机请求的状态信息,其取值含义如下表所示:
取值 | 描述 |
1×× | 保留。 |
2×× | 成功接收,比如“200”表示处理成功。 |
3×× | 客户需进一步细化请求。 |
4×× | 客户错误,比如“404”表示访问的 指定资源不存在。 |
5×× | 服务器错误。 |
GET应答报文例子
一个请求URL为"http://www.zhiliaowang.com/toupiaoceshi.asp?name=朱云翔"的应答报文例子如下:
HTTP/1.1 200 OK /*状态行—"200"是响应码,"OK"是原因描述*/
Connection: keep-alive /*连接是一直连接,并不断开*/
Date: Thu, 26 Jul 2007 14:00:02 GMT /*时间戳*/
Server: Microsoft-IIS/6.0 /*服务器的名称—这里是微软的IIS服务器*/
X-Powered-By: ASP.NET
Content-Length: 190
Content-Type: text/html /*实体内容的类型*/
Set-Cookie:ASPSESSIONIDSAATTCSQ=JOPPKDCAMHHBEOICJPGPBJOB; path=/
Cache-control: private
<html> /*从这行开始就是实体内容*/
<head>
<title>精通Unix下C语言编程</title>
</head>
<body>
<b>精通Unix下C语言编程与项目实战<br></b>
<b>投票测试<br></b>
感谢你为选手
朱云翔
投票!
</body>
</html>
POST应答报文例子
HTTP/1.0 200 OK /* 状态行,应答成功 */
Date: Tue, 13 Mar 2001 02:45:12 GMT /* 以下为实体头信息 */
Server: Apache/1.3.12 (Unix)
Content-Type: text/html
Connection: close /* 断开连接 */
<CommandId>=<80000004> /* 以下为POST应答的实体信息 */
<SequenceNumber>=<205502327125025327>
<UserNumber>=<8613001125453>
<SPNumber>=<168>
<MessageContent>=< EFGH 5678> <Result>=<0>
最后客户机与服务器双方关闭套接字连接,结束TCP/IP会话。
简要介绍URL
URL(Uniform Resource Locator,统一资源定位符)
URL就是我们在浏览器的地址栏里输入的网站地址,浏览器通过HTTP将Web服务器上站点的网页代码提取出来,并翻译成漂亮的网页。URL中可以指定WEB站点名称、网页名称,也可以向访问的网页提交不同的参数;例如:WEB端的投票服务程序正是利用了URL中的参数达到了区分选手并为选手加票的目的,比如以下URL就是一个投票的例子:
http://www.zhiliaowang.com/toupiaoceshi.asp?name=zyx
其中:
(1) "http://"代表超文本传输协议,通知网页浏览器(如IE等)显示Web页,通常不用输入。
(2) "www.zhiliaowang.com"是装有网页的服务器的域名,或站点服务器的名称。
(3) "/toupiaoceshi.asp"是服务器端的投票服务程序的绝对路径的名称,"/"为根目录。
(4) "?"代表后面接着参数。
(5) "name= zyx"标识了一个参数name,它的值是"zyx"。在投票服务程序中,选手的姓名或编号等信息一般通过参数传入,不同的投票服务程序的参数的设置都不一样,读者要根据具体情况具体分析,本处URL的含义是为姓名叫"zyx"的选手投票。
说明:
从上例可以看出:使用GET报文也可以向服务器传递信息,也是使用(名,值)对的方式,不过这种方式不安全,因为它是通过在URL中附加明文信息的方式进行传递,并且其负载量较小。
在sevlet的讨论中还要详细讲解URI和URL这部分知识内容。
利用telnet观察 http协议的通讯过程
实验目的及原理:
利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在 telnet窗口上显示出来。在RFC规范中,类似telnet这样的应用程序被称为客户端,而我们经常提到的浏览器却被称为用户代理。
实验步骤:
注意:这里必须迅速输入,否则超过一定时间就会自动断开连接。
1、编辑并发送请求消息
运行 -->cmd 进入命令行
1、输入telnet www.guet.edu.cn 80//注意端口号不能省略,然后回车;这时就登陆到服务器上了!
2、按下ctrl+]打开回显
3、再回车,进入请求消息编辑界面
4、输入:GET /index.asp HTTP/1.0回车
5、输入:HOST:www.guet.edu.cn回车
6、再回车;进行提交
2、这是返回的响应消息:
HTTP/1.0 503 Service Unavailable
Server: squid/3.0.STABLE20
Mime-Version: 1.0
Date: Sun, 25 Apr 2010 13:10:00 GMT
Content-Type: text/html
Content-Length: 1775
X-Squid-Error: ERR_CANNOT_FORWARD 0
X-Cache: MISS from 202.193.64.32
Via: 1.0 202.193.64.32 (squid/3.0.STABLE20)
Connection: close
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312">
<TITLE>错误;您所请求的网址(URL)无法获取</TITLE>
<STYLEtype="text/css"><!--BODY{background-color:#ffffff;font-family:verdana,sans-serif}PRE{font-family:sans-serif}-->
</STYLE>
</HEAD>
<BODY>
<H1>错误</H1>
<H2>您所请求的网址(URL)无法获取</H2>
<HR noshade size="1px">
<P>当尝试读取下面的网址(URL)时:<A HREF="http://202.103.243.99/index.asp">http://202.103.243.99/index.asp</A>
<P>发生了下列的错误:
<UL>
<LI>
<STRONG>Unable to forward this request at this time.
<BR>目前无法将您的请求进行转送操作
</STRONG>
</UL>
<P>This request could not be forwarded to the origin server or to anyparent caches. The most likely cause for this error is that:
<UL>
<LI>The cache administrator does not allow this cache to mak
edirect connections to origin servers, and<LI>All configured parent cachesare currently unreachable.
</UL>
</P>
<P>您的请求无法被转送到原始网络服务器或其他的上层缓存服务器,发生这个问题最可能的原因是:
<UL>
<LI>缓存服务器管理员不允许本服务器与原始网络服务器直接连结,而
<LI>所有本服务器指定的上层缓存服务器都暂时无法连结。
</UL>
</P><P>本缓存服务器管理员:<A HREF="mailto:webmaster?subject=CacheErrorIn
fo%20-%20ERR_CANNOT_FORWARD&body=CacheHost%3A%20202.193.64.32%0D%0AErrPage%3
A%20ERR_CANNOT_FORWARD%0D%0AErr%3A%20%5Bnone%5D%0D%0ATimeStamp%3A%20Sun,%2025%20
Apr%202010%2013%3A10%3A00%20GMT%0D%0A%0D%0AClientIP%3A%20112.115.10.58%0D%0A%0D%
0AHTTP%20Request%3A%0D%0AGET%20%2Findex.asp%20HTTP%2F1.0%0A%0D%0A%0D%0A">webmast
er</A>
<br>
<hr>
<div id="footer">Generated Sun, 25 Apr 2010 13:10:00 GMT by 202.19
3.64.32 (squid/3.0.STABLE20)
</div>
</body>
</html>
失去了跟主机的连接。
关于更详细的HTTP协议内容可以参看RFC文档和TCP/IP协议第一二卷;不过并不推荐在没有真正使用到HTTP协议的更详细的内容之前,就对整个协议内容进行深入讨论。