(转载)http协议下

引用
转载来自http://xiangxji.iteye.com/blog/648676

作者:Beta技术博客

HTTP协议浅析(下)

协议结构

HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求报文格式如下:

请求行-通用信息头-请求头-实体头-报文主体

请求行以方法字段开始,后面分别是URL字段和HTTP协议版本字段,并以CRLF结尾。SP是分隔符。除了在最后的CRLF序列中CF和LF是必需的之外,其他都可以不要。有关通用信息头,请求头和实体头方面的具体内容可以参照相关文件。

应报文格式如下:

状态行-通用信息头-响应头-实体头-报文主体

状态码元由3位数字组成,表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述,状态码用来支持自动操作,而原因分析用来供用户使用。客户机无需用来检查或显示语法。有关通用信息头,响应头和实体头方面的具体内容可以参照相关文件。

工作原理

既然我们明白了URL的构成,那么HTTP是怎么工作呢?我们接下来就要讨论这个问题。

一次HTTP操作称为一个事务,其工作过程可分为四步:

首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。

建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

许多HTTP通讯是由一个用户代理初始化的并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。在Internet上,HTTP通讯通常发生在TCP/IP连接之上。缺省端口是TCP80,但其它的端口也是可用的。但这并不预示着HTTP协议在Internet或其它网络的其它协议之上才能完成。HTTP只预示着一个可靠的传输。

这个过程就好像我们打电话订货一样,我们可以打电话给商家,告诉他我们需要什么规格的商品,然后商家再告诉我们什么商品有货,什么商品缺货。这些,我们是通过电话线用电话联系(HTTP是通过TCP/IP),当然我们也可以通过传真,只要商家那边也有传真。

以上简要介绍了HTTP协议的宏观运作方式,下面介绍一下HTTP协议的内部操作过程。

在WWW中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。这就好像上面的例子,我们电话订货的全过程。

其实简单说就是任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用户请求。你的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,在进行必要的操作后回送所要求的文件。在这一过程中,在网络上发送和接收的数据已经被分成一个或多个数据包(packet),每个数据包包括:要传送的数据;控制信息,即告诉网络怎样处理数据包。TCP/IP决定了每个数据包的格式。如果事先不告诉你,你可能不会知道信息被分成用于传输和再重新组合起来的许多小块。

也就是说商家除了拥有商品之外,它也有一个职员在接听你的电话,当你打电话的时候,你的声音转换成各种复杂的数据,通过电话线传输到对方的电话机,对方的电话机又把各种复杂的数据转换成声音,使得对方商家的职员能够明白你的请求。这个过程你不需要明白声音是怎么转换成复杂的数据的。

安全及幂等方法

安全方法

开发者应当意识到他们的软件代表了用户在因特网上进行交互,并且应当告知用户,他们正在进行的操作可能对他们自身或者其他人有未曾预料的重要影响。

特别地,对于GET和HEAD方法而言,除了进行获取资源信息外,这些请求不应当再有任何其他意义。也就是说,这些方法应当被认为是“安全的”。客户端应当使用其他“非安全”方法,例如POST,PUT及DELETE来以特殊的方式(通常是按钮而不是超链接)使得客户能够意识到可能要负的责任(例如一个按钮带来的资金交易)或者被告知正在请求的操作可能是不安全的(例如某个文件将被上传或删除)。

但是,不能想当然地认为服务器不会在处理某个GET请求时不会产生任何副作用。事实上,很多动态资源会把这作为其特性。这里重要的区别在于用户并没有请求这一副作用,因此不应由用户为这些副作用承担责任。

幂等方法

假如在不考虑诸如错误或者过期等问题的情况下,若干次请求的副作用与单次请求相同或者根本没有副作用,那么这些请求方法就能够被视作“幂等”的。GET,HEAD,PUT和DELETE方法都有这样的幂等属性,同样由于根据协议,OPTIONS,TRACE都不应有副作用,因此也理所当然也是幂等的。

假如某个由若干个请求做成的请求串行产生的结果在重复执行这个请求串行或者其中任何一个或多个请求后仍没有发生变化,则这个请求串行便是“幂等”的。但是,可能出现若干个请求做成的请求串行是“非幂等”的,即使这个请求串行中所有执行的请求方法都是幂等的。例如,这个请求串行的结果依赖于某个会在下次执行这个串行的过程中被修改的变量。

HTTP返回代码解释:

"100":Continue

"101":witchingProtocols

"200":OK

"201":Created

"202":Accepted

"203":Non-AuthoritativeInformation

"204":NoContent

"205":ResetContent

"206":PartialContent

"300":MultipleChoices

"301":MovedPermanently

"302":Found

"303":SeeOther

"304":NotModified

"305":UseProxy

"307":TemporaryRedirect

HTTP400-请求无效

HTTP401.1-未授权:登录失败

HTTP401.2-未授权:服务器配置问题导致登录失败

HTTP401.3-ACL禁止访问资源

HTTP401.4-未授权:授权被筛选器拒绝

HTTP401.5-未授权:ISAPI或CGI授权失败

HTTP403-禁止访问

HTTP403-对Internet服务管理器(HTML)的访问仅限于Localhost

HTTP403.1禁止访问:禁止可执行访问

HTTP403.2-禁止访问:禁止读访问

HTTP403.3-禁止访问:禁止写访问

HTTP403.4-禁止访问:要求SSL

HTTP403.5-禁止访问:要求SSL128

HTTP403.6-禁止访问:IP地址被拒绝

HTTP403.7-禁止访问:要求客户证书

HTTP403.8-禁止访问:禁止站点访问

HTTP403.9-禁止访问:连接的用户过多

HTTP403.10-禁止访问:配置无效

HTTP403.11-禁止访问:密码更改

HTTP403.12-禁止访问:映射器拒绝访问

HTTP403.13-禁止访问:客户证书已被吊销

HTTP403.15-禁止访问:客户访问许可过多

HTTP403.16-禁止访问:客户证书不可信或者无效

HTTP403.17-禁止访问:客户证书已经到期或者尚未生效

HTTP404.1-无法找到Web站点

HTTP404-无法找到文件

HTTP405-资源被禁止

HTTP406-无法接受

HTTP407-要求代理身份验证

HTTP410-永远不可用

HTTP412-先决条件失败

HTTP414-请求-URI太长

HTTP500-内部服务器错误

HTTP500.100-内部服务器错误-ASP错误

HTTP500-11服务器关闭

HTTP500-12应用程序重新启动

HTTP500-13-服务器太忙

HTTP500-14-应用程序无效

HTTP500-15-不允许请求global.asa

Error501-未实现

HTTP502-网关错误

版本历史

协议版本

超文本传输协议已经演化出了很多版本,它们中的大部分都是向下兼容的。在RFC2145中描述了HTTP版本号的用法。客户端在请求的开始告诉服务器它采用的协议版本号,而后者则在响应中采用相同或者更早的协议版本。

0.9

已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,所以客户端无法向服务器传递太多信息。

HTTP/1.0

这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。

HTTP/1.1

当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:

1缓存处理

2带宽优化及网络连接的使用

3错误通知的管理

4消息在网络中的发送

5互联网地址的维护

6安全性及完整性

相关推荐