Ubuntu20下C/C++编程开启TCP KeepAlive

本文详细介绍了如何在Linux系统中测试和配置TCP保活功能,包括关键参数tcp_keepalive_time、tcp_keepalive_intvl和tcp_keepalive_probes的解释和修改方法,以及如何通过编程设置这些参数。此外,还展示了如何使用Wireshark监控带有TCPkeepalive的通信情况。
摘要由CSDN通过智能技术生成

1、在linux下,测试tcp保活,可以使用tcp自带keepalive功能。

2、几个重要参数:

  •        tcp_keepalive_time:对端在指定时间内没有数据传输,则向对端发送一个keepalive packet,单位:秒
  •        tcp_keepalive_intvl:向对端发送了一个keepalive packet,如果对端无响应,则等待tcp_keepalive_intvl秒后再次发送一个keepalive packet
  •        tcp_keepalive_probes:向对端发送一个keepalive packet,如果对端没有响应,重发的次数,如果tcp_keepalive_probes次数后,对端都没有响应,则表示这个socket已经断开,系统会差生连接断开事件,本地就可以关闭这个socket上连接。

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

      上述三个参数当前配置可以在 /proc/sys/net/ipv4查看   

可以使用cat查看具体配置,比如

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

     sudo vim /etc/sysctl.conf

      net.ipv4.tcp_keepalive_intvl = 20
      net.ipv4.tcp_keepalive_probes = 3
      net.ipv4.tcp_keepalive_time = 60

       保存:wq

       重启系统:sudo reboot

4、编程设置keeepalive:

#include <netinet/tcp.h>


 /*开始设置保活机制*/

int val = 1;

if (setsockopt(nc->sock, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof val) != 0)
{

    perror("Set SO_KEEPALIVE fail");

}

/* 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 = 10;

if (setsockopt(nc->sock, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(val)) < 0)
{

    perror("Set TCP_KEEPIDLE fail");

}

/* 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 = 3;

if (setsockopt(nc->sock, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(val)) < 0)
{

    perror("Set TCP_KEEPINTVL fail");

}

/* Consider the socket in error state after three we send three ACK

* probes without getting a reply. */

val = 3;

if (setsockopt(nc->sock, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof(val)) < 0)
{

        perror("Set TCP_KEEPCNT fail");

}

5、查看通讯情况,打开wireshark,在过滤器输入设置keepalive的Ip格式为:ip.addr==xxx.xxx.xxx.xxx

上图可以看到,每隔10秒钟发送了一个keepalive packet.因为上述代码中,我们设置的TCP_KEEPIDLE=10

      

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值