文档章节

Linux下TCP keepalive属性的表现

LvSin
 LvSin
发布于 2015/03/05 10:56
字数 365
阅读 3.3K
收藏 3

tcp是面向连接的,在实际应用中通常都需要检测连接是否还可用.如果不可用,可分为:
a. 连接的对端正常关闭.
b. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法通知对端的,所以连接会一直存在,浪费国家的资源.


tcp协议栈有个keepalive的属性,可以主动探测socket是否可用,不过这个属性的默认值很大.
全局设置可更改/etc/sysctl.conf,加上:
net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 60

在程序中设置如下:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/tcp.h>

int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测 
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

在程序中表现为,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT.

© 著作权归作者所有

LvSin
粉丝 4
博文 24
码字总数 17598
作品 0
沈阳
技术主管
私信 提问
加载中

评论(1)

itfanr
itfanr
浪费国家的资源。。。政府很感动
linux下netstat --timers / -o详解及keepalive相关

在linux查看网络连接数或者网络状态,我一般用netstat或者lsof这两种,netstat的话有个时间计时功能,里面涉及到不少tcp/ip协议的知识,今天就来说一说我理解的netstat计时功能。 netstat -a...

在下郑小明
2018/06/26
0
0
针对Web服务器总体优化

一、文件系统 在fstab里加入noatime,如 #cat /etc/fstab /dev/sda1 /home ext3 noatime,defaults 1 2 reboot或者重新mount生效 二、Tcp优化 在/etc/sysctl.conf里加入 net.ipv4.netfilter.i......

范堡
2009/05/06
445
0
TCP keepalive 详解

TCP keep-alive的三个参数 可以直接用cat来查看文件的内容,就可以知道配置的值了。 也可以通过sysctl命令来查看和修改: 在 socket 编程中,我们对指定的 socket 添加 SOKEEPALIVE 这个 op...

大富帅
2019/11/27
0
0
基于Nginx实现10万+并发,你应该做的Linux内核优化

基于Nginx实现10万+并发,你应该做的Linux内核优化 由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx...

linjin200
2018/04/30
243
2
聊聊 TCP 中的 KeepAlive 机制

原文出处:王爵 服务端的系统设置中经常会和底层协议打交道,我们有必要重温一下曾经那些“听过”却不熟悉的名词。 今天聊的话题是 KeepAlive,在实际应用中又是怎么使用的? 为什么有Keepa...

王爵
2017/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

上海哪里可以开装卸费发票-中国-新闻网

上海哪里可以开装卸费发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17060824738
21分钟前
47
0
上海哪里可以开家用电器发票-中国-新闻网

上海哪里可以开家用电器发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bri...

17095186967
24分钟前
30
0
上海哪里可以开医疗器械发票-中国-新闻网

上海哪里可以开医疗器械发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bri...

17095420210
24分钟前
82
0
上海哪里可以开装修费发票-中国-新闻网

上海哪里可以开装修费发票【152 * 9б 28 * 21 б9】陈生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

17095186960
31分钟前
25
0
Jprofile解析dump文件使用详解

1 Jprofile简介 官网 下载对应的系统版本即可 性能查看工具JProfiler,可用于查看java执行效率,查看线程状态,查看内存占用与内存对象,还可以分析dump日志. 2 功能简介 选择attach to a l...

JavaEd
今天
62
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部