HTTP1.1 Keep-Alive到底算不算长连接?
✎ 码甲说
在基础架构部浸润了半年,有一些认知刷新想和童靴们交代一下, 不一定全面,仅代表此时的认知, 也欢迎筒靴们提出看法。
本文聊一聊口嗨用语:“长连接、短连接”, 文章会按照下面的思维导图来讲述:
重点围绕这两个难点/思维误区来整理知识体系。
长连接 vs 短连接
Http1.1持久连接 vs WebSocket长连接
长连接 vs 短连接
长连接
是指一个连接上连续发送多个数据包。
短连接
是指双方要数据交互时,建立一个连接,数据发送完毕,则断开连接,即每次连接只完成一个单元的业务传输,有需要再建立新连接传输数据。
实际上长短连接都是针对TCP连接而言的,强调的是应用层对下层TCP连接的使用姿势,采用哪种连接由应用根据自身情况决定。
长连接
多用于操作频繁、点对点的通信,而且连接数不能太多的情况。每次TCP连接都需要三次握手,这需要时间,如果每个操作都是短连接,再操作的话那么处理速度会降低很多,所以每次操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而常规web网站一般都是短连接,这是由web站点的特征决定,web站点的客户端数量大、访问时间/频次不固定,采用短连接能节省服务器资源;如果客户端都维持长连接,可想而知,会占用多大的服务器资源, 所以并发量大,但每个用户无需频繁操作的时候使用短连接较好。
HTTP1.1 持久连接
早期HTTP1.0是纯粹的TCP短连接的应用,每个连接完成一次Http请求/响应模型,这种方式频繁的创建/销毁连接无疑是有一定性能损耗的。
目前普遍应用的HTTP1.1的Keep-alive官方术语上叫持久连接(英语:HTTP persistent connection,也称作HTTP connection reuse),国内口嗨称为“HTTP长连接”。
HTTP1.1keep-alive
,我认为是应用层HTTP协议对于TCP连接的折中使用,是应用层对下层TCP连接的复用协商。
Http1.0 频繁创建/销毁连接确实给通信双方带来了不必要的性能损耗 #不必要#
直接使用典型的长连接又会给服务端带来极大的压力 #不允许#
故HTTP1.1的keep-alive
一方面允许多个HTTP请求复用一个TCP连接, 另一方面又将这种复用时效交由客户端/服务端在应用层协商:应用层每次请求/响应均携带Connection:Keep-Alive标头滑动续约。
HTTP 1.1 Keep-Alive的实质是应用层滑动续约复用TCP连接?
大家不妨回想一下,常见的各种客户端/服务器,均有KeepAliveTimeout这样的参数
客户端IE默认的KeepAliveTimeout是1分钟[1];
服务器IIS默认ConnectionTimeout时长是2min[2]
服务器ASP.NetCore Kestrel默认的KeepAliveTimeout=130s[3]
服务器nginx默认的keepalive_timeout=60s[4]
这些参数均能印证 HTTP Keep-Alive 是一种对于TCP连接的滑动续约复用。
这里面明眼人一看,1.2.4针对TCP Connection复用的滑动超时时间是拍脑袋决定的,而第3点ASP.NET Core Kestrel作为.NETCore的寄宿服务器为什么是130s,有点意思,我给你们找出相关: KestrelServerLimits.KeepAliveTimeout=130s[5]
典型的长连接Websocket
Websocket是一种典型的长连接,通过第一个HTTP Request建立了TCP连接之后,之后数据交互都不需要发送HTTP Request了,但是不需要发送 HTTP header就能交换数据显然和原有的 HTTP 协议是有区别的,所以它需要对服务器和客户端都进行升级才能实现,这个协商是在Websocket数据传输之前就已经完成:通过初次HTTP建立TCP连接的时候携带Upgrade标头来通知双方提升协议。
Websocket也有keepalive机制,Websocket的keepalive的作用是在复杂的网络环境中探测连接对端是否还存活。
旁白总结
长短连接都是针对TCP连接而言,强调的是应用层对于TCP连接的使用姿势。
HTTP1.1 Keep-Alive是对TCP连接的折中使用,既不是短连接,也不能称为典型的长连接。
HTTP1.1 Keep-Alive官方称持久连接,我的观点是HTTP1.1 Keep-Alive 是在应用层对TCP连接进行滑动续约复用。
典型的长连接Websocket在数据传输之前就完成了长连接确认。
文章某些观点可能让一些童鞋不适,欢迎表明态度,理性讨论!!!
参考资料
[1]
IE默认的KeepAliveTimeout是1分钟: https://docs.microsoft.com/en-US/troubleshoot/browsers/change-keep-alive-time-out
[2]
IIS默认ConnectionTimeout时长2min: https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms525597
[3]
ASP.Net Core Kestrel默认的KeepAliveTimeout=130s: https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.kestrel.core.kestrelserverlimits.keepalivetimeout?view=aspnetcore-6.0#Microsoft_AspNetCore_Server_Kestrel_Core_KestrelServerLimits_KeepAliveTimeout
[4]
nginx默认的keepalive_timeout=60s: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive_timeout
[5]
KestrelServerLimits.KeepAliveTimeout=130s: https://github.com/dotnet/runtime/issues/52267
点个在看你最好看
仅代表此刻认知,文章永久更新地址,请移步原文!!
HTTP1.1 Keep-Alive到底算不算长连接?相关推荐
- 深度linux_国产系统?基于Linux研发的深度Deepin系统,到底算不算真国产
阅读本文前,请您先点击上面的蓝色字体"晓艳观世界",再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注. 近年来,国内科技 ...
- 华为手机怎样才算激活了_外观专利到底怎样才算侵权呢?
外观专利到底怎样才算侵权呢? 外观设计的侵权判定: 一.确定外观设计专利权的保护范围 根据专利法第五十九条第二款之规定,其保护范围,以表示在外观设计专利权人在申请外观设计专利时向专利局提交的图片或者照 ...
- 超级计算机能算数学题吗,圆周率到底能不能算尽?人类拿超级计算机算了一下,结果不敢相信...
校长科普 2018-12-11 01:16 圆周率到底能不能算尽?人类拿超级计算机算了一下,结果不敢相信 说到圆周率,读过书的小伙伴应该都很清楚吧,在数学课上最有意思的就是算圆周率了.记得校长初中的时 ...
- 超级计算机也无法算尽圆周率,圆周率到底能不能算尽?
说到圆周率,读过书的小伙伴应该都很清楚吧,在数学课上最有意思的就是算圆周率了.记得校长初中的时候老师就组织我们计算圆周率以此来考核我们的计算能力,记得校长那个时候算到了圆周率后50位的数字,现在想想还 ...
- 冯东阳:解读纯文本链接到底算不算外链
很多做SEO的可能都比较迷惑,自己发的外链是纯文本链接,这算是外链吗?不只一个人问过老冯(冯东阳)这个问题,刚好,今天下午在群里看到一个人也问纯文本链接算不算外链的事,我就发表下我的意见吧! 纯文本也 ...
- 圆周率用计算机能算出来不,圆周率到底能不能算尽?人类拿超级计算机算了,结果不敢相信!...
提到圆周率,我们大部分人应该都不会觉得陌生,就这样东西来说,往往我们的首次接触都是在初中的时候.那时候的很多数学老师也会用让学生计算圆周率来评估他们的计算能力.事实上,圆周率是可以一直循环下去的,对此 ...
- MD5 到底算不算一种加密算法?
一旦提到加密算法,经常有人会有这样的疑问:MD5 到底算不算一种加密算法呢? 在回答这个问题之前,我们需要先弄清楚两点: 什么是加密算法? 什么是 MD5? 1.什么是加密算法? 数据加密的基本过程就 ...
- 【科普】超算到底是咋算的?
最近一段时间,有关超算的话题成为热门,一时间大家都开始讨论超算,各种浮于表面的吹牛,逼格负无穷的装逼.然而,冬瓜哥发现在所有这些讨论中,从没有在任何时间任何地点发现任何人问出就连小学生都经常问 ...
- 中国超级计算机计算圆周率,人类的超级计算机一直在计算圆周率,到底能不能算完?解疑惑了...
类的超级计算机一直在计算圆周率,到底能不能算完?解疑惑了 说到圆周率,第一次了解大概是在小学时代学习无限不循环小数的时候,然后就是中学学习圆的面积的时候学到,不过通常都是用单位兀来简化运算.现在回想起 ...
最新文章
- 从源码分析DEARGUI之异步传参
- 如何确认mongodb数据插入是否成功_go连接mongodb
- python_104_面向对象总结
- (转)SystemProcessesAndThreadsInformation
- 带有控制按钮的图片滚动
- Centos7更新 SQLite3至版本3.29.0
- 漫谈CMS:ZOOMLA、NETCMS、风讯、动易异同
- Linux(四):虚拟机Ubuntu 卸载
- vs2015社区版不支持installshield
- 太阳能充电调节代码_永不插电!这款薄膜太阳能动力汽车可连续行驶一个月
- 使用lgtm发现开源项目安全漏洞
- 带软开启功能的MOS管电源开关电路!
- 富集分析(GO、KEGG、GSEA)
- 电脑重装win10系统bios不会设置?用这种方法可以轻松重装系统
- 维特比算法(基于李航)
- git clone 项目时总是提示输入密码
- 计算机网络体系结构及其简单通信
- 微信里如何发微博的表情?
- (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
- Android Wifi小记 (2)
热门文章
- POJ 3264 Balanced Lineup(RMQ)
- IIS6注册.net4.0
- GDI+ 设置文本对齐方式
- Oracle下SQL基本操作(二)
- 一个漫长的程序人生路程,如何突破5000元大关?几年前的2-3线城市的参考,现在未必...
- python3函数调用时间_Python3 time clock()方法
- [HNOI2017]礼物
- roku能不能安装软件_如何阻止假期更改Roku主题
- 仿Gin搭建自己的web框架(七)
- 香港连续25年被评为全球最自由经济体