bc-2-HTTP2.0和HTTP1.1有啥区别??
- 最大区别在于:HTTP1.1无法做到请求响应并发传输
- HTTP2.0使用stream的方式进行数据传输,不同的请求和响应可以在不同的Stream进行传输,多个Stream流可以在一个TCP进行复用,实现了并发传输
- 报文格式
- 报文头部使用了HPACK算法进行压缩,同时改进了HTTP1.1报文格式使用纯文本格式进行数据传输,HTTP2.0使用二进制的方式进行数据传输,提高了传输效率
- 服务器主动推送
- HTTP2.0可以让服务器主动推送资源,客户端在服务器中获取HTML页面,服务器会根据页面内容主动推送CSS、JS等等资源,减少了消息传递次数
TCP队头阻塞问题
传统场景(HTTP/1.1)
想象一条单车道的路,快递员必须按顺序配送包裹:
- 第1个包裹送到A家,第2个包裹送到B家,第3个包裹送到C家
- 如果A家没人,快递员就得一直等,后面所有包裹都被堵住
- 即使B家、C家都在家等着,也收不到包裹
这里就显示了HTTP1.1在传输方面的软肋,如果中间有一个请求时间上出现了问题,后续的请求都会因为这个请求而阻塞,即使HTTP1.1是请求管道化传输,但是响应必须按照顺序性进行接受。
HTTP/2的改进
现在路变成了多车道高速公路:
- 可以同时派多个快递员配送不同包裹
- A家没人时,其他快递员继续给B家、C家送货
- 看起来问题解决了
但TCP队头阻塞依然存在
问题在于,所有快递员都必须走同一条底层道路(TCP连接):
场景1:道路塌方
- 如果底层道路某处塌方(网络丢包),所有快递员都过不去
- 即使你的包裹已经准备好,也得等道路修好才能送达
场景2:收费站堵车
- TCP需要保证数据包的顺序,就像收费站要按顺序放行车辆
- 如果前面某个数据包丢失了,后面所有数据包都得等着
- 即使后面的数据包都正常到达,也不能先处理
这里丢包了,但是要保证TCP数据接受的顺序性,所以需要等待其他请求传输完毕才可以交给浏览器进行渲染
请求A: [包1] [包2] [丢失❌] [包4] [包5]
请求B: [包1] [包2] [包3] ✅ (全部到达)
请求C: [包1] [包2] ✅ (全部到达)
结果: 即使B、C的数据都完整到达,浏览器也必须等A的包3重传成功
因为TCP队头阻塞问题,HTTP3.0解决了这个问题,使用了基于UDP协议的QUIC协议。
QUIC让每个请求流都独立传输,一个流的网络问题不会影响其他流。
HTTP/3.0
HTTP/3.0和其他HTTP协议版本号的区别是啥?
- 传输协议不同
- 建立连接的次数
- 网络环境切换不需要进行重新连接