这是我的第一篇博客,一起参与掘金新人创作活动
本文正在参与 “网络协议必知必会”征文活动
大家好啊,我是鼠目。一个想从超级废物,变成一般废物的小前端。这篇文章,希望聊一聊http的发展史。
http是一个基于tcp/ip的应用层协议
http0.9
时间回拨到1991年,在互联网还在普及,网速带宽极低的年代。万维网协会W3C和IETF制定了只支持get请求的http0.9,也没有请求头,故而只支持纯文本。
在那个上网用kb计算的年代,没有版本号,也没有请求头,已经被彻底放弃,也就没什么好说的了。
http1.0
时间来到了1996年,http1.0版本发布,至今仍有网站采用。
-
在http0.9的基础上扩展了POST,HEAD。有了head头的控制,它不再只传输文本,而是开始支持图像,视频,二进制文件等其他内容。
-
新增了5类状态码,信息响应(1xx),成功响应(2xx),重定向响应(3xx),客户端错误(4xx),服务端错误(5xx)。
-
缓存策略 expires字段控制,值为服务器返回该请求结果的到期时间,但是受限于客户端时间,修改客户端时间会导致缓存失效(强缓存)
Last-Modified 和 If-Modified-Since(协商缓存)
可是http1.0还是有几个缺点。
- 每个请求都需要独立建立连接(keep-alive虽然能解决部分问题,但是不能交叉推送)
- 队头阻塞,下一个请求的发送必须在收到前一个请求包的响应包后。
http1.1
1997年,为解决http1.0遗留问题,http1.1出世。
- 默认为长链接以及请求的管道化处理,在一个tcp连接上可以传送多个http请求和相应。一定程度上缓解了队头阻塞,但是没有完全解决,因为服务器端是按照请求包的顺序响应的。后面的响应数据,必须在前数据响应完成后响应。
- 多了一些缓存处理字段 Entity tag, if-Unmodified-Since,If-Match,If-None-Match等缓存头来控制缓存策略。
- 增加了range头域,允许只请求资源的某个部分,支持断点续传。
- 增加了host头处理。在http1.0中,默认一台服务器只有一个ip地址,但是随着虚拟主机技术的发展,一台服务器上可能有多个虚拟主机共享一个ip地址。所以新增了host,作为区分
- 新增了24个错误状态响应码
http1.1虽然已经很优秀,可还是有它的局限性。
- 虽然默认长链接可以复用一部分连接,但是域名分片等情况下还是需要建立多个连接,增加了服务器的性能压力(chrome浏览器一个域名可以并发6个,多分两个二级域名,就多了12个,这就是域名分片,也是队头阻塞的一种解决方式,但是不可避免给服务器端带来压力)
- 管道化处理(pipeling)只是解决了部分HOLB(队头阻塞)。但是因为按序返回,某个请求比较耗时,还是会阻塞后续请求。
- 协议开销大,因为header中的内容较多,一定程度上增加了传输成本。
最后一天活动了,赶着写文,再加上有个妹子等着我语音,真没办法写完全部啊。=.=,剩下的http2以及http3留下次再水吧。 后面这篇文章估计也还得再回炉一波=.=