在说HTTP2.0特性之前,我觉得得先了解HTTP1.0和HTTP1.1他们的特性,
简单可读性高:
HTTP/1.0采用明文文本形式进行通信,请求和响应消息都是以可读性很高的ASCII文本形式传输,使得开发人员和网络分析工具能够方便地理解和调试。
单连接请求-响应模式:
HTTP/1.0每次请求和响应都需要建立一个新的TCP连接,完成后立即关闭连接。这种非持久连接的方式保证了每个请求都是独立的,但也带来了一些性能上的问题。
连接建立开销大: 由于HTTP/1.0采用了非持久连接的方式,每次请求都需要重新建立TCP连接,这增加了很多开销,包括DNS解析、三次握手等。对于频繁的请求,连接建立过程会显著影响性能。
举例说明:假设一个网页中包含多张图片,每张图片都需要通过独立的HTTP请求获取。在HTTP/1.0中,每次请求都需要重新建立TCP连接,导致额外的网络延迟和连接管理开销。
队头阻塞(Head-of-line blocking): HTTP/1.0的非持久连接方式,使得后续请求必须等待前面的请求响应完成后才能进行。如果某个请求响应时间较长,那么后续请求就会被阻塞,浏览器无法并行发送和处理其他请求,降低了整体性能。
举例说明:假设一个网页中同时包含多个资源请求,其中一个资源请求的响应时间较长,那么其他资源请求不得不等待,整体页面加载速度受到影响。
缺乏压缩和缓存支持: HTTP/1.0没有内置的压缩和缓存机制。每次请求和响应传输的数据都是完整的,无论是否已经存在于浏览器的缓存中,都需要传输整个内容,这样无形中增加了带宽消耗和等待时间。
举例说明:假设一个网页中包含多个相同的静态资源(如CSS文件),在HTTP/1.0中,每次请求都需要传输完整的文件内容,即使文件已经被缓存过,仍然会导致不必要的数据传输。
HTTP/1.0作为Web发展的里程碑之一,其特性为Web应用程序的发展提供了基础。然而,由于非持久连接方式和其他局限性,HTTP/1.0在性能和效率方面存在一些不足之处。为了解决这些问题,后来的HTTP版本如HTTP/1.1以及更高版本开始引入了新的特性和改进,提高了网络通信的效率和安全性。
HTTP(超文本传输协议)是Web应用程序使用的一种协议,它规定了浏览器和Web服务器之间如何通信。HTTP/1.1是当前Web中使用最广泛的版本,它具有一些特定的限制和问题。本篇博客将介绍HTTP/1.1的特性和不足,并举例说明。
1.持久连接:在HTTP/1.0中,每个请求都需要建立一次连接,而在HTTP/1.1中,可以通过持久连接来复用TCP连接,避免了每次请求都要建立新的连接,从而提高了通信效率。
2.管线化:HTTP/1.1支持管线化,即在同一个TCP连接上并行发送多个请求,从而减少了请求的等待时间,提高了网络传输的效率。
3.分块编码:HTTP/1.1支持分块编码,即将数据分成多个部分(块),每个部分都以16进制的方式标识大小,并使用CRLF分隔。这样可以让Web服务器边接收文件边发给客户端,减少客户端等待时间。
1.head-of-line阻塞:HTTP/1.1使用管线化技术可以并行发送多个请求,但是请求的顺序必须按照发送的顺序进行处理,这就导致了head-of-line阻塞问题。当其中一个请求被阻塞时,其后的请求就无法继续进行,从而影响了整个通信的效率。
举例说明:假设客户端发送了三个请求A、B、C,但是请求A遇到了网络延迟,这样就导致了head-of-line阻塞,请求B和请求C必须等待请求A结束才能继续处理,从而造成了等待时间的浪费。
2.安全性问题:HTTP/1.1是明文传输的,即客户端和服务器之间的通信信息都是明文形式传输的,容易被第三方窃取或篡改,存在安全隐患。虽然可以通过HTTPS等方法进行加密传输,但是增加了通信的复杂度和开销。
举例说明:假设客户端和Web服务器之间的通信信息包含用户账号和密码等敏感信息,如果使用HTTP/1.1进行传输,则很容易被黑客截取并窃取敏感信息。
3.资源浪费:在HTTP/1.1中,每个文件都需要单独请求和响应一次,如果要下载多个文件,就需要多次请求和响应,这样就会浪费大量的资源和时间。
举例说明:如果客户端需要下载多个文件,比如图片和CSS等静态资源,那么就需要发送多次请求和接收多次响应,这样会造成网络带宽资源的浪费。
综上所述,虽然HTTP/1.1在网络传输中有较大的优势,但是存在一些问题和不足。其中head-of-line阻塞、安全性问题和资源浪费是用户在使用HTTP/1.1时经常遇到的问题,为了更好地提高网络传输的效率和安全性,需要不断改进和升级。
HTTP 2.0 相比于 HTTP 1.X,可以说是大幅度提高了 web 的性能,具体在以下几个方面。
1.二进制分帧
HTTP/2.0通过对数据的分帧,将请求和响应数据分解为更小的帧。“二进制”是指这些帧的大小和内容都是以二进制编码方式传输的。这样做的好处是可以让某个大的请求或响应被切分成多个帧后同时发送到服务器或浏览器上,从而可以提高并发性,避免阻塞。
2.多路复用
在 HTTP 1.X 中,我们会引入雪碧图,精灵图、将小图内联等等的方式提高页面性能,这些是因为浏览器限制了同一个域名下的请求数量,当页面中需要请求很多资源的时候,队头阻塞(Head of line blocking)会导致在达到最大请求数量时,剩余的资源需要等待其他资源请求完成后才能发起请求。
HTTP/2.0允许在同一连接上并行发送多个请求和响应。这相当于打开了一个管道,所有已经发送的请求和响应帧都可以混杂地传输,任何一帧到达接收端后可以被拼接起来重新还原成完整的请求或响应。这个特性可以有效避免在HTTP/1.x中出现的head-of-line阻塞问题,提高了性能。
3.服务器推送
HTTP/2.0支持服务器推送,即服务器会在收到客户端请求后,主动推送一些可能需要的资源给客户端,避免了客户端重复的请求。例如,当客户端请求某个HTML文件时,服务器可以同时将该HTML文件所需的CSS和JS文件一起推送给客户端。这样不仅可以减少延迟,还可以避免客户端因为请求太多而被阻塞
服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,服务器不会随便推送第三方资源给客户端。
4…头部压缩
在HTTP/1.x中,头部元数据都是以纯文本的形式发送的,通常会给每个请求增加500~800字节的负荷。
比如说cookie,默认情况下,浏览器会在每次请求的时候,把cookie附在header上面发送给服务器。(由于cookie比较大且每次都重复发送,一般不存储信息,只是用来做状态记录和身份认证)
HTTP/2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟。
我前面文章讲到了HTTP的无状态特性,即HTTP是无状态的,因为无状态不能保存状态信息,所以前后两个请求之间不能共享一些关键信息,比如用户的权限不同提供不同的请求服务,这个光靠HTTP协议本身是没办法做到的,所以需要我们借助session,cookie去实现,当然,这个特性在HTTP2.0也没变化,可以说是HTTP协议的共同特性了