TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接。连接的建立依靠“三次握手”,而释放则需要“四次挥手”,所以每个连接的建立都会带来资源和时间开销。

  HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。TCP连接是一个双向的通道,可以保持一段时间不关闭,因此TCP连接才有真正的长连接和短连接这一说。

什么是长连接和短连接

  短连接就是客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会复用同一个 TCP 通道,直到客户端心跳检测失败或服务器连接超时。

长连接过程如下:

连接->传输数据->保持连接 -> 传输数据-> ... ->关闭连接。

短连接如下:

连接->传输数据->关闭连接

  简而言之,若没有数据传输也要保持TCP连接,就是长连接,反之就是短连接。举个简单的例子,幼儿园老师和小朋友是长连接,老师需要时不时地关注有没有小朋友出意外;而大学老师和学生就是短连接,散养即可。

什么时候用长连接和短连接

  长连接多用于TPS/QPS 很高的、点对点的通讯,而且连接数不能太多的情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,下次处理时直接发送数据包就OK了,无需重新建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

  而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。如果用长连接,而且同时有成千上万的用户,那么每个用户都占用一个连接的话,结果可想而知;故在并发量大,但每个用户无需频繁操作的场景下,推荐使用短连接。

在一些 TPS/QPS 很高的 REST 服务中,如果服务端内部微服务的调用建议使用长连接,或者走nacos等,此时若使用短连接(即没有开启keep-alive),则很可能发生客户端端口被占满的情形

开启和关闭长连接

  HTTP/1.0默认使用短连接,而从HTTP/1.1起,默认使用长连接,用以复用TCP连接,多个HTTP请求可以复用同一个TCP连接,从而降低TCP连接建立和断开的消耗。使用长连接的HTTP协议,会在请求头或者响应头header中加入这行代码:

Connection:keep-alive

​ 实现长连接需要客户端和服务端都支持长连接,客户端可以通过设置 HTTP Header Connection: close 来关闭长连接。不论request还是response的header,只要包含了值为close的connection,都表明当前正在使用的tcp连接在本次请求处理完毕后会被断掉。以后客户端再进行请求时,就必须创建新的TCP连接。

长连接的过期时间

  客户端的长连接不会永久保持连接,它有一个超时时间的概念,可以在header当中进行设置的。譬如:

  图中的Keep-Alive: timeout=20表示这个TCP通道可以保持20秒。另外,还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,服务端可主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。

Reference

http协议中长连接和短连接介绍的更多相关文章

  1. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  2. HTTP协议中的短轮询、长轮询、长连接和短连接

    HTTP协议中的短轮询.长轮询.长连接和短连接 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接 ...

  3. HTTP协议原理(长连接,短连接/ get,post区别等等)

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  4. (转)对Http协议的长连接和短连接新的认识

    转载来自:http://www.cnblogs.com/zuoxiaolong/p/life49.html一直对长连接短连接模模糊糊,看着该博主的文章,豁然开朗~ 引言 最近刚到公司不到一个月,正处于 ...

  5. HTTP协议中的短轮询、长轮询、长连接和短连接,看到一篇文章有感

    关于短轮询.长轮询 短轮询主要是前端实现,JS写个死循环,不停的去请求服务器中的库存量是多少,然后刷新到这个页面当中,这其实就是所谓的短轮询. 长轮询主要取决于服务器,在长轮询中,服务器如果检测到数据 ...

  6. http协议及长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...

  7. 转---谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    作者:伯乐在线专栏作者 - 左潇龙 http://web.jobbole.com/85541/ 如有好文章投稿,请点击 → 这里了解详情 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此 ...

  8. HTTP协议中的长连接、短连接、长轮询、短轮询

    长连接.短连接,指的是TCP连接.长连接是为了复用TCP连接. 长轮询中,服务器如果检测到库存量没有变化的话,将会把当前请求挂起一段时间(这个时间也叫作超时时间,一般是几十秒).在这个时间里,服务器会 ...

  9. 谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  10. HTTP的长连接和短连接

        本文总结&分享网络编程中涉及的长连接.短连接概念.     关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...

随机推荐

  1. php站点导入大mysql文件(linux系统)

    问题描述:站点数据多,mysql导出后大于1G,使用phpmyadmin,导入一半报错,白白浪费等待时间,使用navicat 导入,执行时间过长提示错误 解决思路:1.拆分mysql文件,分批次导入, ...

  2. 介绍一下opentcs

    OpenTCS是一个开源的自动运载系统(Automated Guided Vehicle,AGV)控制系统.它旨在管理和控制自动化运输车辆,例如AGV或自动搬运车(AMR),在工业和商业环境中执行各种 ...

  3. 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人

    一.Windows 版 DeepSeek-R1.Ollama 与 AnythingLLM 介绍及核心使用场景‌ ‌一.组件功能与定位‌ ‌DeepSeek-R1‌ ‌模型特性‌:支持 ‌FP16 计算 ...

  4. sourcetree 重新设置git账号密码

    设置提交git账号邮箱 到项目根目录,执行 vi ~/.gitconfig ,直接编辑修改即可 重新设置git登陆账号密码 打开 sourcetree 的偏好设置,选择高级,然后移除即可

  5. mysql CONFLICT 冲突

    1.IGNORE 当使用INSERT语句向表中添加一些行数据并且在处理期间发生错误时,INSERT语句将被中止,并返回错误消息.因此,可能不会向表中没有插入任何行.但是,如果使用INSERT INGO ...

  6. NumPy学习12

    今天学习了 22, NumPy矩阵乘法 23, NumPy IO操作 numpy_test12.py : import numpy as np ''' 22, NumPy矩阵乘法 矩阵乘法是将两个矩阵 ...

  7. Windows 提权-服务_弱服务权限

    本文通过 Google 翻译 Weak Service Permissions – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行 ...

  8. 【C#】VS2019新建C#类自动添加作者版权等信息

    VisualStudio2019新建C#类自动添加作者版权等信息 问题: 新建C#类的时候经常需要手动添加注释和版权等信息,那么如何新建类的时候就让编译器自动添加好这些信息呢? 解决: 参考网上的资料 ...

  9. unigui显示uniTreeVview使用TUniTreeNode内存泄漏的问题【14】

    uniTreeVviewc创建一个tree,显示患者姓名(PatientName).因为需要用到患者ID(PatientID),所以使用help: TPatientTreeNode = class(T ...

  10. unigui的demo-\Demos\Desktop\DBAppDemo\SimpleDemo.dproj【11】

    这个demo很简单. 一个客户表,还有一个票据主从表. 看程序界面: 包括数据提交,彻头彻尾的c/s程序.你完全按照传统的C/S程序模式做开发就可.好处是效率.效率.还是效率! 你还有什么不满意!如果 ...