透视 HTTP 协议
罗剑锋(Chrono)
前奇虎 360 技术专家,Nginx/OpenResty 开源项目贡献者
63943 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
开篇词 (1讲)
透视 HTTP 协议
15
15
1.0x
00:00/00:00
登录|注册

17 | 排队也要讲效率:HTTP的连接管理

降低长连接对服务器的负面影响
客户端连接模式的选择
服务器资源的负面影响
短连接和长连接的对比
域名分片
并发连接的限制
并发连接
请求的处理速度影响后续请求
先进先出的串行队列
由HTTP基本的请求-应答模型导致
长连接的小缺点
Connection: close
服务器支持长连接
Connection: keep-alive
默认启用长连接
优点:降低时间损耗
分母效应
成本均摊的思路
持久连接、连接保活、连接复用
TCP连接的浪费时间
TCP连接的建立和关闭是昂贵的操作
无连接的协议
HTTP/0.9和HTTP/1.0
课下作业
小结
性能优化
队头阻塞
连接相关的头字段
长连接
短连接
HTTP连接管理

该思维导图由 AI 生成,仅供参考

第 14 讲里,我曾经提到过 HTTP 的性能问题,用了六个字来概括:“不算差,不够好”。同时,我也谈到了“队头阻塞”,但由于时间的限制没有展开来细讲,这次就来好好地看看 HTTP 在连接这方面的表现。
HTTP 的连接管理也算得上是个“老生常谈”的话题了,你一定曾经听说过“短连接”“长连接”之类的名词,今天让我们一起来把它们弄清楚。

短连接

HTTP 协议最初(0.9/1.0)是个非常简单的协议,通信过程也采用了简单的“请求 - 应答”方式。
它底层的数据传输基于 TCP/IP,每次发送请求前需要先与服务器建立连接,收到响应报文后会立即关闭连接。
因为客户端与服务器的整个连接过程很短暂,不会与服务器保持长时间的连接状态,所以就被称为“短连接”(short-lived connections)。早期的 HTTP 协议也被称为是“无连接”的协议。
短连接的缺点相当严重,因为在 TCP 协议里,建立连接和关闭连接都是非常“昂贵”的操作。TCP 建立连接要有“三次握手”,发送 3 个数据包,需要 1 个 RTT;关闭连接是“四次挥手”,4 个数据包需要 2 个 RTT。
而 HTTP 的一次简单“请求 - 响应”通常只需要 4 个包,如果不算服务器内部的处理时间,最多是 2 个 RTT。这么算下来,浪费的时间就是“3÷5=60%”,有三分之二的时间被浪费掉了,传输效率低得惊人。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

HTTP连接管理是一个重要的话题,本文从短连接和长连接两个方面展开讨论。短连接在每次请求-响应后都会关闭连接,导致时间成本高,效率低下。而长连接则通过保持连接状态,降低了时间成本,提高了传输效率。文章还介绍了长连接相关的头字段和连接的关闭策略。此外,还提到了队头阻塞问题,即由HTTP的“请求-应答”模型导致的问题。通过打卡机的比喻,生动形象地解释了这一问题。总的来说,本文通过简单易懂的比喻和技术原理,深入浅出地介绍了HTTP连接管理的重要性和相关概念。文章还介绍了并发连接和域名分片技术,以缓解长连接对服务器的负面影响。通过这些技术手段,可以有效提高传输效率,解决队头阻塞问题,以及减轻服务器负载。在开发基于HTTP协议的客户端时,需要根据实际情况选择适用的连接模式,短连接还是长连接,以及如何降低长连接对服务器的负面影响都是需要考虑的问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《透视 HTTP 协议》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(89)

  • 最新
  • 精选
  • TerryGoForIt
    老师您好,我想对于 队首阻塞 的问题,应该从 TCP 层面去解释会比较好一点吧。 > 以下引用自《Web 性能权威指南》 每个 TCP 分组都会带着一个唯一的序列号被发出,而所有分组必须按顺序传送到接收端。如果中途有一个分组没能到达接收端,那么后续分组必须保存到接收端的 TCP 缓冲区,等待丢失的分组重发并到达接收端。这一切都发生在 TCP 层,应用程序对 TCP 重发和缓冲区中排队的分组一无所知,必须等待分组全部到达才能访问数据。在此之前,应用程序只能在通过套接字读数据时感觉到延迟交互。这种效应称为 TCP 的队首阻塞。

    作者回复: 队头阻塞在http和tcp层次都有,原因不同。 你说的是tcp队头阻塞,而http的队头阻塞是因为它的请求-应答模式,当然它运行在tcp上,就有两种队头阻塞。

    2019-07-05
    3
    75
  • qzmone
    "多开几个域名,比如 shard1.chrono.com、shard2.chrono.com,而这些域名都指向同一台服务器 www.chrono.com"老师,多开几个域名,最终都是指向一个服务器,那跟都直接连一个服务器的效果一样吧,我感觉对服务器的性能要求一样呀,没有减少后端的压力

    作者回复: 域名分片解决的是客户端并发的问题,可以创建更多的连接。 比如浏览器限制一个域名最多6个连接,域名分3片,那么浏览器就可以同时建立18个连接,显然就能够并发更多请求,获取数据也就快了。

    2019-08-05
    2
    57
  • 信信
    老师能解释下,为什么tcp握手1个rtt,挥手2个rtt吗?

    作者回复: 一个来回就是1rtt,三次回收准确来说是1.5个rtt,四次挥手是两个来回,所以是2rtt。

    2019-07-06
    56
  • 一般使用长连接,除非明确知道只会发送一个请求,比如游戏内连接兑换码服务进行礼包兑换。 1,服务器端设置keepalive_timeout表示多长时间没有数据则关闭连接。 2,服务器端设置keepalive_requests,表示该连接上处理多少个请求后关闭连接。 3,服务器端设置最大连接数,当连接达到上限之后拒绝连接,也可以采用限流措施等。 4,客户端设置keepalive_requests,表示该连接上发送多少个连接后关闭连接。 5,客户端设置keepalive_timeout,表示多长时间没有数据发送则关闭连接。 6,客户端设置响应超时后重试次数,当次数达到上限后关闭连接。

    作者回复: 总结的不错。

    2019-07-05
    37
  • 披荆斩棘KK
    老师,请问高并发请求和并发连接有什么关系吗? 负载均衡解决高并发问题是并发连接吗?

    作者回复: “高并发请求”是服务器端的概念,意思是同时有多个客户端连接服务器。 课程里的“并发连接”是客户端的概念,意思是一个浏览器并发多个连接,访问服务器。 负载均衡是服务器端的概念,就是把大量的客户端连接均匀分散到集群里的多台服务器。

    2019-07-05
    2
    28
  • 老师看下我总结的对不对,谢谢! 短连接:每次“请求-响应”都先建立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。

    2019-10-13
    2
    22
  • 小M
    个人理解,不能把http的队首阻塞归结于请求-响应机制。 tcp是全双工的,完全可以在一个tcp连接上双端同时进行收发。http只是在tcp连接上流动的一堆数据而已,应用层的数据不存在队首阻塞。问题在于http协议自身:它无法明确的标识出某个rsp是哪个req的。如果服务端不等待上一个req-rsp结束就发出另一个rsp,那么客户端无法区分收到的数据。 单连接上的多路复用也是基于请求-响应机制的,虽然一个连接上同时流动着多个req-rsp的数据,但是应用层协议有序号可以区分出rsp是哪个req的。

    作者回复: 说的没错,req-rsp这个就是请求响应机制,要求必须一来一回,也就造成了消息必须排队处理。 到了http/2,一个流上只跑一个请求响应,而多个流并行,这个队头阻塞的问题也就迎刃而解了。

    2021-03-07
    2
    19
  •        鸟人
    拒绝服务应该是dos ddos是分布式dos

    作者回复: 感谢指正。

    2019-07-29
    16
  • 小炭
    浪费的时间就是“3÷5=60%” 这个算法不是很理解,分子/分母是怎么来的

    作者回复: tcp握手是1个rtt,挥手是2个rtt,这就是3个没有数据传输的时间,实际的数据传输是2个rtt。 一次短连接总共5个rtt,所以浪费的就是tcp握手挥手的3个,除以总共的5个。

    2019-11-15
    4
    12
  • -W.LI-
    谢谢老师!讲的很形象,有个问题,长链接。课后小贴士写了区分请求和应答。一个长链接,同一时间只能发送一个请求是么?等到收到服务器响应以后才能被别的请求复用?假如有一个视频的请求一直占着。在分段传输的间隙能发送别的请求么? “域名分片”(domain sharding)技术,具体怎么实现啊后面仔细会讲么?那个域名的比喻没看太懂。是一个浏览器持有同一个服务的,多个负载的链接的意思么(一台服务器8个最多)服务器有集群浏览器创建了8*n个链接。每台负载最多只让一个浏览器连了8个。 域名解析不是DNS服务器做的么,不是直接解析成IP的么还能域名指向域名么?完全不懂

    作者回复: 1.是的,http是“半双工”,只能一来一回收发数据,这就是队头阻塞的根源。 2.域名分片其实很简单,就是申请多个域名,但这些域名最后都映射到同一个网站服务器,这样就可以突破浏览器的限制,让连接数是8*域名的个数。 3.最后我说的不太确切,应该是shard1、shard2的域名都指向www.xxx.com域名对应的ip地址。 4.域名也可以解析成别名(cname),用于cdn负载均衡,后面会讲到。

    2019-07-05
    12
收起评论
显示
设置
留言
89
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部