Chinaunix首页 | 论坛 | 博客
  • 博客访问: 226824
  • 博文数量: 16
  • 博客积分: 343
  • 博客等级: 一等列兵
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-10 11:34
个人简介

深思 慎取

文章分类

全部博文(16)

文章存档

2015年(1)

2014年(5)

2013年(2)

2012年(7)

2011年(1)

分类: 系统运维

2012-11-11 21:29:22

HTTP协议最初是一个规定如何请求和传送HTML文档的协议,现在她不仅可以处理HTML文档,也可以处理一些二进制信息,包括图片,音频,视频等。

说起HTML,你应该知道,她是用来描述网页的一种标记语言,浏览器向服务器请求一个页面,服务器将对应这个页面的HTML文档返回给浏览器,浏览器解析这个HTML文档,按照自己的理解将这个HTML文档描述的页面在你的显示器上呈现出来。
这是你打开一个网页时发生的事情,那么,浏览器请求一个文档时应该遵循什么样的语法和规范呢?服务器返回一个文档时又如何呢?这正是HTTP协议所规定的。

HTTP协议规定了两方(客户端代理和服务器端服务程序)之间的通讯过程以及其间涉及的一些具体问题和解决方案。
到底两方如何通讯,其间又涉及哪些问题和解决方案呢?请继续阅读。

首先,双方的通讯是由客户端发起的,所以,客户端享有一定的主动权,可以在想要和服务器通讯时发起连接请求。而服务器端就比较被动,为了响应随时可能出现的客户端请求,服务器端只好每天24小时的监听一个端口,这个端口通常是80,所以,客户端发来的请求通常也是发到80端口的。

HTTP还规定了客户端可以发起的请求的种类。一共有八种,分别是:
OPTIONS
返回当前服务器支持的方法种类,也就是当前这一部分所描述的八种方法中的一种或多种。
HEAD
返回GET方法的返回信息中的头信息,不返回请求的文档信息。
GET
返回头信息和所请求的文档信息。
POST
向指定的资源提交数据,提交的数据包含在请求体中。POST请求可能导致服务器端资源的改变或者新的资源的建立。
PUT
向服务器指定位置上传指定的文件。
DELETE
删除服务器上指定位置的文件。
TRACE
回显服务器收到的请求,多用于调试。
CONNECT
将TCP连接改为管道连接。

客户端发起请求时必须在请求信息中注明自己发起的请求是何种,以及具体请求什么信息等。
请求信息的格式和内容如下:
* 请求行,如"GET /images/logo.gif HTTP/1.1"
* 请求头,如"Accept-Language:en ..."
* 一个空行
* 可选的消息体
请求行必须以结尾,空行内必须只含有。在HTTP/1.1协议中,头字段中只有Host是必选的。
一个完整的请求头实例如下:
"
GET /webhp?hl=en&tab=ww HTTP/1.1

Host:

Connection: keep-alive

User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

X-Chrome-UMA-Enabled: 1

X-Chrome-Variations: CLO1yQEIirbJAQiatskBCKS2yQEIp7bJAQiptskBCLK2yQEIuIPKAQ==

Referer: http:///

Accept-Encoding: gzip,deflate,sdch

Accept-Language: zh-CN,zh;q=0.8

Accept-Charset: UTF-8,*;q=0.5

Cookie: NID=65=bNvxwVutBZQ...
"

说完了客户端怎么发起请求,再说说服务器端怎么响应请求。

服务器端的响应的第一行叫做状态行,其内容依次是版本号、状态码和状态描述短语,彼此之间用空格分隔。
版本号有 0.9,1.0和1.1,其中0.9已基本废弃。
状态码有五类,分别以1、2、3、4、5开头,含义如下:
1xx:消息,请求已经被服务器接收,继续处理;
2xx:成功,请求已经被服务器接收,理解并接受;
3xx:重定向,需要后续操作才能完成客户端的请求;
4xx:请求错误,请求含有语法错误或无法被执行;
5xx:服务器端错误,服务器在执行某个正确的请求时发生错误。

状态行之后是一些响应头信息。
响应头信息之后是一个空行,然后是HTML文档。

一个响应头实例:
"
HTTP/1.1 200 OK

Date: Sun, 11 Nov 2012 12:11:05 GMT

Expires: -1

Cache-Control: private, max-age=0

Content-Type: text/html; charset=UTF-8

Content-Encoding: gzip

Connection: close

Server: gws

X-XSS-Protection: 1; mode=block

X-Frame-Options: SAMEORIGIN
"

说完了请求和响应过程,再说一下HTTP协议的版本变化:(参见RFC2145)
0.9
已过时的版本,只接受GET一种请求方法,在通讯中不指定版本号,且不支持请求头。
HTTP/1.0
第一个在通讯过程中指定版本号的HTTP协议,至今依然使用广泛,尤其是在代理服务器中。
HTTP/1.1
当前版本,默认采用持久连接,并能很好的配合代理服务器工作。
还支持以管道的方式同时发送多个请求,降低线路负载,提高传输速度。

关于持久连接:
在非持久连接中,每个TCP连接只请求一个web对象,一次“请求/返回”之后就自动断开TCP连接,下次请求时再建立新的TCP连接。
在持久连接中,一个TCP连接可以用于多次“请求/返回”,由于后续请求不必再进行TCP握手协商,这可以大大提高HTTP通讯的效率。

关于HTTP协议,此次就说这么多,更详细的内容,如HTTP持久连接,HTTP方法等,参见后续文章。
参考:
1. %E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
2.
阅读(1994) | 评论(0) | 转发(0) |
0

上一篇:PHP处理大数字

下一篇:初识PHPmemcached

给主人留下些什么吧!~~