在公司的第一天晚上就被拉去开会,一个日志分析系统,使用者反馈说查询速度过慢,加载全部数据要很久,最慢的几个请求要30多s才返回,经过排查否定了响应数据过大、服务器处理数据时间长(ES聚合)等问题,最终发现是请求数过多导致请求排队时间过长,大概5/6的时间都花在排队上了。这个时候提出的解决方案是聚合请求,通过减少请求个数来减少排队时间。
我并没有亲眼见到后来的处理结果,不过感觉应该是有用的。
影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟。
带宽:带宽也就是网速,现在我们不再会担心由带宽而影响网速,那么就只剩下延迟了。
延迟:
-
浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有 2-8 个连接(浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。
-
DNS 查询(DNS Lookup):浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是 DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的。
-
建立连接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
具体如图:
下图是一些浏览器对于同域名的最大并发数:
通常的优化网站加载速度的方法是采用多个域名增加浏览器对同一网页的请求并发连接数。
还有一个重要的点:HTTP协议版本也是影响响应速度的重要因素。
众所周知,HTTP协议也是在不断的优化的:
HTTP1.0(短连接)、HTTP1.1(长链接)、HTTP2.0(多路复用)、HTTP3.0(基于QUIC和UDP,尚未普及)。
HTTP2的一些主要更新是:
-
服务器推送:服务器将主动向客户端发送组件,因此客户机不需要等待向服务器发送请求。
-
多路复用:通过捆绑来自客户端和发送到服务器的多个HTTP请求来减少活动连接的数量。
-
加密:通过HTTP/1.1高效地使用HTTP/2中的TLS协议进行加密。
-
HTTP头压缩:压缩头部将减少对Web服务器的额外请求的开销。
HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?
-
HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;
-
HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;
-
HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;
HTTPS与HTTP的一些区别:
-
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
-
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
-
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
-
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
今天,为提高我的个人博客加载速度,配置使用HTTP2协议,使用HTTP2要基于HTTPS。博客基于apache运行,以下为配置方法:
在ssl.conf增加
Protocols h2 http/1.1
参考:
https://cloud.tencent.com/developer/article/1791248
https://www.cnblogs.com/heluan/p/8620312.html (建议阅读)
推荐阅读:https://blog.youkuaiyun.com/m0_46171043/article/details/115167824
https://blog.youkuaiyun.com/joely1/article/details/125567301