系列目录
- VPN原理及实现1:VPN概念及要点
- VPN原理及实现2:一般理论
- VPN原理及实现3:隧道的一种实现
- VPN原理及实现4:虚拟网卡构建VPN
- VPN原理及实现5:TCP还是UDP
- VPN原理及实现6:TCP封装的隧道对于拥塞控制的意义
- Linux VPN技术概论 1
- Linux VPN技术概论 2
正文
有了ip over ssl的关键思想,openvpn就是一个必然结果了,于是就不多说了,openvpn和openssl并不在一个层次上,虽然都很open。openvpn的配置非常复杂,主要就是为了建立更加合理的隧道,虽然ipsec实现的vpn不区分客户端和服务器,建立sa的时候全靠dh对称的协商加密密钥和算法,但是基于openssl的openvpn却区分二者,因为openvpn的安全是ssl实现的,而ssl区分客户端和服务器,虚拟网卡已经说的很多了,现在说说隧道的一些细节,openvpn可以建立tcp隧道和udp隧道,tcp隧道顾名思义就是用tcp来封装vpn数据流,udp亦然,但是虽然可以使用udp封装,在openvpn中你却不需要担心数据失序,因为udp之上还有ssl,而ssl不允许数据失序,确切的说不应说是ssl,基于udp的ssl实际上是tls,ssl数据由于并不是流式的,而是基于记录的,每次必然读取一条记录,因此ssl是存储接收和存储发送的,如果下面用udp传输,那么就可能出现丢包或者失序的情况,如此一来读取的记录就会不正确,在ssl解密特别是cbc方式解密时就会出错,所以ssl下面必然是可靠而按序的,即使用udp,那么在ssl和udp之间也必须实现可靠和按序。那么到底tcp隧道和udp隧道如何选择呢?我们看一个组合,抛开tcp/udp之外的协议不谈,一共有四种隧道,分别是tcp in tcp,udp in tcp,tcp in udp,udp in udp,第一种和最后一种问题最大,先说第一种,由于tcp是有连接的,如果出现丢包的话,那么不管是隧道还是真实收发方都要重传数据,双方重传的数据实际上是为了一个目的一份数据,vpn路由器仅仅提供封装服务,并不需要为丢包负责,因此收发方负责即可,然而tcp的语义却管不了这么复杂的策略,它只有让二者均重传数据包,如此一来网络一旦丢包,那么紧接着会出现大量的重传,udp in udp的情况正好相反,本来udp就会丢包而且丢后不管,udp式的隧道加重了这个问题,本来不用隧道的网络平均丢包x个,用了隧道就可能丢包n*x个,也不可取,那么就剩下余下的udp in tcp,tcp in udp了,其实需要考虑是不是in前面的协议,而是后面的,因为后面的更底层,我们必须要选出一个协议来创建隧道而不是强迫用户使用某一种协议,那么到底是tcp好还是udp好呢?这似乎又是一个需要权衡的问题,个人认为udp要好些,如果用户使用tcp,那么用户自己就能处理重传和失序问题,不劳vpn代劳,如果用户使用udp,那么说明他不在乎丢包和失序,vpn更不需要多此一举用tcp保证不丢包和按序,画蛇添足反而抵消了用户选择udp的原因。如果用tcp建立隧道的话,用户使用tcp时会导致重传风暴,而用户使用udp时效率会明显降低。但是使用udp的话会有一个问题,那就是如果vpn两端之一断开了连接,由于udp在断开时不管是正常断开还是异常崩溃都不会向另一端发送通知,那么连接双方的连接感知必须通过一个心跳来完成,在openvpn中可以通过--ping和--ping-restart来配置,如果心跳时间过短,虽然感知力增加了,但是心跳风暴不说,在端点物理间距很长时,有时的网络拥塞会被认为是断开了连接,造成误判。这又是一个值得权衡的事情。
网友评论