48.HTTP 的深思:我从何而来,去向何处

2021-07-26  本文已影响0人  ikonan

在前面三讲中,分别了解了网络的基本内容、HTTP 的特性,尤其是缓存特性。这一讲让我们从历史的角度来审视 HTTP,探究 HTTP 的演进是为了更好的应用,更理解网络这个宏大概念中的一环。

主要内容如下:


HTTP 的诞生

HTTP 从何处来?

HTTP 协议诞生自 1989 年(可能比很多开发者年纪要大),第一版本是 HTTP 0.9,但 HTTP 0.9 并不是一个正式标准;直到 1996 年,根据 RFC 1945,HTTP 1.0 成为 IEFT 标准,1999 年,在 RFC 2616 中发布了 HTTP 1.1。

版本路线如下:

这些「陈年旧事」我们不再过多回顾,下面来看一下 HTTP 的现状和发展痛点。

HTTP 的现状和痛点

HTTP 2.0 于 2015 年发布,考虑到发布后的落地情况,以及现在各大厂商的应用情况,我们认可 HTTP 1.1 作为现状分析。

HTTP 1.1 是划时代的,它解决了 HTTP 1.0 时代最重要的两个大问题:

HTTP 1.1 的改进点「对症下药」,它引入了:

除此以外,HTTP 1.1 还有一些创造性的改进,比如:

基于 HTTP 1.1 的变革,一些成熟的方案也应运而出,比如:

这些内容我们会在本专栏「从实时通信系统看 HTTP 发展」部分进行介绍。

这么看来,HTTP 1.1 简直不要太完美!当然他还是有一些缺陷和痛点的。比如:

HTTP 2.0 未来已来

说起 HTTP 2.0,不得不提一下 SPDY 协议。2009 年,谷歌针对 HTTP 1.1 的一些问题,发布了 SPDY 协议。这个协议在 Chrome 浏览器上进行应用,并证明可行后,就成为了 HTTP 2.0 的基础,主要特性都在 HTTP 2.0 之中得到继承。但作为推动时代发展的产出,SPDY 说到底不会主宰时代而流行,我们暂不介绍更多,而把主要精力放在 HTTP 2.0 上。

HTTP 2.0 目标是显著改善性能,同时做到迁移透明。我们先来理解几个 HTTP 2.0 的相关前置基础概念:

最主要的特性如下。

HTTP 和 WebSocket 都是应用层协议,都是基于 TCP 协议来传输数据的。WebSocket 依赖一种升级的 HTTP 协议进行一次握手,握手成功后,数据就直接从 TCP 通道传输。

这样一来,连接的发起端还是客户端,但是一旦 Websocket 连接建立,客户端和服务端任何一方都可以向对方发送数据。

Webscoket 无疑是强大的,但是它也错过了浏览器为 HTTP 提供的一些服务,需要开发中在使用时自己实现。因此 WebSocket 并不能取代 HTTP。

由此看出,HTTP 的发展不是封闭的,而是吸取了「民间方案」和各种应用技术所长。尤其是 HTTP 2.0 更是一个极大的补充和优化。在下一部分,我们对 HTTP 和 Tcp. 以及相关内容以面试题的方式在进行巩固。

相关深度面试题目

题目一:「HTTP 连接分为长连接和短连接,而我们现在常用的都是 HTTP 1.1,因此我们用的都是长连接。」这种说法正确吗?

其实这句话只对了后半句:我们现在大多应用 HTTP 1.1,因此用的都是长连接,这种说法勉强算对,因为 HTTP 1.1 默认 Connection 为 keep-alive。但是 HTTP 协议并没有长连接、短连接之分,所谓的长短连接都是在说 TCP 连接,TCP 连接是一个双向的通道,它是可以保持一段时间不关闭的,因此 TCP 连接才有真正的长连接和短连接这一说。

这个可以回到网络分层的话题上,HTTP 协议说到底是应用层的协议,而 TCP 才是真正的传输层协议,只有负责传输的这一层才需要建立连接。

题目二:长连接是一种永久连接吗?

事实上,长连接并不是永久连接的,在长连接建立以后,如果一段时间内没有 HTTP 请求发出,这个长连接就会断掉。这个超时的时间可以在 header 中进行设置。

题目三:现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?

在 HTTP 1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但 HTTP 1.1 中,默认开启 Connection:keep-alive,浏览器和服务器之间是会维持一段时间的 TCP 连接,不会一个请求结束就断掉。除非显式声明:Connection: close。

题目四:一个 TCP 连接可以对应几个 HTTP 请求,这些 HTTP 请求发送是否可以一起发送?

不管是 HTTP 1.0 还是 HTTP 1.0,单个 TCP 连接在同一时刻只能处理一个请求,意思是说:两个请求的生命周期不能重叠,任意两个 HTTP 请求从开始到结束的时间在同一个 TCP 连接里不能重叠。也就是上面说的「队头阻塞」。

虽然 HTTP 1.1 规范中规定了 Pipelining 来试图解决这个问题,但是这个功能在浏览器中默认是关闭的。

因此,在 HTTP 1.1 中,一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应),收到请求的服务器必须按照请求收到的顺序发送响应。HTTP 2.0 中,由于 Multiplexing 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。

总结

这一讲中,我们从 HTTP 的发展角度,解析了当前 HTTP 协议的现状和痛点,并详细介绍了 HTTP 2.0 相关内容。

后面部分,从实时通信系统网络协议层面的解析,又一次巩固了相关知识。

到此,我们在理论层面已经有了必要的知识储备。在整个课程完结时,感兴趣的同学可以跟我亲自动手,实践一下 HTTP 2.0,让我们从实战角度,探究一下「HTTP 2.0」的众多特性到底能不能优化应用。

上一篇 下一篇

猜你喜欢

热点阅读