透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

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

Chrono 2019-07-05
第 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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(48)

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

    作者回复: 队头阻塞在http和tcp层次都有,原因不同。

    你说的是tcp队头阻塞,而http的队头阻塞是因为它的请求-应答模式,当然它运行在tcp上,就有两种队头阻塞。

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

    作者回复: 总结的不错。

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

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

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

    作者回复: 域名分片解决的是客户端并发的问题,可以创建更多的连接。

    比如浏览器限制一个域名最多6个连接,域名分3片,那么浏览器就可以同时建立18个连接,显然就能够并发更多请求,获取数据也就快了。

    2019-08-05
    4
  • 衬衫的价格是19美元
    服务器或者客户端是怎么是判断一个连接的呢?是不是有一个id来对应一个连接?一个连接具体是什么东西呢?是双方在内存中开辟的空间吗?

    作者回复: http里的连接通常就是tcp连接,也就是调用socket api打开的一个套接字,可以理解成一个流式文件的句柄,可读可写,但数据都是在网络上。

    想要理解清楚应该去看一下tcp/ip相关的资料。

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

    作者回复: “高并发请求”是服务器端的概念,意思是同时有多个客户端连接服务器。

    课程里的“并发连接”是客户端的概念,意思是一个浏览器并发多个连接,访问服务器。

    负载均衡是服务器端的概念,就是把大量的客户端连接均匀分散到集群里的多台服务器。

    2019-07-05
    3
  • -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
    3
  • 小炭
    浪费的时间就是“3÷5=60%” 这个算法不是很理解,分子/分母是怎么来的

    作者回复: tcp握手是1个rtt,挥手是2个rtt,这就是3个没有数据传输的时间,实际的数据传输是2个rtt。

    一次短连接总共5个rtt,所以浪费的就是tcp握手挥手的3个,除以总共的5个。

    2019-11-15
    2
  •        鸟人
    拒绝服务应该是dos ddos是分布式dos

    作者回复: 感谢指正。

    2019-07-29
    2
  • Edward_Elric
    用3÷5=60%来理解 3÷9≈33% 有点解释不通,分子3个RTT是长连接的握手和挥手的损耗,分母9个RTT是假如此次是短连接会浪费9个,3/9 说是长连接的浪费率不对吧、(浪费/总的=浪费率).不明白3÷9≈33% ,求老师解释,谢谢!

    作者回复: 9=长连接握手挥手的3+长连接三次http请求响应的6,所以浪费率是3÷9。

    2019-12-02
    1
  • answer宫
    老师 ,请问为什么此请求是两个RTT啊,我理解一个就够了啊,一次请求,一次响应,一来一回就ok了吧,没有想通为什么是2个RTT

    作者回复: 在tcp层次,发出一个包会返回一个确认收到的ack包,这就是一个rtt。

    如果在http层次,那么看不到ack,所以一个请求一个响应是一个rtt。

    层次不同,对rtt的理解就不一样,这里说的是tcp层次。

    2019-11-21
    1
  • 老师看下我总结的对不对,谢谢!
    短连接:每次“请求-响应”都先建立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
    1
    1
  • 李扬翼
    老师,http2在应用层解决了队头阻塞,那TCP传输层的队头阻塞如何解决呢?

    作者回复: 这就要看QUIC和HTTP/3了,请参考飞翔篇。

    2019-09-30
    1
  • 狼的诱惑
    老师好,请教个问题:
    分别通过三个客户端请求同一个服务接口
    1、启动一个自定义服务接口
    2、浏览器发起请求,抓包后发现会有通过客户端向服务端做心跳检测机制也就是发送(keep-alive),时间间隔比较长大概是5秒以上一次
    3、postman发起请求,抓包后发现会有通过客户端向服务端做心跳检测机制也就是发送(keep-alive),平均一秒一次,然后在60秒后,服务器主动断开了连接
    4、RestTemplate发起请求,请求成功,链接关闭

    问题
    1、60秒是谁设置的60秒?
    2、服务器如何实现一段时间没有消息,超时断开连接呢?
    3、服务器默认支持长连接是谁实现的?tomcat吗?RestTemplate 又如何配合 ?

    作者回复:
    1.通常超时时间都是服务器设置的,应该是在自定义服务里。

    2.方法很多,比如使用一个定时器,当超时后检查连接,没有数据收发就关闭。

    3.服务器实现长连接管理,客户端不需要关心,连接关闭客户端会收到通知。

    2019-08-09
    1
  • 狼的诱惑
    老师好,请教个问题
    1.请求/17-1返回长连接标识,我理解http是一个比较灵活的协议,是一套标准,前面老师也讲过需要请求与应答方都支持长连接才行,那么服务器是如何支持(实现)长连接的??
    2.一路看了这么多篇,貌似只有讲到响应后的报文格式,没有看到从请求到应答完整实现,例子都是老师提前准备好的,例子这部分会详细讲解吗??

    作者回复:
    1.长连接就是在服务器里保存连接的状态不关闭,也就是不调用close关闭,就实现了长连接,其实很简单。

    2.第8讲应该是一个完整的请求响应吧,不知道有没有满足你的要求。而且这些例子都是请求响应对应的,哪里还要再讲解,可以再说清楚一点。

    2019-08-09
    1
  • 徐海浪
    1. 在开发基于 HTTP 协议的客户端时应该如何选择使用的连接模式呢?短连接还是长连接?
    根据请求的频繁程度来选择连接模式。一次性的请求用短链接,频繁与服务端交互的用长连接。
    2. 应当如何降低长连接对服务器的负面影响呢?
    长连接会长期占用服务器资源,根据服务器性能设置连接数和长连接超时时间,保证服务器TCP资源使用处于正常范围。

    作者回复: √

    2019-07-07
    1
  • 许童童
    老师:请教一个问题。为什么我看很多网站HTTP请求都没有返回头里都没有Connection: Keep-Alive。有的网站却有。那些没有返回的是没有使用长连接吗?

    作者回复: 默认是长连接,可以省略。

    2019-07-05
    1
  • WL
    请问一下老师域名分片技术是不是让一个浏览器跟不同的域名都建立长连接, 而这些域名都指向同一个服务器集群?

    作者回复: 前半句对,后半句不一定,也可能是镜像集群。

    2019-07-05
    1
  • 周曙光爱学习
    老师请教一个问题: 长连接肯定是客户端(ip:port)和某个服务器(ip:port)建立的,比如我们访问某个域名,但是这个域名背后可能有多个服务器,应该怎么理解这个这个长连接建立的双方呢?

    作者回复: 域名会映射为多个ip,但tcp建立连接只能是与一个特定的ip,所以长连接就是与这个连接保持的,ip地址的选择策略可以由客户端或者域名服务器某一方来决定。

    因为这个服务器的ip地址属于这个域名,所以可以理解为与域名保持了长连接。

    2019-12-07
  • 李鑫磊
    请问老师“开发基于 HTTP 协议的客户端”是什么意思?

    作者回复: 意思是客户端使用http协议与服务器通信,而不是使用tcp/udp等下层协议。

    2019-11-30
收起评论
48
返回
顶部