OpenVPN中的几个和连接相关的Timer解析
在OpenVPN中存在几个计时器,这些计时器限制着OpenVPN的一些特定行为的最长持续时间,如果设置不好,就会带来莫名其妙的断线问题,然而如何设置这些计数器也没有一个通用的方案,特定情况下不能太大也不能太小。
1.ping
该计时器定义了发送PING包的间隔(为了和ICMP ping区分,使用大写,以下使用小写),ping包的发送是一种保活机制,另外也是为了刷新状态防火墙的连接跟踪状态。
2.ping-restart
该计时器定义了在多久内没有收到对方发来的ping包就reset连接,曾经正常接收但是突然没收到对端的ping要么因为对端已死掉不发ping了,要么是因为ping包在路上丢失了,要么就是这个ping-resatrt时间小于一个RTT的一半。
3.hand-window
该计时器限制了一次密钥协商持续的最长时间,如果该时间段内密钥协商没有成功,就会reset掉该SSL连接,然而并不是马上行刑,之前上一次协商好的密钥还能用一段时间,用多久呢?用tran-window参数指示的这段时间,如果在这段时间内,重新发起了密钥协商并且成功,SSL连接就不会被reset。
4.tran-window
该计时器限制了一次密钥协商成功的密钥在新的密钥协商开始后还能使用多久,在这段时间内如果密钥协商不成功,那么老的密钥依然可用。这样的话,密钥重协商就可以和隧道数据的传输同时进行,因为即使在密钥协商的时候,也还是有一个老的密钥可以用的,这样就实现了密钥的平滑过渡。
5.tls-timeout
该计时器定义了一个控制通道的包在没有收到ACK时,重新发送的间隔,如果定义过大,一旦发生丢包-包括原始包丢失以及ACK丢失,将可能带来握手超时以及密钥协商在hand-window内超时,如果定义过小-明显小于一个RTT,将会造成频繁重发引发蝴蝶效应-网络拥塞。
6.ping-timer-rem
这并不是一个计时器,它只是规定了ping-restart的行为而已,也就是说,设置了这个参数后,只有对端实际上已经接入的情况下,才会在ping-restart计时器到期后执行restart操作,这个配置参数避免了双方僵持状态下分别restart对端的情况:
client restart -------------------------- server 正常,没发现
client 重连 -------------------------- server 等待client ping
client 重连成功 -------------------------- server ping-restart到期,restart
如果设置了ping-timer-rem,那么server端只有在client端的socket没有关闭的情况下才会restart该client。
7.总结
数据通道
其中1,2计时器通过数据通道的保活来保证随到可用,另外持续的ping也能持续激活刷新途经的状态防火墙的连接状态使之不过期
控制通道
其中3,4计时器通过限定密钥协商的时间以及密钥平滑过渡的时间来保证SSL控制通道连接的有效性。在OpenVPN的实现中,ssl.c中分别定义了TM_SIZE种session,用于密钥的平滑更新与移交。
reliable层
其中的5计时器影响了reliable层的行为,如果定义了预编译宏EXPONENTIAL_BACKOFF,它甚至影响了reliable层的退避重传算法。
OpenVPN中的几个和连接相关的Timer解析的更多相关文章
- c++使用mysql的api连接相关问题
记录一下自己使用中的相关问题,方便有相同问题的同学解决. 关于在VS中的各种配置.看这里.只是须要注意一下,我如今用的mysql版本号是5.6的,已经没有[MySQL Server \lib\opt] ...
- mysql和连接相关的timeout
MySQL和连接相关的timeout 今天同事问为什么查询mysql库时, 在数据量比较大时,会话总断.刚开始以为是mysql的和连接有关timeout的问题,结果是网络的不稳定的原因. 下面总结下和 ...
- win7中 SQL server 2005无法连接到服务器,错误码:18456
win7中 SQL server 2005无法连接到服务器,错误码:18456.. 数据库刚装完.我用Windows登陆 结果登陆不上去.. 选中SQL Server Management Stud ...
- Zend_Frameowrk中进行多语言国际化的相关的配置和使用
在使用Zend_Framework建立网站,若网站在以后的使用中面向国际,这时就需要实现网站的多语言国际化问题.使用Zend_Framework开发的网站需要进行多语言的开发时,就需要用到了Zend_ ...
- 【转贴】gdb中的信号(signal)相关调试技巧
一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧 转自Magic C++论坛 http://www.magicunix.com/index_ch.html http://www.m ...
- 在 Intellij 中设置集成 Jenkins 服务器连接
如何在 Intellij 中设置集成 Jenkins 服务器连接 在Intellij中可以很方便的设置Jenkins服务器,不用登录到浏览器中,在Intellij中即可浏览所有job,开发plugin ...
- SqlServer 连接 相关。
sqlserver数据库连接池是一个客户端的东西.和sql server服务器无关. 各种provider默认的连接池大小不同. 比如:Ado.NET 中sqlserver 连接池默认的值是100. ...
- JAVA中通过Jedis操作Redis连接与插入简单库
一.简述 JAVA中通过Jedis操作Redis连接与插入简单库 二.依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis ...
- IdentityServer4 中文文档 -2- (简介)相关术语
IdentityServer4 中文文档 -2- (简介)相关术语 原文:http://docs.identityserver.io/en/release/intro/terminology.html ...
随机推荐
- 数据库表中MAX ID获取,确保每次调用没有重复工具类(NumberUtil)
下面这个类是获取数据库中一个字段的最大值.配置在数据库中. public class NoFactory { private final static Logger cLogger = Logger. ...
- XShell 屏幕锁定的恢复方法(Ctrl+Q)
操作XShell过程中很多时间大家会习惯性的按Ctrl+S进行保存. Ctrl+S在XShell的作用是屏幕锁定,很多朋友会无法操作,会直接把窗口关闭. 解决方法: 快捷键 Ctrl+Q 即能完成解锁 ...
- 通过简单的Linux内核启动程序代码窥探操作系统的启动原理
作者:吴乐 山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...
- C语言基础知识--位运算
1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负:其余n-1位为数值位,各位的值可为零或一.当真值为正时,原码.反码.补码数值位 完全相同:当真值为负时, ...
- Todolist
UValive 6041(KD tree) UValive 6042(DP) UValive 6044(图论)
- [置顶] Kendo UI开发教程: Kendo UI 示例及总结
前面基本介绍完Kendo UI开发的基本概念和开发步骤,Kendo UI的示例网站为http://demos.kendoui.com/ ,包含了三个部分 Web DemoMobile DemoData ...
- 问题-PopupMenu是哪个控件调用弹出的?
相关资料: http://bbs.csdn.net/topics/310195683 问题现象:今天有朋友问我个简单的问题,在多个Edit上弹出菜单,怎么判断是哪个Edit调用的.我想了想这个我还真不 ...
- hdu 3038 How Many Answers Are Wrong
http://acm.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 2000/1000 MS ( ...
- iOS异常捕获
文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Crash Callstack分析 – 进⼀一步分析 五. demo地址 六. 参考文献 前言 ...
- dao 获取表最大排序实现
public Long getMaxOrder(Long parentId) { Query query = this.getSession().createSQLQuery( "selec ...