一、TCP连接的相关说明

①使用TCP协议时,会在客户端和服务器之间建立一条虚拟的信道,这条虚拟信道就是指连接,而建议这条连接需要3次握手,拆毁这条连接需要4次挥手,可见,我们建立这条连接是有成本的,这个成本就是效率成本,简单点说就是时间成 本,你要想发送一段数据,必须先3次握手(来往3个包),然后才能发送数据,发送完了,你需要4次挥手(来往4个包) 来断开这个连接

②CPU资源成本,三次握手和4次挥手和发送数据都是从网卡里发送出去和接收的,还有其余的设备,比如防火墙, 路由器等等,站在操作系统内核的角度来讲,如果我们是一个高并发系统的话,如果大量的数据包都经历过这么一个过 程,那是很耗CPU的。

③每个socket是需要耗费系统缓存的,比如系统提供了一些接口设置socket缓存的,比如:

/proc/sys/net/ipv4/tcp_rmem

/proc/sys/net/ipv4/tcp_wmem

/proc/sys/net/ipv4/tcp_mem

因为TCP的可靠传输,所以我们有大量的应用程序使用TCP协议作为通信,但是每个应用因为产品功能的原因,对TCP的使用是不一样的,比如即时聊天系统(微信,钉钉,探探)

二、TCP长连接、TCP短连接

TCP短连接

概念:如下图所示,客户端与服务器建立连接开始通信,一次/指定次数通信结束之后就断开本次TCP连接,当下次再次通信时,再次建立TCP的链接

优点:不长期占用服务器的内存,那么服务器能处理的连接数量是比较多的

缺点:

因为等到要发送数据或者获取资源时,才去请求建立连接发送数据,否则就是端开连接的,那么如果服务器要想往客户端发送数据时怎么办?凉伴,没有任何办法,或者要等到下一次要请求数据时,才发送,比如我们采用轮询(30秒或者更长)拉取消息, 那么服务器与客户端通信的实时性就丧失了

客户端采用轮询来实时获取信息,或者说大量的客户端使用短连接的方式通信,那么就浪费了大量的CPU和带宽资源用于建立连 接和释放连接,存在资源浪费,甚至是无法建立连接。比如经典的http长轮询(微信网页客户端端)

TCP长连接

概念:如下图所示,TCP与服务器建立连接之后一直处于连接状态,直到最后不再需要服务的时候才断开连接

优点:

传输数据快

服务器能够主动第一时间传输数据到客户端

缺点:

因为客户端与服务器一直保持这种连接,那么在高并发分布式集群系统中客户端数量会越来越多,占 用很多的系统资源

TCP本身是一种有状态的数据,在高并发分布式系统会导致后台设计比较难做

三、TCP的keepalive机制(保活机制)

TCP实现了一种保活机制,主要的设计初衷是:

客户端和服务器需要了解什么时候终止进程或者与对方断开连接

而在另 一些情况下,虽然应用进程之间没有任何数据交换,但仍然需要通过连接保持一个最小的数据流,会非常消耗资源。保活机制可用来检测对方并在适时关闭连接

主要的工作原理就是:探测方会在自己一端设计一个计时器,当计时器被触发之后,向对方发送一个探测报文。如果对端给自己回送一个ACK,那么就代表对方仍存活;如果在指定的时间内没有给自己回送ACK,那么就确认对方已经断开连接,从而断开本次TCP连接Linux的相关内核参数

tcp_keepalive_time:单位秒,表示发送探测报文之前的链接空闲时间,默认为7200

tcp_keepalive_intvl:单位秒,表示两次探测报文发送的时间间隔,默认为75

tcp_keepalive_probes:表示探测的次数,默认为9

Posix套接字选项

int keepalive_time = 30;

setsockopt(incomingsock, IPPROTO_TCP,TCP_KEEPIDLE,(void*)(&keepalive_time),(socklen_t)sizeof(keepalive_time));

int keepalive_intvl = 3;

setsockopt(incomingsock, IPPROTO_TCP,TCP_KEEPINTVL,(void*)(&keepalive_intvl),(socklen_t)sizeof(keepalive_intvl));

int keepalive_probes= 3;

setsockopt(incomingsock, IPPROTO_TCP,TCP_KEEPCNT,(void*)(&keepalive_probes),(socklen_t)sizeof(keepalive_probes));

四、TCP长连接设计

为什么需要长连接

服务器要主动发消息给客户端:如果没有一个连接存在的话,服务器是永远不能主动地找到客户端的,那也就没有办法及时发送消息给客户端

客户端和服务器间频繁地通信:如果是短连接,每次都需要建立连接才能发送消息,如果并发量稍高,可能就会出现大量的TIME_WAIT状态的socket出现,也即后续建立不了连接

业务需要,比如客户端掉线时服务器需要做一些处理:比如清空他的缓存或者其它资源或者其它业务含义,比如QQ头像显示离线

TCP长连接设计时需要考虑到的问题

默认的tcp keep-alive超时时间太长:默认是7200秒,也就是2个小时,当然是可以修改的

socket proxy会让tcp keep-alive失效:所有的proxy应用只能转发TCP的应用数据,做不到转发TCP协议内部的包

移动网络需要信令保活:对于手机等智能终端来讲,他们使用移动网络来上网的,而运营商们为了节约信道资源,会尝试关闭超过60秒或者 45秒的没有发送数据的socket

下面用心跳检测机制来解决这些问题

五、心跳检测

心跳检测就是用户在应用层自己实现的一种机制,用来模仿TCP的keepalive机制,在指定的时间内会向对方放一个心跳检测包,如果在指定的时间内给自己回送了应答,那么就不关闭TCP的连接;如果在指定的时间内没有给自己回送应答,那么就做相应的处理(例如说的关闭本次TCP的链接)Netyy中的实现

编码实现与主要原理

大致思路为:

我们用一棵红黑树管理所有事件节点,其中key为该事件套接字的超时时间,value为套接字

调用wpoll_wait()处理所有事件,其中其最后一个参数为超时时间,必须设置为整棵红黑树中超时时间最短的那个节点的值

当epoll_wait()返回之后,将时间与节点的时间进行比较,如果超时了,那么就做相应的处理

代码解析

下面主要介绍以“服务端”为第一视角,查看其如何对客户端进行心跳检测的

ngx_reactor.c的ngx_reactor_loop()函数:

Reactor的主要中心处理函数ngx_reactor_loop()中会在poll_wait()调用之前获取一下当前时间

然后进行epoll_wait(),其最后一个参数为红黑树中超时时间最短的那个节点的时间值

epoll_wait()返回之后,先更新一下当前时间(全局变量ngx_current_msec)

最后再次获取当前时间,然后与之前的旧的“当前时间”进行,相减得到差值,如果超时了,那么就调用ngx_event_expire_timers()函数

ngx_reactor.c的ngx_event_expire_timers()函数:

该函数也就是该封装事件的what标志|上一个NGX_EVENT_TIMEOUT,将该事件置位超时了的

然后会调用该事件的回调函数

在上面的回调函数中,我们为其绑定的回调函数为ngx_server.c中的client_handler()函数:

该函数会判断该事件的what标志是否有NGX_EVENT_TIMEOUT标志,如果有就调用timeout_cb()处理函数

timeout_cb()函数或判断delta是否超过了KEEPALIVE_INTVAL_MSEC时间,并且超时了3次(KEEPALIVE_INTVAL_PROBES),如果是,那么就调用close()关闭客户端的套接字

上面定义的宏如下所示

来源:oschina

链接:https://my.oschina.net/u/4279277/blog/4466303

linux测试tcp长连接工具,Linux(服务器编程):44---TCP长连接、短连接(心跳检测)相关推荐

  1. http协议之长连接与短连接服务器,长连接短连接

    HTTP 协议与 TCP/IP 协议的关系 HTTP 协议是应用层的协议,而 TCP 协议是传输层的协议,IP 协议是网络层的协议. IP 协议主要解决网络路由以及寻址等问题,而 TCP 协议主要解决 ...

  2. nginx 代理tcp长连接短连接配置

    nginx使用ngx_stream_core_module模块代理tcp长连接短连接,可以增强服务器的容灾能力 下面是一个配置信息,自己也方便记录一下

  3. 转载的HTTP长连接短连接和无状态的理解

    HTTP长连接和短连接以及推送服务原理 HTTP长连接和短连接1 1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用 ...

  4. HTTP - 长连接 短连接 长轮询 短轮询 心跳机制

    错觉与突然的察觉 大多数人都知道HTTP1.0不支持长连接,知道HTTP1.1支持长连接. 这是业界的一个常识. 然而这样的描述导致了一些不做网络底层开发的开发者都下意识的认为HTTP1.1是一个可以 ...

  5. 网络编程(三)TCP IO多路转接服务器编程(select)

    同系列文章: 1, 文章目录 一,select知识引入 二,select基本概念 2.1 select概念理解前先总结一下通信过程(便于后文理解select) 2.2 select函数的用法 2.2. ...

  6. c++语言 tcp例子,C++ boost::asio编程-同步TCP详解及实例代码

    boost::asio编程-同步TCP boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型. boost.asio库支持TCP.UDP.IC ...

  7. Linux嵌入式网络 _ 网络信息检索、网络属性设置、超时检查、心跳检测

    一.网络信息检索 1.网络信息检索 常用函数 gethostname();     获得主机名 getpeername();     获得与套接字相连的远程协议地址 getsockname();    ...

  8. TCP长连接,短连接

    1. TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接.client向server 发送消息,server回应client, ...

  9. TCP/IP,HTTP,RPC、SOA、长连接短连接等的区别

    一.TCP/IP 建立TCP需要三次握手才能建立(客户端发起SYN,服务端SYN+ACK,客户端ACK), 断开连接则需要四次握手(客户端和服务端都可以发起,FIN-ACK-FIN-ACK). 1.为 ...

最新文章

  1. 微软职位内部推荐-Senior Development Lead – Sharepoint
  2. javascript创建对象的几种方式 .
  3. 一文看懂集群、分布式与负载均衡的关系
  4. ubuntu ifconfig命令找不到_那些年踩过的坑--无法使用MobaXterm远程登录Ubuntu
  5. RefFieldMethodDetails——查看类的域和方法
  6. mysql5.0版本特性_mysql各版本的新特性整理
  7. ERROR: ld.so: object '/usr/lib64/libtcmalloc.so.4' from LD_PRELOAD cannot be preloaded: ignored
  8. 【问题解决】sql2012安装时卡在正在启动操作系统功能"NetFx3"上不动的解决办法...
  9. tomcat编码配置gbk_Tomcat中的编码问题
  10. wifi6无线网卡驱动linux,ROG R6E Omega换wifi 6无线网卡教程
  11. 拼途网: 从线上到线下的拼途旅行社区
  12. linux recv函数 参数,linux send recv函数详解
  13. 走进Cocos Creator游戏开发(第一篇)
  14. 嵩天《Python网络爬虫与信息提取》实例3:淘宝商品比价定向爬虫
  15. 2021年宜昌各校高考成绩查询,2021年宜昌高考状元名单公布,宜昌高考状元学校资料及最高分...
  16. [酷软].换抓图工具了,从WinSnap到HyperSnap
  17. EaseUS Todo Backup 14.1 Crack
  18. mwb 还原 mysql,文件转换-.mwb到.sql文件
  19. 抖音xg算法源码Python,Java解析 0361 0404
  20. xp系统提示itunes无法验证服务器,我XP系统安装itunes时,一直提示“无法访问windows installer服务.....”...

热门文章

  1. add voom plugin , it's better than tlist
  2. 解决win10系统msvcr120.dll丢失办法
  3. mac知名的清理软件 cleanmymac和腾讯柠檬哪个好
  4. 2011年兔年新年贺词大全/2011年兔年贺词/2011年新年公司贺词
  5. dcrs 端口配ip_三层交换机端口IP地址配置方法
  6. oracle sql 优化分析点
  7. web前端-CSS Border(边框)-011
  8. 如何查看网站服务器到期时间吗,如何查看云服务器到期时间
  9. 天乐生活百科,商业百科,网址大全,中国生意场上的百科全书 源码
  10. 关于vant van-tabs sticky属性不起作用