HTTP0.9
http中文:超文本传输协议。这是因为在http诞生之初只是为了传输html,没有其他复杂的功能,没有请求头和请求体,只有请求行。
后来随着互联网的发展,http要传输的文件类型增多,功能变得越来越复杂,就诞生了http1.0。
HTTP1.0
http要实现的功能增多,就增加了请求头和请求体
建立一次连接请求一次数据。但是一个域名最多只能建立6个连接,有多余的连接就要等待,称为队头阻塞。所以采用了CDN,域名分片的优化,这样资源的请求就可以从多个域名获取
但是这样也存在问题,虽然可以建立多个连接,但是一个页面可能需要请求的资源也越来越多,建立一个连接发送一次数据的效率太低了。TCP连接的复杂有多余的消耗
CDN原理:
CDN广泛采用缓存服务器,将缓存服务器部署到用户访问相对密集的区域,当用户访问时,利用全局负载技术,将用户访问重定向到离用户最近的正常工作的缓存服务器。该缓存服务器直接提供相应的响应
因此就有了http1.1的诞生
HTTP1.1
http1.1采用了长连接的形式解决了建立一次连接只发一次的低效率问题,通过设置字段connection:keep-alive,现在默认就是这个值,就是开启长连接的一次。
这样就减少了建立连接的过程中的资源消耗。但是http1.1依旧还是存在问题。
虽然改成了长连接,但是依然是一个请求完成了以后,后面的才可以执行。依旧有队头阻塞的可能,而且多个TCP连接竞争资源
为了解决这个问题就有了http2.0的诞生
HTTP2.0
http2.0在http和tcp之间加了一个二进制分帧层,将请求或者响应分成一个个二进制帧(之前请求和响应是以文本的形式传输的,文本形式很多,需要考虑的场景就很多)
虽然将报文分成一个个帧,但是同一个报文,有同一个ID,当接收端收到之后,就知道这个几个帧是同一个报文,然后将他们组合起来。
多个帧在一个信道中随意发送(减少了建立TCP连接的消耗),但是共享一个信道就会有一个问题,只要信道中出现丢包的情况,就会影响其他帧的发送。当丢包率达到一定程度,就会导致传输效率下降,甚至低于http1.1的效率
http2.0还进行了头部压缩的优化(两端维护了索引表,用于存储出现过的header,如果后面再次使用,就可以直接使用键名),以及服务器push(当客户端请求某个资源的时候,服务器知道有的资源是一定会请求的,就会主动push,减少请求)
HTTP3.0
因为TCP的限制,导致http的效率没办法继续提高。所以http3.0采用了UDP无连接的方式。
QUIC协议实现了多路复用,拥塞控制,集成了TLS,实现了多路复用和快速握手的功能。
但是因为支持情况差,部署难度大,实现起来难度很大。
如若有误,请务必指正,万分感谢
如若可以,敬请点赞,万分感谢