1、TCP保活的必要性

1)我们知道TCP是无感知的虚拟链接,中间断开两端并不会感知到。(注:关于虚拟连接就是说我并不实际感知你的存在,只是因为我存储了你对应的一个结构和状态就认为你实际存在)

2)很多防火墙等会对空闲的socket自动关闭;连接的双方在链接空闲状态时,任意一方意外崩溃、宕机、网线断开、路由器故障等事情都是有可能发生的。

3)对于非正常的断开服务器自身并不能检测到,除非继续在此连接上发送数据导致错误返回,我们才能判断连接出现故障。显然这不是我们真正需要的。

4)我们希望服务端和客户端都能及时有效地检测到连接失败,然后自动的进行一个清理工作并把错误报告给用户。

2、保活的两种方式

1)应用层面的心跳机制

很好理解应用层实现探测。例如自定义心跳消息头客户端主动发送,服务端可回也可不回。这里不细讲。

2)TCP协议自带的保活功能

TCP默认不开启Keepalive功能,因为开启后需要消耗额外的带宽和流量,尽管微不足道。另外Keepalive设置不合理时可能会因为短暂的网络波动而错误的断开健康的TCP链接。

3、类Unix平台设置keep-alive:

前面说了keepalive默认是关闭的,毕竟会产生流量方面的开销,虽然说很小。一次需要用户手动开启,有两种方式

1)代码层面针对单个socket进行单独的设置(没错用到的就是setsockopt)。代码如下,都是这么写的。

int keepAlive = 1;   // 开启keepalive属性. 缺省值: 0(关闭)
int keepIdle = 60;   // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s)
int keepInterval = 5;   // 探测时发探测包的时间间隔为5秒. 缺省值:75(s)
int keepCount = 2;   // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));
setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));  

注:使用时需要#include <netinet/tcp.h>, 否则SOL_TCP和TCP_KEEPIDLE等3个宏找不到.

2)修改配置文件,对整个系统所有的socket生效。

cat命令查看到系统中这几个默认的值.cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
cat /proc/sys/net/ipv4/tcp_keepalive_probes
9修改它们:
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes

TCP连接保活之Keepalive相关推荐

  1. TCP连接保活检测Keepalive

    TCP连接的keepalive定时器用于定期检测连接是否正常. Keepalive初始化 默认情况下Keepalive每两个小时触发一次,触发之后,最多发送9次探测报文,每个报文的间隔为75秒钟.即在 ...

  2. 连接服务器_服务器海量TCP连接如何高效保活?

    在互联网领域,客户端和服务端之间通常需要建立和保持TCP长连接.所谓长连接,就是通信双方在建立TCP连接后进行数据通信,一次或若干次通信交互完成之后,不主动断开连接,而是保持TCP连接不释放,在随时需 ...

  3. TCP 连接断连问题剖析

    在官方的正式文档中,TCP/IP 协议簇也称为国际互联网协议簇.TCP/IP 协议簇是目前使用最为广泛的全球互联网技术,其分层结构如图 1 所示: 图 1. TCP/IP 协议簇分层结构  如图 1 ...

  4. 【网络协议】TCP连接断连问题

    一个TCP连接在完成三次握手之后便建立完毕:此后,连接的两端即可进行信息的相互传递.TCP连接一旦建立,只要通信双方的中间节点(网卡.交换机.路由器等网络设备)工作正常,那么在通信双方中的任意一方主动 ...

  5. go tcp连接_TCP漫谈之keepalive和time_wait

    TCP是一个有状态通讯协议,所谓的有状态是指通信过程中通信的双方各自维护连接的状态. 一.TCP keepalive 先简单回顾一下TCP连接建立和断开的整个过程.(这里主要考虑主流程,关于丢包.拥塞 ...

  6. tcp长连接保活与心跳机制

    TCP Keepalive的起源 TCP协议中有长连接和短连接之分.短连接环境下,数据交互完毕后,主动释放连接: 长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电.死 ...

  7. tcp连接探测Keepalive和心跳包

    采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是 ...

  8. 4个实验,彻底搞懂TCP连接的断开

    前言 看到这个标题你可能会说,TCP 连接的建立与断开,这个我熟,不就是三次握手与四次挥手吗?且慢,脑海中可以先尝试回答这几个问题: 四次挥手是谁发起的? 如果断电/断网了连接会断开吗? 什么情况下没 ...

  9. TCP连接中的异常情况

    TCP 保活机制( keepalive)可以在双方没有数据交互的情况,通过探测报文,来确定对方的 TCP 连接是否存活. 无数据交互的情况下的异常[主机崩溃|进程崩溃]: 1在没有开启 TCP kee ...

  10. rabbitmq链接超时_RabbitMQ前置SLB中TCP连接超时900秒限制

    问题背景 当前RabbitMQ集群架构如图所示,消费者consumer通过SLB连接到RabbitMQ集群. 但是SLB有连接超时限制,具体限制如下: 4. 负载均衡各监听连接超时时间是多少? TCP ...

最新文章

  1. 1231 最优布线问题
  2. STM32开发 -- 4G模块开发详解(1)
  3. 外部工具连接SaaS模式云数仓MaxCompute 实战—— 数据库管理工具篇
  4. mysql事物日志工具_MySQL——常用工具和日志
  5. docker 根据标签删除镜像_10 个 Docker 镜像安全最佳实践
  6. windows XP和ubuntu时间一致
  7. 国内外知名工业交换机品牌有哪些?
  8. 高通平台 Camera基础
  9. 使用游标逐行更新数据
  10. git学习资料及心得
  11. 如何用纯 CSS 创作一组昂首阔步的圆点
  12. python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...
  13. python代码-让你的Python代码实现类型提示功能
  14. kubernetes资源类型和kubectl命令总结
  15. 教你使用Wine在Linux上运行Windows软件
  16. 【docker系列】docker深入浅出之安装Nginx+PHP+MySQL
  17. 基于开源飞控系统和安卓系统的4g5g物联网无人机实现
  18. 一周小结(你不要小看业务)
  19. 乐高大颗粒作品24:金蟾
  20. 全国计算机二级考试中 ms office高级应用与C语言哪个适合大学生?

热门文章

  1. linux截图工具shutter 下载,在Ubuntu 19.04系统中安装Shutter截图工具的方法,附删除的方法...
  2. Java 笔记(二)
  3. 实时查看Linux IO复用情况
  4. CF#213DIV2:B The Fibonacci Segment
  5. winfrom 窗口起始位置为屏幕中央
  6. 更新新网卡驱动,修复win7雷凌网卡Ralink RT3290在电脑睡眠时和启动网卡时出现蓝屏netr28x.sys驱动文件错误...
  7. 数据挖掘方法论流程图
  8. 新年祝福短信|2011
  9. VB 6.0使用api
  10. Python无限播放励志语句