切身体会http/2相对于http/1.1的提升

AmsChan ... 2021-10-23 10:02 网络协议
  • HTTP2.0
大约 2 分钟

# 遇到的问题

之前一直在苦恼自己博客首次加载速度巨慢的问题,三十多秒才把博客文章列表加载出来,又不想动源码,所以就在nginx寻找可优化的点。

# 解决过程

一开始尝试了gzip,略有提升,但是效果不大,通过浏览器的devTool发现,个别文件要加载很久,也就是三十多秒,因为http/1.1是单线程串行请求,所以这些请求就阻塞了后面的请求,导致了后面请求一直在等待(?线头阻塞)。

request

然后今早起床,看了一下http/11和http/2的区别,然后就发现了http/2的新特性--多路复用。

http/2多路复用

多个请求可以同时在一个连接上并行进行,请求不会出现阻塞的情况,也就是说,某个请求耗时严重,但是并不会影响到其它请求。

看到这个,完全符合我的需求,兴致勃勃地去nginx配置http2,只需修改一行即可,在 listen 443 ssl 后面添加 http2 default_server

listen 443 ssl http2 default_server;
1

配置完成只会,重载配置 =============> 从发起请求到博客文章列表显示约7s。

相对于之前来说已经有很大的提升了,至于怎么继续提高加载速度只能从其它方面寻找方法了。

# 总结

最后对http/2的新特性做一个简单的总结,总的来说,http/2主要在低延迟方面进行优化。

头部压缩

http/2使用encoder来减小header的大小,另外双方各自缓存一份header fields表,避免header重复发送。

二进制分帧

将所有的传输信息分割成更小的消息和帧并采用二进制编码。

多路复用

同一个tcp连接上允许多个http请求同时进行,避免了http/1.1中出现的线头阻塞问题。

服务端推送

这块还不是特别了解,只知道服务端可以主动向客户端推送资源,并且具有缓存机制,通过html文档的头部判断客户端将要使用的资源,然后由服务端主动推送,从而减少了客户端请求的这一步骤。