八一八HTTP的一些事情
发布于 9 年前 作者 captainblue2013 3316 次浏览 最后一次编辑是 8 年前 来自 分享

如果想了解全面的,请自己看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也有以下一些振奋人心的东西:

  1. host

    1.1要求请求头加入host信息,表明目前请求的域名,这样web服务器(nginx等)就能
    根据头部信息,分发内容到VirtualHost,实现了一台主机多个应用。
    (1.0以前,一个IP只能部署一个应用)。
    
  2. keepalive

    keepalive是客户端与服务端在一个超时范围内,可以重复使用tcp链接,
    (过去是一次请求一次返回就断开)
    其实在1.0就已经支持keepalive,不过要手动设定,
    而到了1.1,默认所有请求都加入keepalive选项。
    
  3. range

    range技术多用于下载,它允许分段传输文件。
    在请求头中加入:Range: bytes 0-800 表示下载前800bytes的内容,
    服务器会返回前800bytes并且状态是206 。
    有了这个技术,可以实现断点续传、多线程下载等。
    
  4. session/cookie

    这个我们最熟悉的东西,居然不是http里定义的。
回到顶部