1. TCP连接

当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的

经典的三次握手示意图:

经典的四次握手关闭图:

2. TCP短连接

首先模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。从上面的描述看,短连接一般只会在client/server间传递一次读写操作。

连接→数据传输→关闭连接;

短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段

3.TCP长连接

接下来再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

 连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信); 
      这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;

首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。

如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:

  1. 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
  2. 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
  3. 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
  4. 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

从上面可以看出,TCP保活功能主要为探测长连接的存活状况,不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。

在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

3. 应用场景:

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

而像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好;

在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

4. 报文格式:

通信报文格式多样性更多,相应地就必须设计对应的读写报文的接 收和发送报文函数。

阻塞与非阻塞方式

非阻塞方式:读函数不停的进行读动作,如果没有报文接收到,等待一段时间后超时返回,

这种情况一般需要指定超时时间。

阻塞方式:如果没有接收到报文,则读函数一直处于等待状态,知道报文到达。

循环读写方式

1. 一次直接读写报文:在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。

2. 不指定长度循环读写:这一版发生在短连接进程中,受网络路由等限制,一次较长的报文可能在网络传输过程中被分解成很多个包,一次读取可能不能全部读完一次报文,这就需要循环读取报文,直到读完为止。

3. 带长度报文头循环读写:这种情况一般在长连接中,由于在长连接中没有条件能够判断循环读写什么时候结束。

必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读报文,实际情况中,报头码制格式还经常不一样,

如果是非ASCII的报文头,还必须转换成ASCII常见的报文头编制有:

1. n个字节的ASCII码。

2. n个字节的BCD码。

3. n个字节的网络整型码。

以上是几种比较典型的读写报文方式,可以与通信方式模板一起 预先提供一些典型的API读写函数。

当然在实际问题中,可能还必须编写与对方报文格式配套的读写API. 在实际情况中,往往需要把我们自己的系统与别人的系统进行连接, 有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。

参考链接:

http://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html

https://www.cnblogs.com/qqzy168/p/3141703.html

TCP socket 中的长连接与短连接的区别相关推荐

  1. HTTP、TCP、Socket、长连接、短连接的概念和原理及其区别

    文章目录 HTTP Scoket HTTP协议和TCP/IP的关系 Socket与TCP/IP的关系 Socket与HTTP的关系 TCP/IP协议分层 长连接和短连接 长连接和短连接的优点和缺点 短 ...

  2. tcp协议中的长连接和短连接服务器,谈谈HTTP协议中的短轮询、长轮询、长连接和短链接...

    undefined 在之前总结 WebSocket 的时候就已经提到过短长轮询了~~今天看公众号文章,又把长短连接引进来一起分析.感觉这种总结很棒,那么我们一起看看呗 长短连接 听说长短连接的话,应该 ...

  3. [转]TCP(HTTP)长连接和短连接区别和怎样维护长连接

    原文链接 一.HTTP协议和TCP协议 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题, ...

  4. 分析 HTTP,TCP 的长连接和短连接以及 sock

    作者:zhoulujun 链接:https://www.zhoulujun.cn/html/webfront/SGML/web/2015_1016_317.html 1 HTTP 协议与 TCP/IP ...

  5. http和socket之长连接和短连接区别

    TCP/IP  TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层.  在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议.  在传输层中有TCP协议与UDP协议. ...

  6. android socket 长连接_TCP/IP,http,socket,长连接,短连接

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 上一篇:这300G的Java资料是我师傅当年给我的,免费分享给大家 下一篇:这200G的Java实战资料是我师傅当年教 ...

  7. tcp、http协议的长连接和短连接

    转载:http://www.cnblogs.com/onlysun/p/4520553.html 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当 ...

  8. socket解读,http和socket之长连接和短连接区别!

    TCP/IP  TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层.  在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议.  在传输层中有TCP协议与UDP协议. ...

  9. TCP长连接和短连接代码及其比较

    前言: 最近又看到了关于TCP长连接和短连接的概念,以前也看过Http长连接和短连接的概念,因为Http是建立在TCP协议之上的,所以它其实是依赖TCP的长连接和短连接.所以,我就萌生了一个想法,看看 ...

  10. python socket通信 心跳_python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)...

    长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...

最新文章

  1. Android JetPack ViewModel 源码解析
  2. 2016年9月c语言真题,2016年9月计算机二级C语言基础试题及答案
  3. gpu programming guide for g80(dx9)
  4. MySQL导入导出命令
  5. 基于Vmware player的Windows 10 IoT core + RaspberryPi2安装部署
  6. JAVA 类加载 随记
  7. php 生成器作用,php 生成器的理解和使用
  8. 计算机网络安全-RSA加密原理
  9. auc 和loss_精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
  10. 事态升级是什么意思_为什么有的人越到关键时刻越容易掉链子?记住不要有“赌徒心理”...
  11. python3d绘图代码_python机器学习之3D Matplotlib绘图
  12. python纸牌游戏_《升级》扑克牌游戏——Python实现
  13. linux驱动目录在哪里,详细讲解Linux驱动程序
  14. 论文笔记_S2D.35-2017-IROS_利用CNNs联合预测RGB图像的深度、法线和表面曲率
  15. 基金指数温度怎么算_温度换算(指数基金温度计算器)
  16. 微信小程序开发者工具下载及安装
  17. 基于ECharts数据可视化案例--世界疫情实时展示
  18. 不同iPhone屏幕尺寸
  19. SAP-PM设备模块-维修执行-维修工单
  20. Visual Question Answering: Datasets, Algorithms, and Future Challenges文章翻译

热门文章

  1. 成都盛铭轩:做好主图要从这些方面做
  2. Azure Tools---CAT(一)
  3. 腾讯云-物联网通信IoT Hub
  4. Mac电脑高质量神器——超级右键
  5. Nacos——Distro一致性协议
  6. 2020年4月,全国程序员平均工资14249元
  7. STM32F407移植FreeModbus中遇到接收最后一个字节是0xff或0xfe的解决方法
  8. 今天是本学期的第几周的第几天? (15 分) C语言
  9. Eclipse如何优化(转)
  10. 【冷门快捷键】设置VSCode终端大小最小化快捷键Alt+PageUp/PageDown、编辑代码窗口切换大小快捷键Alt+数字键盘“+”、Alt+数字键盘“-”、Alt+数字键盘“0”