文中摘自微信公众平台「三分钟学前面」,创作者sisterAn。转截文中请联络三分钟学前面微信公众号。
前言
文中分成下列三一部分由浅入深走入 HTTP/1.x 的 keep-alive 与 HTTP/2 多路复用:
- HTTP/1.x keep-alive 是什么
- HTTP/2 多路复用
- HTTP/1.x keep-alive 与 HTTP/2 多路复用差别
下边正式开始吧
HTTP/1.x keep-alive 是什么
在一文走入 TCP 与 HTTP 中,大家详细介绍过,HTTP 协议是构建在 TCP 协议上的网络层协议, HTTP 协议最开始是一个十分简单的协议,通信方式也是采用简单的请求-回复的方式,即:手机客户端与服务端的的每一次请求都必须创建 TCP 连接,网络服务器回应后断掉 TCP 连接,再请求再创建断开。
在 HTTP/0.9 与 初期 HTTP/1.0 中,默认设置的也是这类,但这种经常的创建、断掉连接毫无疑问是很大的耗费特性
TCP连接的新创建成本费很高,由于手机客户端和网络服务器创建连接时必须“三次握手”,推送 3 个数据,必须 1 个 RTT;关掉连接是“四次挥手”,4 个数据必须 2 个 RTT,而且逐渐时推送速度比较慢(slow start),伴随着网页页面载入的外界資源愈来愈多,这个问题就更加突显了
因此 HTTP/1.0 引进了 keep-alive 长连接,HTTP/1.0 中是默认设置关掉的,可以根据 Connection: keep-alive; 打开 ,HTTP/1.1 默认设置是开始的,无论加没加 Connection: keep-alive;
所说长连接,即在 HTTP 请求创建 TCP 连接时,请求完毕,TCP 连接持续开,持续保持一段时间(timeout),在这段时间内,同一手机客户端向服务器发送请求都是会重复使用该 TCP 连接,并重设 timeout 時间计数,在下面 timeout 時间内还能够再次重复使用 TCP 。那样毫无疑问省去了不断创建和消毁 TCP 连接的耗损。
timeout 时间到了以后,TCP会马上断掉连接吗?
若两小时(timeout)沒有接到用户的数据信息,网络服务器就推送一个检测报文格式段,之后则每过 75 秒推送一次。若一连发送 10 个检测报文格式段后仍无用户的回应,网络服务器就觉得手机客户端出了常见故障,然后就关掉这一连接。
——节选自谢希仁《计算机网络》
HTTP/2 多路复用
为何 HTTP/2 引进多路复用?
这是由于:
- HTTP/1.x 尽管加入了 keep-alive 长连接,但它每一次请求务必等候上一次回应以后才可以进行,
- 因此,在 HTTP/1.1 中明确提出了管路体制(默认设置不打开),下一次的请求不用等候上一个回应来以后再推送,但这规定服务器端务必依照请求推送的次序回到回应,当次序请求好几个文档时,在其中一个请求由于种种原因被堵塞时,在后面排长队的全部请求也一并被堵塞,这就是队头阻塞 (Head-Of-Line Blocking)
- 大家采用了许多方式去处理,例如应用好几个网站域名、引进雪碧图、将小图片内联等,但也没有从源头上解决困难
HTTP/2 是怎么做的喃?
- 最先它引进了 帧(frame)和流(stream),由于 HTTP/1.x 是根据文字的,由于是文字,就致使了它一定是个总体,在传送是不能分割的,只有总体去传
- 即然,HTTP/2 是根据二进制流的,它就可以把 HTTP 信息溶解为独立自主的帧,交叠推送,随后在另一端根据帧中的标志再次拼装,这就是多路复用
- 这就完成了在同一个TCP连接中,同一时时刻刻可以推送好几个请求和回应,且无需依照次序一一对应,即使某一请求每日任务用时比较严重,也不会危害到其他连接的一切正常实行
HTTP/1.x keep-alive 与 HTTP/2 多路复用差别
总结一下,HTTP/1.x keep-alive 与 HTTP/2 多路复用区别:
- HTTP/1.x 是根据文字的,只有总体去传;HTTP/2 是根据二进制流的,可以转化为独立自主的帧,交叠推送
- HTTP/1.x keep-alive 务必依照请求推送的次序回到回应;HTTP/2 多路复用不按顺序回应
- HTTP/1.x keep-alive 为了更好地处理队头堵塞,将同一个网页的資源分散化到不一样网站域名下,打开了好几个 TCP 连接;HTTP/2 同网站域名下全部通讯都是在单独连接上进行
- HTTP/1.x keep-alive 单独 TCP 连接在同一时时刻刻只有正确处理一个请求(2个请求的生命期不可以重合);HTTP/2 单独 TCP 同一时时刻刻可以推送好几个请求和回应
来源于:https://github.com/Advanced-Frontend/Daily-Interview-Question