八一八HTTP的一些事情
如果想了解全面的,请自己看RFC
从0.9到1.0
0.9是第一个版本,有以下几个显著特点。
1.实现了 get 请求,没有协议头,整个请求只有一行:GET /index.html
2.它只定义了请求(Request),返回(Response)没有任何定义。
所以,服务端只能返回纯文本。
3.典型的无状态请求,每一个事务都重新建立并关闭 一次TCP连接。
4.如果请求的资源不存在,或是服务器不可用,不会有任何的返回。
0.9的时代大家都很单纯,由于各种客观原因,能够从网络上拿到纯文本信息, 已经能为互联网提供很大的想象空间。
但是很明显的,以我们现在的眼光来看http0.9,这是一个非常直接非常单薄的发明。
而真正到了接近我们现在理解的http,就是1.0的时代了。
1.0是一个相对完善的版本,所以跟0.9比较起来,内容多了很多,其中比较值得关注的是
1.多了post的方法,这是web2.0的基础
2.有了http headers的概念,这是最伟大的部分,后面细说
3.有了状态码
http 1.0 让世界有了色彩
由于1.0想对0.9增加的内容太多,后来的很多client(如浏览器),都强制从1.0开始支持。
post方法带来变化,相信大家都比较能理解,在这里不细说。
这里我想重点说一下为什么 headers 是最伟大的部分。
1.多媒体的支持
在0.9时代,从网络上传回来的数据,我们只能按照纯文本来处理,
因为我并不知道这些内容是什么含义。
而从1.0开始,为了能告诉客户端数据类型,http返回头里会包含 content-type 属性。
content-type的格式是
“主类型/子类型” ( [type]/[subtype])
如 : text/html
常见的content-type请看 http://tool.oschina.net/commons
有了这个信息,服务器可以明确告诉客户端,这是音频、视频、图片、ppt等,
客户端也就可以根据这个属性,调用本地的解释器来执行返回的内容。
于是就有了多媒体。
2.缓存
缓存部分通过几个机制来完成,层层递进,分别是
Expires :
例子:Expires: Thu, 01 Dec 2016 16:00:00 GMT
返回头包含这个信息,告诉client在这个时间之前,你都可以使用本地的副本。
这个机制可以直接 免除 网络请求,效果明显,
但是问题是当服务器时间跟客户端时间不一致时,会出现一些问题。
Last-Modified、If-Modified-Since (精确到秒)
当Expires过期,客户端就重新请求资源,并且请求头在带上If-Modified-Since
(而上一次请求得到资源时,返回头会包含 Last-Modified 表明资源的修改时间),
服务器收到请求,会检查本地资源在If-Modified-Since之后是否有变化,
如果有,返回200,更新Last-Modified系信息,返回资源实体。
如果没有变化,返回304 ,由于没有返回实际数据,这个请求很快,
然后客户端就还是使用本地的副本。
ETag (http 1.1)
ETag是1.1补充到,在这样顺便说明一下。
Etag是服务器对资源的一个特征值校验,一旦资源发生变化,Etag也会变化。
它是弥补Last-Modified的一个缺陷,就是当资源在一秒内发生变化,
Last-Modified是无法察觉的。
3.状态码
每一个状态码都有它的含义,在一些实现得好的http环境下,能够表达很多的含义。
虽然我们没法记住全部状态码,但是可以通过码段区分:
1XX 是传达一些信息的
2XX 是成功一类的状态,不过也分很多种,received,understood, and accepted
3XX 重定向一类,只有头部返回信息
4XX Client Error ,这个错误是由客户端产生的,比如uri写错的404
5XX Server Error ,说明是服务端的问题,必要时报警通知管理员
4.其他
http1.0还有很多丰富的进步,有兴趣的可以去看 rfc1945
http 1.1
1.1是对1.0的一个补充,所以现在的client基本上都同时支持1.0/1.1, 实际上我们玩得6的基本都在1.0,而1.1也有以下一些振奋人心的东西:
-
host
1.1要求请求头加入host信息,表明目前请求的域名,这样web服务器(nginx等)就能 根据头部信息,分发内容到VirtualHost,实现了一台主机多个应用。 (1.0以前,一个IP只能部署一个应用)。
-
keepalive
keepalive是客户端与服务端在一个超时范围内,可以重复使用tcp链接, (过去是一次请求一次返回就断开) 其实在1.0就已经支持keepalive,不过要手动设定, 而到了1.1,默认所有请求都加入keepalive选项。
-
range
range技术多用于下载,它允许分段传输文件。 在请求头中加入:Range: bytes 0-800 表示下载前800bytes的内容, 服务器会返回前800bytes并且状态是206 。 有了这个技术,可以实现断点续传、多线程下载等。
-
session/cookie
这个我们最熟悉的东西,居然不是http里定义的。