OpenVPN莫名其妙断线的问题及其解决-confirm
本文很短,目的在于confirm一下凌乱的《 OpenVPN莫名其妙断线的问题及其解决》,如果看觉得我比较啰嗦,那么一定要看看最后一个小节,好在CSDN为每篇文章都自动添加了目录,可以直接跳转到最后一节。
1.控制通道
控制通道主宰OpenVPN的SSL握手,密钥协商以及重协商。因此其健壮性直接影响到隧道是否能够建立成功。因此优化后burst retransmit直接影响恶劣网络环境下的隧道建立过程,使之更容易建立。一旦窗口由于ACK乱序/丢失而爆满,马上重传ID最小的包,期待收到ACK延展窗口!
原则:你丢包我就以多次重发来稀释掉丢包率,虽然这种方式有点自私,但是恶劣环境中求生是需要自私的。
效果:由于控制通道的数据量有限,因此需要比较极端的方式来展现这个修改是有效的,那就是设置以下几个参数:
ping:设置为5秒,尽可能短,但不要太短
ping-restart:设置成120秒,尽可能和ping拉开距离,这两个参数保证不会因为ping-restart导致断开,这样就将问题全部集中在控制通道了
reneg-sec:将它设置成2,即2秒钟进行一次密钥重协商
hand-window:将它设置成15,即15秒内如果SSL通道上的握手,密钥重协商没有成功,则算断开
tran-window:将它设置成5,即hand-window内失败的话,持续5秒钟隧道断开,该参数是可选的
用retry版本和标准版本测试,发现极端情下,标准版本几乎会瞬间失败,但是retry版本明显好很多。
2.数据通道
平时隧道有数据通过的时候,timer总是会reset,没有数据的时候,就依靠在数据通道发送PING来reset对端的timer。如果ping-restart到期timer都没有reset,则断开隧道。因此没有隧道数据时,更容易断开!注意,只要隧道建立,密钥协商好,除了重协商或者推送,控制通道基本空闲。因此影响隧道接通后断开的因素在ping,ping-restart参数。
3.高丢包率环境二者关系
一旦高丢包率且没有隧道数据过境,数据通道就会完全依靠PING,如果ping-restart过短,PING在恶劣环境下丢包,则隧道就会断开,此时会尝试重新建立隧道,因为此时已经是恶劣环境了,丢包率很高,ACK很容易乱序/丢失,加上OpenVPN在窗口满时不会马上重传,故而隧道久久不能建立。所以是,数据通道断开反映了网络环境已经恶化,这种恶化进而影响接下来的控制通道的握手和协商,所以针对OpenVPN断开的问题要双管齐下,第一拉长ping和ping-restart的距离(但是不能泛PING),第二,如《OpenVPN莫名其妙断线的问题及其解决》一样修改OpenVPN的重传调度逻辑。
4.程序极限
程序员往往希望一厢情愿地彻底解决问题!极端的情况就是,因为TCP是保证传输的,所以即使网线被剪断了,程序员还是希望(也仅仅是希望而已)能写出什么神秘的代码来接通网络,也还是希望发现是由于自己代码写的不够好才导致丢包,断线。但是对于网络工程师,就反过来了,他丝毫不管应用程序如何,上去就是show这show那,检查网线...有时候还真的就是socket阻塞了。事实上,对于OpenVPN断线的问题,也有一种处理极限,那就是网络真的不通了,丢包率真的太大了。那怎么办,那就只能断线了,这是我们所解决不了的,我们能做的就是保证损失降低到最小而已,并且告知用户发生了什么,让用户知道,虽然网络不通了,但是OpenVPN依然在不断努力中。
5.不修改OpenVPN的防断方案
不管怎么说,OpenVPN也是经过很多测试的成熟代码,它的重传调度虽然不及时,单是毕竟会重传!如果有重大问题,早就在社区被修改了。另外要注意的是,大多数时候,控制通道的数据包以及ACK并不是丢了,而是延迟到达,这样的话,仅仅通过延长超时时间就可以解决,幸运的是,OpenVPN本身给出了很多超时时间的配置:
a.增加ping,ping-restart的差值,可以确保不会轻易由于收不到ping而断开;
b.延长hand-window可以给控制通道的密钥协商预留足够的时间;
c.延长tran-window可以进一步在已经发觉要断和隧道真正断开之前的这期间,做reneg的最后尝试;此参数要大于reneg-sec!
...
6.我做的一切都是画蛇添足,但是...
实际上,当我回归看代码的时候,发现我所做的针对OpenVPN的修改本来就已经实现了,只是我研究其参数配置还没有细化到一定程度,所以我就自行进行了修改,对于我能找到点子上,并且设计出了一个schedule接口:
void reliable_schedule_id (struct reliable *rel, time_t timeout, packet_id_type id);
我很欣慰,但是我还是重新实现了已经实现的东西,重造了轮子!这是大多数初中级程序员的典型行为!
我们来看一下以下的这个配置参数:
--tls-timeout n
Packet retransmit timeout on TLS control channel if no acknowledgment from remote within n seconds (default=2).
When OpenVPN sends a control packet to its peer, it will expect to receive an acknowledgement within n seconds or
it will retransmit the packet, subject to a TCP-like exponential backoff algorithm. This parameter only applies
to control channel packets. Data channel packets (which carry encrypted tunnel data) are never acknowledged,
sequenced, or retransmitted by OpenVPN because the higher level network protocols running on top of the tunnel
such as TCP expect this role to be left to them.
默认2秒钟,如果想让重传密集化,那么设置为1好了,虽然依靠这个参数带来的是全局意义的重传超时配置,但是我相信网络会解决好拥塞问题的。比较下来,我的修改只针对ID最小的包,即仅仅重传阻碍窗口推进的包,可能更加合理,但是OpenVPN自带的tls-timeout足以解决已经存在的ACK乱序丢失问题了,要拒绝完美,容忍不完美,这才是成事的关键!如果要完美,那么代码中就会充斥很多的所谓小技巧。
花了大量的时间考虑如何修改OpenVPN的代码,到头来却是代码回退!
OpenVPN莫名其妙断线的问题及其解决-confirm的更多相关文章
- OpenVPN莫名其妙断线的问题及其解决
1.问题 不得不说,这是一个OpenVPN的问题,该问题几乎每个使用OpenVPN的人都碰到过,也有很多人在网上发问,然而一直都没有人能给出解决办法,甚至很多帖子上表示因为这个问题而放弃了使用Open ...
- linux主机名莫名其妙变成了bogon,并解决修改为localhost
起因:公司网络接口做了接口认证,虚拟机桥接至物理网卡无法完成认证进行网络访问,无奈之下只能讲虚拟机网络模式更改为NAT模式,更改完成之后进行ssh登录,发现主机名发生了变化. 更改NAT模式之前 [r ...
- OpenVPN GUI出现CreateProcess错误的解决方法
问题描述 启动 OpenVPN GUI 时失败,提示“CreateProcess Failed, exe=’X:\XXXXX\OpenVPN\bin\openvpn.exe’ cmdline= ...
- openvpn配置教程
openvpn配置教程 本文是为解决本地服器能从外网访问web页,从新改写(临摹) 烂泥:ubuntu 14.04搭建OpenVPN服务器这篇文章 腾讯云为服务器,本地服务器为客户端 一.服务器安装o ...
- OpenVPN多处理之-多队列TUN多线程
1.有一点不正确劲 在改动了那个TUN驱动后,我在想,为何我总是对一些驱动程序进行修修补补而从来不从应用程序找解决方式呢?我改动了那个TUN驱动,可是能保证我的改动对别的应用一样可用吗?难道TUN驱动 ...
- eclipse中 web项目缺少tomcatl lib的解决办法
1.最近在搭建的项目中,将项目导入eclipse中突然报好多错误,查看后全是丢失tomcat的lib包的错误,莫名其妙的错误. 代码中缺少的也是这样的问题 很明显,我之前的包丢了,莫名其妙的丢了. 解 ...
- 【JVM】linux上tomcat中部署的web服务,时好时坏,莫名其妙宕机,报错:There is insufficient memory for the Java Runtime Environment to continue.
=========================================================================================== 环境: linu ...
- OpenVPN原理及实践文章收集(转)
一.基本理论篇 vpn原理及实现--一般理论 vpn原理及实现--隧道的一种实现 vpn原理及实现--虚拟网卡构建vpn vpn原理及实现--tcp还是udp Linux平台VPN技术概论 Linux ...
- android webview 遇到的问题:external/chromium/net/disk_cache/stat_hub.cc:216:
今天也遇到这个问题,界面显示无法访问,Baidu吧,结果有些含糊其词,有的说加网络权限,我看了下我的, 有个 <uses-permission android:name="androi ...
随机推荐
- iOS多线程之GCD小记
iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...
- css水平居中和垂直居中
水平居中:内联元素:text-align:center;相对于父级居中显示块级元素:margin:0 auto;但是需要同时width,否则无法看到效果多个块级元素居中:在此想要探讨一下display ...
- Modules-nodejs
Modules Node有一个简易的模块加载系统.在node中,文件和模块是一一对应的.下面示例是foo.js加载同一目录下的circle.js. foo.js的内容: var circle = re ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇03:子弹发射》
3.子弹发射 子弹发射概述: 在打飞机游戏中,子弹是自动发射的.子弹与子弹之间间隔一定的时间,玩家通过上下左右控制游戏角色,来达到躲避敌人及击中敌人的操作. 发射原理: 抽象理解为有两个容器存放子弹, ...
- Hadoop在百度的应用
百度作为全球最大的中文搜索引擎公司,提供基于搜索引擎的各种产品,包括以网络搜索为主的功能性搜索:以贴吧为主的社区搜索:针对区域.行业的垂直搜索.MP3音乐搜索,以及百科等,几乎覆盖了中文网络世界中所有 ...
- 使用logback.xml配置来实现日志文件输出
转自:http://sungang-1120.iteye.com/blog/2104296 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback- ...
- 开元硬件平台 Arduino
开放源代码的电路图设计,程序开发接口免费下载,也可依个人需求自己修改. Arduino不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台,更是硬件开发的趋势.Arduino简单的开发方式使得开发 ...
- 现代C++作业2 与 围棋homework-06
本文第一部分是现代C++作业2,第二部分是对围棋程序的部分建议,还有一些修改和优化体现在Github里面的代码中. 首先是现代C++作业. 1. 了解Lambda的用法.计算“Hello World! ...
- 常用的Activex 控件
1. Flash Player ActiveX Control 6.0.47.0 与FLASH 6.0配套的浏览器端动画播放插件 download.pchome.n ...
- POJ1062昂贵的聘礼(dijkstra)
昂贵的聘礼 题目大意是说有N个物品,每个物品都有自己的价格,但同时某些物品也可以由其他的(可能不止一个)替代品,这些替代品的价格比较“优惠”,问怎么样选取可以让你的花费最少来购买到物品1 由于有N个物 ...