17 | 排队也要讲效率:HTTP的连接管理
17 | 排队也要讲效率:HTTP的连接管理
讲述:Chrono
时长10:24大小14.27M
短连接
长连接
连接相关的头字段
队头阻塞
性能优化
小结
课下作业
赞 48
提建议
精选留言(86)
- TerryGoForIt2019-07-05老师您好,我想对于 队首阻塞 的问题,应该从 TCP 层面去解释会比较好一点吧。 > 以下引用自《Web 性能权威指南》 每个 TCP 分组都会带着一个唯一的序列号被发出,而所有分组必须按顺序传送到接收端。如果中途有一个分组没能到达接收端,那么后续分组必须保存到接收端的 TCP 缓冲区,等待丢失的分组重发并到达接收端。这一切都发生在 TCP 层,应用程序对 TCP 重发和缓冲区中排队的分组一无所知,必须等待分组全部到达才能访问数据。在此之前,应用程序只能在通过套接字读数据时感觉到延迟交互。这种效应称为 TCP 的队首阻塞。展开
作者回复: 队头阻塞在http和tcp层次都有,原因不同。 你说的是tcp队头阻塞,而http的队头阻塞是因为它的请求-应答模式,当然它运行在tcp上,就有两种队头阻塞。
共 3 条评论69 - 信信2019-07-06老师能解释下,为什么tcp握手1个rtt,挥手2个rtt吗?
作者回复: 一个来回就是1rtt,三次回收准确来说是1.5个rtt,四次挥手是两个来回,所以是2rtt。
52 - qzmone2019-08-05"多开几个域名,比如 shard1.chrono.com、shard2.chrono.com,而这些域名都指向同一台服务器 www.chrono.com"老师,多开几个域名,最终都是指向一个服务器,那跟都直接连一个服务器的效果一样吧,我感觉对服务器的性能要求一样呀,没有减少后端的压力
作者回复: 域名分片解决的是客户端并发的问题,可以创建更多的连接。 比如浏览器限制一个域名最多6个连接,域名分3片,那么浏览器就可以同时建立18个连接,显然就能够并发更多请求,获取数据也就快了。
51 - 锦2019-07-05一般使用长连接,除非明确知道只会发送一个请求,比如游戏内连接兑换码服务进行礼包兑换。 1,服务器端设置keepalive_timeout表示多长时间没有数据则关闭连接。 2,服务器端设置keepalive_requests,表示该连接上处理多少个请求后关闭连接。 3,服务器端设置最大连接数,当连接达到上限之后拒绝连接,也可以采用限流措施等。 4,客户端设置keepalive_requests,表示该连接上发送多少个连接后关闭连接。 5,客户端设置keepalive_timeout,表示多长时间没有数据发送则关闭连接。 6,客户端设置响应超时后重试次数,当次数达到上限后关闭连接。展开
作者回复: 总结的不错。
34 - 披荆斩棘KK2019-07-05老师,请问高并发请求和并发连接有什么关系吗? 负载均衡解决高并发问题是并发连接吗?
作者回复: “高并发请求”是服务器端的概念,意思是同时有多个客户端连接服务器。 课程里的“并发连接”是客户端的概念,意思是一个浏览器并发多个连接,访问服务器。 负载均衡是服务器端的概念,就是把大量的客户端连接均匀分散到集群里的多台服务器。
共 2 条评论27 - 恒2019-10-13老师看下我总结的对不对,谢谢! 短连接:每次“请求-响应”都先建立tcp连接,完后关闭连接。这样三次握手1.5个rtt,“请求-响应”2个rtt(里面有两个ack),四次挥手2个rtt,效率极低。适用于少次请求,例如客户端只会对某个服务器发送几次请求后就不再发送。 长连接:建立tcp连接后不立即关闭,后续http请求复用这个tcp连接。http/1.1默认开启。如果有大量的空闲长连接只连不发占用资源,可能导致耗尽资源“拒绝服务”即DDoS。因此服务器常会设置超时时间或最大请求数。 这里的“连接”其实是对某个域名的,而不是某个ip或主机。而浏览器对单个域名的并发连接数量有限制,一般为6~8个,所以为了进一步提高连接数就有了“域名分片”技术,即将原来一个域名分成多个域名,但最后指向的服务器还是原来那一台。 例如把www.chrono.com分成shard1.chrono.com, 和 shard2.chrono.com,但还是指向原来那台服务器。这虽然提高了客户端的并发数,但反而增加了服务器端的压力。 连接相关头字段 Connection: keep-alive 在请求头里表明要求使用长连接,在响应头里表明支持使用长连接。 Connection: close 在请求头里表明告诉服务器这次通信后关闭长连接,在响应头里表明服务器将关闭长连接。 [Connection: Upgrade,配合101状态码表示协议升级,例如从http切换到WebSocket]展开
作者回复: 非常完整详细,good。
共 2 条评论21 - 鸟人2019-07-29拒绝服务应该是dos ddos是分布式dos
作者回复: 感谢指正。
15 - 小M2021-03-07个人理解,不能把http的队首阻塞归结于请求-响应机制。 tcp是全双工的,完全可以在一个tcp连接上双端同时进行收发。http只是在tcp连接上流动的一堆数据而已,应用层的数据不存在队首阻塞。问题在于http协议自身:它无法明确的标识出某个rsp是哪个req的。如果服务端不等待上一个req-rsp结束就发出另一个rsp,那么客户端无法区分收到的数据。 单连接上的多路复用也是基于请求-响应机制的,虽然一个连接上同时流动着多个req-rsp的数据,但是应用层协议有序号可以区分出rsp是哪个req的。展开
作者回复: 说的没错,req-rsp这个就是请求响应机制,要求必须一来一回,也就造成了消息必须排队处理。 到了http/2,一个流上只跑一个请求响应,而多个流并行,这个队头阻塞的问题也就迎刃而解了。
共 2 条评论15 - 小炭2019-11-15浪费的时间就是“3÷5=60%” 这个算法不是很理解,分子/分母是怎么来的
作者回复: tcp握手是1个rtt,挥手是2个rtt,这就是3个没有数据传输的时间,实际的数据传输是2个rtt。 一次短连接总共5个rtt,所以浪费的就是tcp握手挥手的3个,除以总共的5个。
共 4 条评论11 - 独钓寒江雪2020-02-01其实感觉本节用地铁站做例子更好: 地铁站相当于服务器; 地铁站有多个出入口,对应域名分片; 每个口有多条道,每条道对应一个连接; 每条道有开和关,对应握手和挥手; 人刷卡通过就传递了数据信息。展开
作者回复: 也挺好,多用不同的比喻可以加强理解。
10 - -W.LI-2019-07-05谢谢老师!讲的很形象,有个问题,长链接。课后小贴士写了区分请求和应答。一个长链接,同一时间只能发送一个请求是么?等到收到服务器响应以后才能被别的请求复用?假如有一个视频的请求一直占着。在分段传输的间隙能发送别的请求么? “域名分片”(domain sharding)技术,具体怎么实现啊后面仔细会讲么?那个域名的比喻没看太懂。是一个浏览器持有同一个服务的,多个负载的链接的意思么(一台服务器8个最多)服务器有集群浏览器创建了8*n个链接。每台负载最多只让一个浏览器连了8个。 域名解析不是DNS服务器做的么,不是直接解析成IP的么还能域名指向域名么?完全不懂展开
作者回复: 1.是的,http是“半双工”,只能一来一回收发数据,这就是队头阻塞的根源。 2.域名分片其实很简单,就是申请多个域名,但这些域名最后都映射到同一个网站服务器,这样就可以突破浏览器的限制,让连接数是8*域名的个数。 3.最后我说的不太确切,应该是shard1、shard2的域名都指向www.xxx.com域名对应的ip地址。 4.域名也可以解析成别名(cname),用于cdn负载均衡,后面会讲到。
11 - 衬衫的价格是19美元2019-07-05服务器或者客户端是怎么是判断一个连接的呢?是不是有一个id来对应一个连接?一个连接具体是什么东西呢?是双方在内存中开辟的空间吗?
作者回复: http里的连接通常就是tcp连接,也就是调用socket api打开的一个套接字,可以理解成一个流式文件的句柄,可读可写,但数据都是在网络上。 想要理解清楚应该去看一下tcp/ip相关的资料。
共 2 条评论9 - MClink2020-04-11老师,我们都知道tcp要三次握手来保证连接成功,但是老是有人问为什么是三次,不是四次,不是五次,如果面试官这么问的话,我们应该怎么回答才能是较为准确呢?我也只能说两次无法确认,三次足够确认,四次就多余了,每三次就是一个有效的循环
作者回复: 因为tcp要一来一回才能确认消息能够正确收发,a端一个来回,然后b端一个来回,最少要三次通信,所以这是最经济的做法。
共 3 条评论7 - Happy-Coming2019-12-21打卡机器比喻非常棒
作者回复: 其实只要是现实中的排队,就免不了队头阻塞。
5 - Hale2020-04-22对头阻塞 是http协议层实现的,还是tcp 中listen(blocklog) 实现的?二者有关系吗?
作者回复: 队头阻塞有两个层面,一个是HTTP的长连接排队请求处理,另一个是TCP的丢包重传机制。 可以再看后面的HTTP/2和HTTP/3。
5 - answer宫2019-11-21老师 ,请问为什么此请求是两个RTT啊,我理解一个就够了啊,一次请求,一次响应,一来一回就ok了吧,没有想通为什么是2个RTT
作者回复: 在tcp层次,发出一个包会返回一个确认收到的ack包,这就是一个rtt。 如果在http层次,那么看不到ack,所以一个请求一个响应是一个rtt。 层次不同,对rtt的理解就不一样,这里说的是tcp层次。
共 4 条评论5 - 徐海浪2019-07-071. 在开发基于 HTTP 协议的客户端时应该如何选择使用的连接模式呢?短连接还是长连接? 根据请求的频繁程度来选择连接模式。一次性的请求用短链接,频繁与服务端交互的用长连接。 2. 应当如何降低长连接对服务器的负面影响呢? 长连接会长期占用服务器资源,根据服务器性能设置连接数和长连接超时时间,保证服务器TCP资源使用处于正常范围。展开
作者回复: √
4 - 李扬翼2019-09-30老师,http2在应用层解决了队头阻塞,那TCP传输层的队头阻塞如何解决呢?
作者回复: 这就要看QUIC和HTTP/3了,请参考飞翔篇。
3 - 许童童2019-07-05老师:请教一个问题。为什么我看很多网站HTTP请求都没有返回头里都没有Connection: Keep-Alive。有的网站却有。那些没有返回的是没有使用长连接吗?
作者回复: 默认是长连接,可以省略。
3 - 钱2020-03-291:在开发基于 HTTP 协议的客户端时应该如何选择使用的连接模式呢?短连接还是长连接? 这个视业务场景而定,只要一次交互就行了,也就是只有一次来回就OK,那就短链接,否则就长连接。 罗老师,请教一下短链接和长链接,表面上的长短是指连接存活的长短,不过如果使用短链接的请求和响应时间比较长时,短链接的存活时间也可能比长链接长的吧?连接的长短核心在于关闭连接的机制而非实际存活长短是吧?当然,一般而言长链接的存活时间是比短链接长的。另外,长链接和回话的存活时间是两个不同的概念吧?他们有什么联系嘛? 2:应当如何降低长连接对服务器的负面影响呢? 使用一定的保护措施,比如:文中讲的按超时时间或请求次数来关闭连接,也可以搞一个连接池来防护服务器。 老师的例子很棒,生动形象跃然于脑,另外,浏览器建立多个连接看评论服务器端口是一个浏览器是随机的,换言之多个连接在浏览器侧是多个端口在服务器侧是一个端口,这是为什么?感觉有些疑惑,另外请教一下一个端口能建立多少个连接?长链接的超时时间一般设置为多少,怎么考虑的?展开
作者回复: 1.是的,短连接指的是一次请求响应后就关闭连接,而不是指时间长短。 2.长连接是在一个连接里发多次请求,而会话是连接之上的概念,可能跨越多个连接,是业务层面的。 3.这方面已经有很多方法了,你说的对。 4.这个是tcp协议的原因,客户端用任意端口,服务器端用固定端口。并发的连接数受服务器的能力、资源限制,如果是Nginx就可以开几万、几十万个并发连接。 5.看具体情况,如果用户频繁交互就长一些,如果服务器能力差就短一些,Nginx默认是60秒。
3