Linux SO_KEEPALIVE属性,心跳

对于面向连接的TCP socket,在实际应用中通常都要检测对端是否处于连接中,连接端口分两种情况:

1、连接正常关闭,调用close() shutdown()连接优雅关闭,send与recv立马返回错误,select返回SOCK_ERR;

2、连接的对端异常关闭,比如网络断掉,突然断电.

对于第二种情况,判断连接是否断开的方法有一下几种:

1、自己编写心跳包程序,简单的说就是自己的程序加入一条线程,定时向对端发送数据包,查看是否有ACK,根据ACK的返回情况来管理连接。此方法比较通用,一般使用业务层心跳处理,灵活可控,但改变了现有的协议;

2、使用TCP的keepalive机制,UNIX网络编程不推荐使用SO_KEEPALIVE来做心跳检测(为什么??)。

keepalive原理:TCP内嵌有心跳包,以服务端为例,当server检测到超过一定时间(/proc/sys/net/ipv4/tcp_keepalive_time 7200 即2小时)没有数据传输,那么会向client端发送一个keepalive packet,此时client端有三种反应:

1、client端连接正常,返回一个ACK.server端收到ACK后重置计时器,在2小时后在发送探测.如果2小时内连接上有数据传输,那么在该时间的基础上向后推延2小时发送探测包;

2、客户端异常关闭,或网络断开。client无响应,server收不到ACK,在一定时间(/proc/sys/net/ipv4/tcp_keepalive_intvl 75 即75秒)后重发keepalive packet, 并且重发一定次数(/proc/sys/net/ipv4/tcp_keepalive_probes 9 即9次);

3、客户端曾经崩溃,但已经重启.server收到的探测响应是一个复位,server端终止连接。

修改三个参数的系统默认值

临时方法:向三个文件中直接写入参数,系统重启需要重新设置;

临时方法:sysctl -w net.ipv4.tcp_keepalive_intvl=20

全局设置:可更改/etc/sysctl.conf,加上:

net.ipv4.tcp_keepalive_intvl = 20

net.ipv4.tcp_keepalive_probes = 3

net.ipv4.tcp_keepalive_time = 60

/* Set TCP keep alive option to detect dead peers. The interval option
 * is only used for Linux as we are using Linux-specific APIs to set
 * the probe send time, interval, and count. */
int anetKeepAlive(char *err, int fd, int interval)
{
    int val = 1;
	//开启keepalive机制
    if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) == -1)
    {
        anetSetError(err, "setsockopt SO_KEEPALIVE: %s", strerror(errno));
        return ANET_ERR;
    }

#ifdef __linux__
    /* Default settings are more or less garbage, with the keepalive time
     * set to 7200 by default on Linux. Modify settings to make the feature
     * actually useful. */

    /* Send first probe after interval. */
    val = interval;
    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) < 0) {
        anetSetError(err, "setsockopt TCP_KEEPIDLE: %s\n", strerror(errno));
        return ANET_ERR;
    }

    /* Send next probes after the specified interval. Note that we set the
     * delay as interval / 3, as we send three probes before detecting
     * an error (see the next setsockopt call). */
    val = interval/3;
    if (val == 0) val = 1;
    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0) {
        anetSetError(err, "setsockopt TCP_KEEPINTVL: %s\n", strerror(errno));
        return ANET_ERR;
    }

    /* Consider the socket in error state after three we send three ACK
     * probes without getting a reply. */
    val = 3;
    if (setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0) {
        anetSetError(err, "setsockopt TCP_KEEPCNT: %s\n", strerror(errno));
        return ANET_ERR;
    }
#endif

    return ANET_OK;
}

Linux SO_KEEPALIVE属性,心跳

时间: 2024-11-02 18:48:27

Linux SO_KEEPALIVE属性,心跳的相关文章

Linux网络属性配置

Linux网络属性配置 IP(Internet protocol)地址: 网络号+主机号 IPv4:32bits 8bits 8bits 8bits 8bits 0-255 0.0.0.0-255.255.255 IP地址分类: A类: 第一段为网络号,后三段为主机号 网络号 0固定 000 0000-0 111 1111 : 网络数量: 1-127 每个网络中的主机数量:2^24 -2 (全0,全1) 主机全0表示网络本身地址, 全1表示所有主机广播地址地址 默认子网掩码:255.0.0.0

Linux网络属性配置管理及其相关命令

TCP/IP协议: 网络访问层(Network Access Layer)在TCP/IP参考模型中并没有详细描述,只是指出主机必须使用某种协议与网络相连. 互联网层(Internet Layer)是整个体系结构的关键部分,其功能是使主机可以把分组发往任何网络,并使分组独立地传向目标.这些分组可能经由不同的网络,到达的顺序和发送的顺序也可能不同.高层如果需要顺序收发,那么就必须自行处理对分组的排序.互联网层使用因特网协议(IP,Internet Protocol).TCP/IP参考模型的互联网层和

Linux档案属性与目录配置

Linux 档案属性嗯! 既然要让你了解 Linux 的档案属性, 那么有个重要的也是常用的指令就必须要先跟你说啰! 那一个?!就是『 ls 』这一个 list 档案的指令啰!在你以 root 的身份登入 Linux 之后,下达『ls -al 』看看,会看到底下的几个咚咚: [ 1 ]               [ 2 ] [ 3 ]   [ 4 ]   [ 5 ]       [ 6 ]               [ 7 ][ 属性 ]        [连结][拥有者][群组][档案容量]

Linux网络属性配置命令和管理详解

一.Linux网络属性配置 1.Linux主机接入到网络方式 IP/NETMASK:实现本地网络通信 路由(网关):可以进行跨网络通信 DNS服务器地址:基于主机名的通信,Linux可以有三个DNS地址 当第一个地址本身挂了,才会查找其备用地址:若第一个地址无法解析则停止 2.网络属性配置方式 (1)静态指定 1)命令方式 ifcfg系列命令: ifconfig:配置IP,NETMASK route:配置路由相关信息 netstat:状态及统计数据查看 iiproute2系列命令: ip OBJ

学习笔记之linux网络属性配置及其命令用法

Linux网络属性配置 先来了解一点网络的基础知识:(这些只需记住) TCP/IP:协议栈(使用中的模型) ISO,OSI:协议栈(学习中的模型) MAC:Media Access Control(介质访问控制) 48bits:(48位二进制) ICANN:24bits, 2^24(组织将这个地址做了定义) 地址块:2^24 网桥(bridge):MAC地址表 网桥自身特性: 静态指定: 动态学习:根据原地址学习: 交换机(switch):多端口网桥: IP(Internet protocol互

Linux网络属性配置相关命令

Linux网络属性配置相关命令: 前言: Linux属性配置可以分为两类.一类通过命令配置,另一类通过修改配置文件配置. Linux属性配置的相关命令可以分为三大类: 一.ifcfg命令家族:①ifconfig,②route,③netstat,④hostname ①ifconfig命令:主要负责接口及地址查看和管理 ifconfig [INTERFACE] #ifconfig -a:显示所有接口,包括inactive状态的接口.(包括激活和未激活的接口): 如图所示,-a选项将会显示所有接口,包

Linux网络属性配置命令

一.Linux网络属性配置 1.Linux主机接入到网络方式 IP/NETMASK:实现本地网络通信 路由(网关):可以进行跨网络通信 DNS服务器地址:基于主机名的通信,Linux可以有三个DNS地址 当第一个地址本身挂了,才会查找其备用地址:若第一个地址无法解析则停止 2.网络属性配置方式 (1)静态指定 ①命令方式 ifcfg系列命令: ifconfig:配置IP,NETMASK route:配置路由相关信息 netstat:状态及统计数据查看 iiproute2系列命令: ip OBJE

Linux网络属性配置—修改配置文件

修改配置文件 1.ip.MASK.GW.DNS配置文件的位置: /etc/sysconfig/network-scripts/ifcfg-IFACE [[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet 接口类型,常见的有ETHERNET(以太网).Bridge(桥接接口) BOOTPROTO=dhcp 激活此接口使用什么协议来配置接口属性:dhcp,boot,static,none

Linux网络属性管理

Linux网络属性管理局域网:以太网,令牌环网 Ethernet:CSMA/CD 冲突域 广播域 路由器隔离广播域 MAC:Media Access Control 48bits: 24bits:IANA分配 24bits:厂商分配 IP:Internet Protocol ifconfig启用混杂模式:[-]promisc 抓包时使用,"-"表示不开启,不加"-"表示开启route02-2 25'' [[email protected] ~]# netstat -