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 ...
随机推荐
- javascript 继承、命名空间实现分享
命名空间是用来组织和重用代码的编译单元,在大型项目开发中javascript使用的越来越多时,我们就应该将项目里的js类库管理起来,如何将自己进行归类管理,防止命名冲突,但是Javascript默认不 ...
- 关于在Eclipse里面启动了服务,但是localhost:8080无法访问的问题:
今天eclipse重新换了一个然后写项目,结果发生了一些bug,当在Tomca服务开启之后,浏览器端输入localhost:8080无法访问,以为是服务器没有搞定,检查了没问题,百度了一下有很多乱七八 ...
- res/raw和assets的 区别
res/raw和assets的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.ja ...
- Java相关书籍推荐
Java从入门到精通(第3版 附光盘) 作 者 明日科技 编 出 版 社 清华大学出版社 出版时间 2012-08-01 版 次 3 页 数 564 印刷时间 2012- ...
- JSON 省市数据包括港澳
data: [{ name: "北京", cities: ["西城", "东城", "崇文", "宣武&quo ...
- Eclipse与tomcat服务器建立关联
首先,点击 打开preference,打开如下界面 点击ADD,进入如下界面,选择tomcat服务器的版本->点击next 进入如下界面,Name:服务器名字,directory:服务器目录 补 ...
- MySQL存储过程权限分析
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://huanghualiang.blog.51cto.com/6782683/1216 ...
- 惊艳的随机化方法 -World Search (homework-04)
homeword04-word search 0. 摘要 本次作业,要求完成一个word search的程序,具体要求是: 输入:一个包含20-60个单词的文件,各单词不大于20个字母,无空格. 输出 ...
- HTML 5的革新:结构之美
HTML 5是什么,无须我在这里赘述了.对于HTML 5的革新,按我的理解,可以总结为语义明确的标签体系.化繁为简的富媒体支持.神奇的本地数据存储技术.不需要插件的富动画(canvas).强大的API ...
- 详解Java解析XML的四种方法
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM ...