用户工具

站点工具


python-network-application:http-protocol

HTTP协议精解

WEB服务器和浏览器之间的一问一答的交互过程也得遵循一定的规则,这个规则就是HTTP协议。它是TCP/IP协议集中的一个应用层协议,用于定义浏览器和WEB服务器之间交换数据过程以及数据本身的格式。现在被广泛使用的HTTP/1.1相对HTTP/1.0而言,最大的特点就是支持持续连接。

1.HTTP/1.0的会话方式:

                    建立连接,发送请求信息         
         ----------------------------------------->
  客户机                                              服务器
         <------------------------------------------
                   关闭连接,回送响应消息

每次连接只处理一个请求,即使是对同一个网站的每一个页面的访问,浏览器和WEB服务器都要建立一次单独的连接。

2.HTTP/1.1的会话方式:

                         建立连接,第1个请求信息         
         -------------------------------------------------------------------------->
                                   ............
                         发送第N请求信息         
         -------------------------------------------------------------------------->
  客户机                 回送第1次响应                                               服务器
         <--------------------------------------------------------------------------     
                                 ..............
                         回应第n次响应
         <--------------------------------------------------------------------------
                         发送关闭连接请求         
         -------------------------------------------------------------------------->          
                         关闭连接              
         <--------------------------------------------------------------------------      

HTTP/1.1 支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图象的网页文件的多个请求和响应可以在一个连接中传输,但每个单独的网页文件的请求和响应仍然需要使用各自的连接,还允许客户端不用等待上一次请求结果返回就可以发送下一个请求。

HTTP消息的格式:

一个完整的请求消息包括:一个请求行、若干消息头、以及实体内容。
一个完整的响应消息包括:一个状态行、若干消息头、以及实体内容。
这在前面已经有过简单的介绍。下面对这几个部分再做个详细的解说:
1.请求行:包括三个部分,即请求方式、资源路径、以及使用的HTTP协议版本。语法如下:请求方式 资源路径 HTTP版本号<CRLF>,其中<CRLF>表示回车和换行这两个字符的组合。HTTP请求方式包括POST、GET、 HEAD、OPTIONS、DELETE、TRACE和PUT几种。常用的是前两种。
2.状态行:包括HTTP协议的版本号、一个状态码、以及对状态码进行描述的文本信息。
语法如下:HTTP版本号 状态码 原因叙述<CRLF>

使用GET和POST传递参数:

在URL地址后面可以附加一些参数,每个参数都由参数名和参数值组成,中间用=分隔,各个参数用&分隔,URL地址和整个参数之间用?分隔,如下所示:

http://www.it315.org/servlet/ParamsServlet?param1=aaa&param2=bbb

使用GET传递参数的数据量是有限的,一般限制在1KB以下。使用POST比GET要大的多。是没有限制的。但是必须设置Content=Type消息头为‘application/x-www-form-urlencoded’和设置Content-Length消息头为实体内容的长度。

响应状态码:

  • 200:表示一切正常,返回的是正常请求结果。
  • 404:表示服务器上不存在客户机上所请求的资源,这个状态码在浏览网页时最常见的。

状态代码

  • 200 OK (正常)
  • 201 Created
  • 301 Moved Permanently (页面已经永久性地迁移)
  • 302 Found
  • 304 Not Modified
  • 307 Temporary Redirect (页面暂时性地迁移到了别的地方,由 Location 指定)
  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found (页面没有找到)
  • 500 Internal Server Error (服务器端发生错误)
  • 501 Not Implemented

通用信息头:

  • Cache-Control:此字段用于通知客户机和服务器之间的代理服务器如何使用已缓存的页面。
  • Connection:用于指定处理完本次请求/响应后,客户端和服务器是否还要继续保持连接。
  • Date:用于表示HTTP消息产生的当前时间。
  • Transfer-Encoding:用于指定实体内容的传输编码方式。

请求头:

  • Accept:用于指定客户端程序能够处理的MIME类型。有多个时用逗号隔开。
  • Accept-Charset:指出客户端程序可以使用的字符集。有多个时用逗号隔开。
  • Accept-Encoding:指定客户机能够进行解码的数据编码方式。有多个时用逗号隔开。
  • Accept-Language:指定客户机期望服务器返回哪个国家语言的文档。有多个时用逗号隔开。
  • Host:指定资源所在的主机名和端口号。

响应头:

  • Accept-Range:用于说明当前WEB服务器是否接受Range请求和Range请求中指定的数据的单位。
  • Location:用于通知客户机应该到哪个新的地址去获取文档。由于当前响应并没有直接返回内容给客户机,所以使用Location头的HTTP消息不应该有实体内容,由此可见,在消息头中不能同时出现Location和Contect-Type这两个头自段。

实体头:

  • Allow:用于指定客户机请求的资源所支持的请求方法。
  • Content-Encoding:用于指定实体内容的压缩编码方式。
  • Content-Language:用于指定返回的网页文档的国家语言类型。
  • Content-Length:用于指定实体内容的长度。
  • Content-Location:用于指定响应消息中所封装的实体内容的实际位置路径。
  • Content-Type:用于指定实体内容的MIME类型。客户机通过检查服务器响应消息的此字段中的MIME类型就能知道实体内容的数据格式和知道以何种方式来进行处理了。<Tomcat>安装目录下的conf目录下的web.xml文件里面就定义了很多的类型。
  • Last-Modified:用于指定文档的最后修改时间。

扩展头:

  • Refresh:此字段告诉浏览器隔多长时间刷新。(转载)
python-network-application/http-protocol.txt · 最后更改: 2010/08/08 16:32 (外部编辑)