HTTP协议简介

来源:互联网 发布:dpp软件怎么用 编辑:程序博客网 时间:2024/05/01 00:17
 

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&amp;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协议的更详细的内容之前,就对整个协议内容进行深入讨论。

原创粉丝点击