常用的 TCP KeepAlive 参数
转自:http://dola.xinfan.org/?p=359
我们知道 TCP 协议有检测连接状态的机制,当连接不活跃的时候,连接双方会通过一定的算法检测连接是否正常。这个机制就是 TCP 的 KeepAlive 算法。
如果不使用 KeepAlive 算法检测连接状态,会导致单方面断开连接后,另一方无法感知。比如 A 在用 recv 函数等待 B 发送数据,但这时候 B 已经失效,A 会一直等在 recv 函数上不能返回。
要启用 KeepAlive,我们要使用 setsockopt 函数来实现。在 Python 中是这么做的:
| 1 2 3 4 5 6 | #!/usr/bin/env pythonimportsockets =socket.socket()s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) | 
最后一个参数1表示启用 KeepAlive。程序会使用系统默认的参数进行连接状态检测。
在 Debian 操作系统中,默认在连接 idle 7200 秒(/proc/sys/net/ipv4/tcp_keepalive_time)后才发送第一个 KeepAlive 状态检测包,整整两个小时,着实有点长,对有些应用场景不太适合。因此,我们通常需要调整触发 KeepAlive 的 idle 时间间隔:
| 1 | s.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 10) | 
最后一个参数 10 表示在连接不活跃 10s 后开始 KeepAlive 检测。
开始 KeepAlive 检测之后,程序会每隔一定时间发送一次 KeepAlive 状态检测包,Debian 操作系统下默认是 75 秒(/proc/sys/net/ipv4/tcp_keepalive_intvl)发送一次,我们也可以在程序中定义这个发送间隔:
| 1 | s.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, 6) | 
最后一个参数表示每隔 6s 发送一次。
连接的另一方收到 KeepAlive 状态检测包后会发送一个响应包,表示还活着。如果对方未及时发送响应包,程序会对失败次数进行记录,Debian 操作系统中如果连续 9 次(/proc/sys/net/ipv4/tcp_keepalive_probe)失败,会认为对方已经失效,会触发连接异常操作,中断所有正在进行的操作,比如 recv 会返回 -1,并设置 error code 为 Broken Pipe。当然,我们也可以在程序中定义允许失败的次数:
| 1 | s.setsockopt(socket.SOL_TCP, socket.TCP_KEEPCNT, 3) | 
在这个例子中,我们把它设置成了 3 次。
在 Linux 操作系统中,我们可以使用 netstat 工具使用 –timer 参数来查看当前系统中的 tcp 连接的 KeepAlive 状态:
| 1 2 3 4 5 6 7 8 | # netstat -anplt --timerActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Programname Timertcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2066/sshdoff (0.00/0/0)tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2012/mysqldoff (0.00/0/0)tcp        0      0 172.16.10.23:22         172.16.10.1:46726       ESTABLISHED 7280/0keepalive (5053.74/0/0)tcp6       0      0 :::80                   :::*                    LISTEN      7150/apache2off (0.00/0/0)tcp6       0      0 :::22                   :::*                    LISTEN      2066/sshdoff (0.00/0/0) | 
常用的 TCP KeepAlive 参数的更多相关文章
- (转)常用的 TCP KeepAlive 参数
		socket编程里通过setsockopt系统调用针对单独的socket进行设置,可以覆盖Linux Kernel的选项.举个例子,以我的系统默认设置为例,kernel默认设置的tcpkeepaliv ... 
- 聊聊TCP Keepalive、Netty和Docker
		聊聊TCP Keepalive.Netty和Docker 本文主要阐述TCP Keepalive和对应的内核参数,及其在Netty,Docker中的实现.简单总结了工作中遇到的问题,与大家共勉. 起因 ... 
- TCP KeepAlive机制理解与实践小结
		0 前言 本文将主要通过抓包并查看报文的方式学习TCP KeepAlive机制,以此加深理解. 1 TCP KeepAlive机制简介 TCP长连接下,客户端和服务器若长时间无数据交互情况下,若一方出 ... 
- TCP心跳 | TCP keepAlive(转)
		应用层对于每个socket采用如下函数来开启 keepalive机制,其参数将采用系统上述配置. setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&a ... 
- tcp ip参数详解
		http://www.cnblogs.com/digdeep/p/4869010.html 1. TCP/IP模型 我们一般知道OSI的网络参考模型是分为7层:“应表会传网数物”——应用层,表示层,会 ... 
- Linux内核TCP/IP参数分析与调优
		转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/167.html?1456482565 如下图展示的是TCP的三个阶段.1,TCP三次握手. ... 
- 【转载】TCP保活(TCP keepalive)
		下图是我遇到tcp keepalive的例子: 以下为转载: TCP保活的缘起 双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据 ... 
- mysqldump的常用语句及各参数详解
		mysqldump的常用语句及各参数详解 分类: MySQL 2011-01-11 17:55 1368人阅读 评论(0) 收藏 举报 数据库mysql服务器tableinsertdatabase m ... 
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
		1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ... 
随机推荐
- 云原生的弹性 AI 训练系列之一:基于 AllReduce 的弹性分布式训练实践
			引言 随着模型规模和数据量的不断增大,分布式训练已经成为了工业界主流的 AI 模型训练方式.基于 Kubernetes 的 Kubeflow 项目,能够很好地承载分布式训练的工作负载,业已成为了云原生 ... 
- 2018ICPC南京D. Country Meow
			题目: 题意:三维里有n个点,找一个最小的球将所有点覆盖. 题解:退火法模拟的一道板子题. 1 #include <stdio.h> 2 #include <iostream> ... 
- IgniteMe -高校网络信息安全运维挑战赛
			1 int __cdecl main(int argc, const char **argv, const char **envp) 2 { 3 void *v3; // eax 4 int v4; ... 
- (数据科学学习手札114)Python+Dash快速web应用开发——上传下载篇
			本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ... 
- 在docker容器中使用cplex-python37
			技术背景 线性规划是常见的问题求解形式,可以直接跟实际问题进行对接,包括目标函数的建模和各种约束条件的限制等,最后对参数进行各种变更,以找到满足约束条件情况下可以达到的最优解.Cplex是一个由IBM ... 
- C/C++ 中的算术及其陷阱
			目录 概述 C/C++ 整数的阴暗角落 整型字面量 整型提升与寻常算术转换 算术溢出检测 位运算技巧 总结 参考 概述 无符号数和有符号数是通用的计算机概念,具体到编程语言上则各有各的不同,程序员是解 ... 
- APP或者前端通过识别用户代理详细信息和浏览器数据进行安全防御
			使用用户代理解析API 识别 访问您网站的浏览器,机器人,操作系统和设备 上手免费 阅读文档 解码用户代理 识别检测浏览器,操作系统,平台,设备类型以及其他30多个字段 多种浏览器,机器人,手机,平板 ... 
- OO第一单元总结与反思
			OO第一单元总结与反思 目录 OO第一单元总结与反思 摘要 第一次作业 本次作业UML类图 本次作业度量分析 第二次作业 本次作业的UML类图 本次作业的度量分析 第三次作业 本次作业的UML类图: ... 
- .netcore ioc 循环依赖问题及其相关思考之DispatchProxy
			.netcore引入了ioc机制让开发人员逐步习惯从过去的各种new对象变成通过IOC框架来管理对象的生命周期.这样当我们需要某个对象的时候,我们一般在构造函数里申明该对象的接口,即可通过ioc容器创 ... 
- ATMS中去拉起新的进程,并在新进程启动后调用attachApplication时,resume待启动的Activity
			相关文章: ATMS中去pause Activity A. 目录 ATMS拉起新进程 堆栈 resumeTopActivityInnerLocked:1684, ActivityStack start ... 
