首页 > 其他分享 >[转]TCP的keep-alive

[转]TCP的keep-alive

时间:2024-02-05 09:44:36浏览次数:33  
标签:setsockopt socket SOL tcp keep TCP alive keepalive

TCP的keep-alive可以在不增加服务器处理逻辑的前提下,检测客户端连接是否中断

/proc/sys/net/ipv4/tcp_keepalive_time 开始首次KeepAlive探测前的TCP空闭时间
/proc/sys/net/ipv4/tcp_keepalive_intvl 两次KeepAlive探测间的时间间隔
/proc/sys/net/ipv4/tcp_keepalive_probes 判定断开前的KeepAlive探测次数

对 于一个已经建立的tcp连接。如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 keepalive数据包,若没有收到应答,则每隔keepalive_intvl时间再发送该数据包,发送keepalive_probes次。一直没有 收到应答,则发送rst包关闭连接。若收到应答,则将计时器清零。

谁想定期检查连接状况,谁就启用keep alive。另一端可以不起,只是被动地对探测包进行响应,这种响应是tcp协议的基本要求,跟keep alive无关。并不需要客户端和服务器端都开启keep alive。

Remember that keepalive support, even if configured in the kernel, is not the default behavior in Linux. Programs must request keepalive control for their sockets using the setsockopt interface.

虽然是全局配置,但想要生效,还得程序各自开启

int keepalive = 1; // 开启keepalive属性
int keepidle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepinterval = 5; // 探测时发包的时间间隔为5 秒
int keepcount = 3; // 探测尝试的次数。如果第1次探测包就收到响应了,则后2次的不再发。
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive));
// 可配置各socket自己的keepalive参数
setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));
setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));
setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));

Remember that keepalive is not program-related, but socket-related, so if you have multiple sockets, you can handle keepalive for each of them separately.

从上面的接口也可以看出,keepalive设置是socket相关的。
另外这些属性是sockt继承的,即listen的套接字设置该属性后,后面建立连接后的accept 套接字同样继承该属性(心跳属性)。

import socket

HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
s.setsockopt(socket.SOL_TCP, socket.SO_KEEPIDEL, 10)
s.setsockopt(socket.SOL_TCP, socket.SO_KEEPINTVL, 3)
s.setsockopt(socket.SOL_TCP, socket.SO_KEEPCNT, 2)

conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
conn.close()

但是,tcp自己的keepalive有这样的一个bug:

正常情况下,连接的另一端主动调用colse关闭连接,tcp会通知,我们知道了该连接已经关闭。但是如果tcp连接的另一端突然掉线,或者重启断电,这个时候我们并不知道网络已经关闭。而此时,如果有发送数据失败,tcp会自动进行重传。重传包的优先级高于keepalive,那就意味着,我们的keepalive总是不能发送出去。 而此时,我们也并不知道该连接已经出错而中断。在较长时间的重传失败之后,我们才会知道。

参考
http://www.tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/
http://blog.csdn.net/ctthuangcheng/article/details/8596818
http://blog.csdn.net/ctthuangcheng/article/details/9450087
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/rainharder/article/details/47022903

标签:setsockopt,socket,SOL,tcp,keep,TCP,alive,keepalive
From: https://www.cnblogs.com/dongzhiquan/p/18007417

相关文章

  • 问题:在TCP的拥塞控制中,什么时候会使拥塞窗口重置为1?
    问题:在TCP的拥塞控制中,什么时候会使拥塞窗口重置为1?A:发生拥塞时;B:拥塞窗口超过慢开始门限时;C:分组超时时;D:慢开始门限重置为拥塞窗口的一半时参考答案如图所示......
  • centos7安装keepalived和双活主机配置
    yum安装yuminstall-ykeepalived配置文件位置/etc/keepalived/keepalived.conf这总方式安装的keepalived版本比较旧,centos7里面默认是1.3.5,是2017年的版本。需要新的版本可以考虑编译安装查看yum安装默认的版本[root@vm200~]#yuminfokeepalivedLoadedplugins:f......
  • Tcpdump和Wireshark的学习与使用
    Tcpdump和Wireshark的学习与使用背景2024年2月份农历小年时。同事为了解决一个应用忽快忽慢的问题去了上海客户那里。第二天自己在理发时(周末)接到了他的电话,说到了一些问题情况。比较明确的是,应用和数据库的请求经常出现20ms左右的高延迟的情况。其实子很早之前学习过tc......
  • DotNetty 封装的TcpClient
    .net里 Netty资料不多,做个记录publicclassNetworkCommunicator:ICommunicator{#regionNetty本来想用静态,后来觉得多个client公用一个netty可能分不清返回的数据,先这样,后期要是吃资源再优化Bootstrap_NettyBoot;IEventLoopGroup_NettyEventLoop;......
  • Zookeeper快速了解
    初识ZookeeperZookeeper是ApacheHadoop项目下的一个子项目,是一个树形目录服务。Zookeeper翻译过来就是动物园管理员,他是用来管Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zkZookeeper是一个分布式的、开源的分布式应用程序的协调服务。Zookeeper提供的......
  • CH392作服务器TCP Server应用配置使用
    CH392工作在TCPServer模式时,参考手册说明需要打开监听Socket端口,也要设置数据连接Socket端口,注意数据连接Socket的源端口和监听Socket的源端口一致。 配置TCPServerSocket数代码处理如下:voidInitCH392InfParam(void){memset(&CH392Inf,0,sizeof(CH392Inf......
  • Palivens电源净化器开箱
          以前买过一个Palivens的HIFI的滤波器,这次又买了一个新的,不同的是这次的这个滤波器是直条型的插座。内部的滤波构造没拆开看,所以只是外部的开箱,具体的滤波效果因为没有专业的仪器,所以这次就没尽兴测试了。*+1、       包装照; 2、       内部照;  3、......
  • 【工具】结合tcpdump/wireshark捕获码流快速构造测试场景
    源码如下:CommonHeader.h#ifndefTESTAPP_COMMONHEADER_H#defineTESTAPP_COMMONHEADER_H#include<array>#include<vector>#include<list>#include<queue>#include<stack>#include<set>#include<map>#include<......
  • 运输层的TCP与UDP协议(学习笔记)
    一、运输层1.逻辑通信结构2.端口号、复用与分用二、TCP与UDP的区别1.概览图2.用户数据报协议UDP(UserDatagramProtocol)UDP面向应用层报文,可以在任何时候发起传输(无连接),向上层提供不可靠传输服务,即如果传输过程中出现误码,也不会触发重传。可以支持一对一、......
  • Palivens电源净化器开箱
          以前买过一个Palivens的HIFI的滤波器,这次又买了一个新的,不同的是这次的这个滤波器是直条型的插座。内部的滤波构造没拆开看,所以只是外部的开箱,具体的滤波效果因为没有专业的仪器,所以这次就没尽兴测试了。*+1、       包装照; 2、       内部照; ......