当前位置: 首页 > 科技观察

知道HTTP-1.xkeep-alive吗?它与HTTP-2多路复用有何不同?

时间:2023-03-18 17:57:38 科技观察

本文转载自微信公众号《三分钟学会前端》,作者安姐。转载本文请联系三分钟学习前端公众号。简介本文分为以下三个部分一步步进入HTTP/1.x保活和HTTP/2多路复用:HTTP/1.x什么是保活HTTP/2多路复用HTTP/1.x之间的区别keep-alive和HTTP/2多路复用下面正式开始。什么是HTTP/1.xkeep-alive?在本文中,我们介绍了TCP和HTTP。HTTP协议是建立在TCP协议之上的应用层。协议,HTTP协议起初是一个非常简单的协议,通信方式也采用短应答请求-响应模式,即客户端和服务器之间的每次请求都需要建立一个TCP连接,服务器断开连接响应后的TCP连接。请求再次重新创建断开连接。在HTTP/0.9和早期的HTTP/1.0中,这是默认的,但是这种频繁的创建和断开无疑是对性能的极大消耗。建立一个新的TCP连接的代价是非常高的,因为客户端和服务端建立连接时需要进行一次“三次握手”,发送3个数据包需要1个RTT;关闭连接是“四波”,4个数据包需要2个RTT,一开始发送速率慢(slowstart),随着网页加载的外部资源越来越多,这个问题变得更加突出。因此,HTTP/1.0引入了keep-alive长连接,在HTTP/1.0中默认是禁用的,可以通过Connection:keep-alive;HTTP/1.1默认开启,不管是否添加Connection:keep-alive;所谓长连接是指当HTTP请求建立TCP连接后,请求结束,TCP连接没有断开,继续保持一段时间(超时)。在此期间,当同一个客户端向服务端发送请求时,TCP连接会被重用,超时计数器会被重置,在下一个超时时间内可以继续重用TCP。这无疑省略了重复创建和销毁TCP连接的损失。超时时间到后,TCP会不会立即断开连接?如果两个小时内(超时)没有收到客户端的数据,服务器会发送一个检测段,然后每隔75秒发送一次。如果连续发送10个检测段后仍然没有客户端响应,则服务器认为客户端故障,然后关闭连接。——摘自谢希仁《计算机网络》HTTP/2多路复用为什么HTTP/2引入多路复用?这是因为:虽然HTTP/1.x引入了keep-alive长连接,但是它必须在每个请求都等待一个响应才能发起。因此在HTTP/1.1中提出了管道机制(默认不开启)。下一个请求不需要等上一个response发送完才发送,但这需要服务器按照请求发送的先后顺序返回。响应,当依次请求多个文件时,当其中一个请求因为某种原因被阻塞时,后面排队的所有请求也都被阻塞,这就是Head-Of-LineBlocking。解决的方法很多,比如使用多个域名,引入sprite图片,内联小图片等等,但是都没有从根本上解决问题。HTTP/2是如何做到的?首先,它介绍了帧和流。),因为HTTP/1.x是基于文本的,因为是文本,所以必须是一个整体,在传输中不能切分,所??以只能整体传输。由于HTTP/2是基于二进制流的,所以HTTP消息可以分解成独立的帧,交错发送,然后通过帧中的标识符在另一端重新组装。这就是多路复用。这使得可以在同一个TCP连接中同时发送多个请求和消息。响应,并且不需要按顺序一一对应,即使某个请求任务耗时较长,也不会影响其他连接的正常执行。HTTP/1.x保活和HTTP/2多路复用的区别总结一下,HTTP/1.x保活和HTTP/2多路复用的区别:HTTP/1.x是基于文本的,只能传输作为一个整体;HTTP/2基于二进制流,可以分解成独立的帧,交错发送HTTP/1.xkeep-alive必须按照请求发送的顺序返回响应;HTTP/2多路复用不按顺序响应HTTP/1.xkeep-alive为解决队头阻塞,将同一页面的资源分散开不同域名下的多个TCP连接;HTTP/2同一个域名下的所有通信都在单个连接上完成HTTP/1.xkeep-alive单个TCP连接一次只能处理一个请求(两个请求的生命周期不能重叠);HTTP/2单TCP可以同时发送多个请求和响应来自:https://github.com/Advanced-Frontend/每日面试题