和大家唠叨一件小事。

vpn不要走tcp协议。

我原本以为这是个常识。因为当网络发生丢包时,vpn的那个tcp会等到超时,然后重发。但是vpn里面封装的tcp链路多半也超时了,也要重发。所以一旦发生丢包,整个链路上就会突然一下子变拥堵了。

那么能不能调整链路超时重发机制呢?这个比较困难。链路的超时重发是靠RTT(round-trip time)来工作的,因此VPN的RTT一定小于里面所封装tcp的RTT。如果你的vpn工作在一根很好的链路上,而tcp链路的对端要通过一个延迟非常高的网络。那么vpn的重发对tcp链路的影响并不大。但是我看到的大部分情况下,vpn是穿越互联网(而且大多是跨国或者跨洲网络)的,而vpn的双端都落在内部网络里。因此vpn构成延迟主体。这时候,vpn的RTT和里面所封装tcp的RTT几乎相差无几,两者会几乎同时超时。

什么时候会发生丢包呢?最常见的理由是带宽跑满。当路由器来不及处理数据的时候,就只有丢包了。例如某出国网络丢包三成,这就是拥塞爆了。当然我们也不否认其他理由,例如无线,天生就是有丢包的。即便没有上述理由,有的时候就是运气不好,无理由的发生一下丢包,也完全不需要奇怪。

所以,在大部分网络上,丢包是常态。而丢包后,内外两层tcp同时超时会引起严重的重传问题。所以tcp协议不是特别适合做vpn。

结果某vpn居然被配置到了tcp模式,而且还不能改。。。郁闷啊。。。