(转)常用的 TCP KeepAlive 参数
socket编程里通过setsockopt系统调用针对单独的socket进行设置,可以覆盖Linux Kernel的选项。举个例子,以我的系统默认设置为例,kernel默认设置的tcpkeepalivetime是7200s, 如果我在应用程序中针对socket开启了KeepAlive,然后设置的TCP_KEEPIDLE为10,那么TCP协议栈在发现TCP链接空闲了10s没有数据传输的时候就会发送第一个探测报文。
转自: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 python import socket s = 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 --timer Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID /Program name Timer tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2066 /sshd off (0.00 /0/0 ) tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 2012 /mysqld off (0.00 /0/0 ) tcp 0 0 172.16.10.23:22 172.16.10.1:46726 ESTABLISHED 7280 /0 keepalive (5053.74 /0/0 ) tcp6 0 0 :::80 :::* LISTEN 7150 /apache2 off (0.00 /0/0 ) tcp6 0 0 :::22 :::* LISTEN 2066 /sshd off (0.00 /0/0 ) |
(转)常用的 TCP KeepAlive 参数的更多相关文章
- 常用的 TCP KeepAlive 参数
转自:http://dola.xinfan.org/?p=359 我们知道 TCP 协议有检测连接状态的机制,当连接不活跃的时候,连接双方会通过一定的算法检测连接是否正常.这个机制就是 TCP 的 K ...
- 聊聊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断连的因素 如果网络正常 ...
随机推荐
- Java 的Event机制浅析
https://blog.csdn.net/kehyuanyu/article/details/23540901
- 单片机软件proteus的汉化步骤
整体思想:把汉化包里的文件替换软件的英文的软件 右键打开文件安装的位置,找到Translations文件夹,打开它等待被替换. 打开这个找到Translations文件夹,把下面的文件全部复制替换上面 ...
- [CF543A]/[CF544C]Writing Code
[CF543A]/[CF544C]Writing Code 题目大意: 有\(n\)种物品,每种物品分别要\(c_i\)的代价,每个物品有\(1\)的体积,每个物品可以选多个,代价不能超过\(b\), ...
- PHP判断iPhone、iPad、Android、PC设备的方法
因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段php判断iPhone.iPad.Android.PC设备的例子. 注意:本代码的PC系统为 ...
- MyBatis 命名空间与命名解析
命名空间 使用完全限定名来进一步区分语句. 命名解析 为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用如下的命名解析规则: 完全限定名(比如“com.mypack ...
- Java中map集合系列原理剖析
看了下JAVA里面有HashMap.Hashtable.HashSet三种hash集合的实现源码,这里总结下,理解错误的地方还望指正 HashMap和Hashtable的区别 HashSet和Hash ...
- printf scanf cin cout的区别与特征
printf和scanf是c语言的输入输出,学习c++以后,自然是用cin cout这两个更简单的输入输出 printf scanf 都需要进行格式控制,比较麻烦,但优点是速度比较快,毕竟多做了一些事 ...
- 代码d17
admin.py from django.contrib import admin from crm import models # Register your models here. class ...
- Ubuntu下实验安装
1.Ubuntu下安装sublime : http://www.linuxidc.com/Linux/2015-01/112137.htm 2.http://www.linuxidc.com/Linu ...
- 前端工程化系列[04]-Grunt构建工具的使用进阶
在前端工程化系列[02]-Grunt构建工具的基本使用和前端工程化系列[03]-Grunt构建工具的运转机制这两篇文章中,我们对Grunt以及Grunt插件的使用已经有了初步的认识,并探讨了Grunt ...