http1的问题:
1.浏览器阻塞,浏览器对于同一个域名同时请求个数是有限制,根据浏览器内核不同,限制请求个数是不一,但基本是个位数,超过请求个数就会阻塞,必须等前面的请求完成
2.DNS查询,域名解析是比较费时的,但通常可以利用DNS缓存来减少域名解析时间,DNS查询顺序为:浏览器缓存-电脑hosts文件-本地DNS服务器-根域名服务器-顶级域名服务器
3.建立连接,http是基于tcp的,每次建立连接需要进行三次握手和四次挥手
http1.1
http1.1比http1多了:
1.长连接(默认开启)
2. 增加了更多的缓存策略,比如,Cashe-Control ,E-Tag、If-None-Match
,HTTP1.0使用的是Expires,last-modified、If-Modified-Since
3.错误通知管理409和410 4.Host头域,在HTTP1.0
中认为每台服务器都绑定一个唯一的IP地址
,因此,请求消息中的URL并没有传递主机名
(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。4.HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
5. 带宽优化:在请求头中多了一个rang的区域,可以更加方便的传输部分数据,充分利用带宽
http1.0和http1.1现存的问题
http1.0
每一次传输数据都需要重新建立连接,延迟较多
传输均为明文,客户端和服务端均无法验证双方身份,存在一定的数据安全
请求的header部分内容较大,增加传输成本,且很多时候header部分是不变的
http1 状态行和头部却没有经过任何压缩,直接以纯文本传输
http1.1
http1.1的长连接+流水线;在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
http1.1长连接默认开启,会对队头堵塞
,可使用pipline多并发但只支持get等幂等请求
队头堵塞:在请求应答过程中,如果出现任何状况,剩下所有的工作都会被阻塞在那次请求应答之后。这就是“队头阻塞”,它会阻碍网络传输和Web页面渲染,直至失去响应
http1.1 流水线(pipline)问题:因为返回的时候是会阻塞的(队头堵塞),并且指定不了优先级,谁先到达,谁先返回,顺序绝对不能乱。另一个pipeline限制是,只能是幂等请求(get、head等)才能应用
虽然http1.1有长连接的功能,但长连接使用过多也给服务端带来了更大的性能压力,特别是对于一些图片类视频类等资源型的服务器,如果长期保持长连接他是没必要的,但给服务器是大的性能浪费
http2.0
http2 多路复用允许单一的 HTTP/2 连接同时发起多重的请求-响应消息
多路复用(多路传输),能同时处理多个消息的请求和响应; 甚至可以在传输过程中将一个消息跟另外一个掺杂在一起。所以客户端只需要一个连接就能加载一个页面。
http1 状态行和头部却没有经过任何压缩,直接以纯文本传输
头部压缩 需要在支持 HTTP/2 的浏览器和服务端之间
node中配置开启http2
http3.0
http3.0区别: 1.将帧的概念下移到了QUIC层 。QUIC特点:TCP 3次握手是1 RTT , 第三次握手才正式开始传输数据 2.不使用tcp协议,使用udp协议(这么说不准确,其实是使用了QUIC协议)
由于当下http3.0还是正式推出,Nginx当前最新版本也不支持配置,所以如果要自己在自己的网站上使用http3.0还是很麻烦的,还得自己编译一个nginx内核。
体验感受一下http3.0请求,只需在最新版本的chrome浏览器,然后给它开启 QUIC 特性即可