HTTP长连接
创始人
2024-11-05 08:09:44

长连接优点

HTTP为什么要开启长连接呢?
主要是为了节省建立的时间,请求可以复用同一条TCP链路,不用重复进行三握+四挥
如果没有长连接,每次请求都做三握+四挥
在这里插入图片描述
如果有长链接,在一个 TCP 连接中可以持续发送多份数据而不会断开连接,即请求可以复用TCP链路
在这里插入图片描述

长连接缺点

长连接不是万能的,存在队头阻塞

队头阻塞

如果仅仅使用一个连接,它需要发起请求、等待响应,之后才能发起下一个请求。

在请求应答过程中,如果出现任何状况,剩下所有的工作都会被阻塞在那次请求应答之后。
这就是“队头阻塞”,它会阻碍网络传输和Web页面渲染,直至失去响应。

为了防止这种问题,现代浏览器会针对单个域名开启6个连接,通过各个连接分别发送请求。
它实现了某种程度上的并行,但是每个连接仍会受到“队头阻塞”的影响

pipline

为解决队头阻塞,提出 pipline 方案
虽然在一个 tcp 链路中实现多个 http 并发,但因为该方案有缺陷,大部分浏览器默认关闭 pipeline

其一:是因为返回时会阻塞,谁先发送,谁先返回,顺序绝对不能乱
其二:只能是请求(get、head等)才能应用 pipeline
在这里插入图片描述

HTTP开启长连接

C

开启 HTTP 长连接,对前端很简单,方式如下:
协议 开启 关闭
HTTP1.0 Connection: keep-alive 默认
HTTP1.1 默认 Connection: close

S

Keep-Alive 需要服务端支持:
Httpd 守护进程,如 nginx 需要设置 keepalive_timeout
keepalive_timout 时间值:一个 http 产生的 tcp 连接在传送完最后一个响应后,还需要 hold 住 keepalive_timeout 秒后,才开始关闭连接

  • keepalive_timeout=0:建立tcp连接 + 传送http请求 + 执行时间 + 传送http响应 + 关闭tcp连接 + 2MSL
  • keepalive_timeout>0:建立tcp连接 + (最后一个响应时间 – 第一个请求时间) + 关闭tcp连接 + 2MSL

代码

HTTP1.1 开启 keepalive 长连接
在这里插入图片描述

// clients func doGet(client *http.Client, url string, id int) {     	resp, err := client.Get

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...