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.