Linux虚拟网络之tun(四)虚拟VPN

来源:互联网 发布:三方博弈矩阵 编辑:程序博客网 时间:2024/05/22 14:11

学习了几天tun,突然想到前面几篇文章描述的应用场景,不就是跟vpn一样的原理吗?看看vpn的示意图:
这里写图片描述

按着这个思路一搜,发现了云风的mptun,大体框架如下(本文借用了这里 的一些图片和内容):
这里写图片描述

一、关于为什么VPN使用UDP而不是TCP
虽然VPN可以使用TCP,但是类似于OpenVPN都默认使用UDP传输,而不是TCP,因为使用tun接口实现VPN是把IP数据包发送出去,如果这个IP数据包里面包含的是一个TCP数据包,而我们在传输的时候也使用TCP传输的话,就相当于在TCP之上再构建了一个TCP层,遗憾的是这两个TCP层对于传输速度,丢包重发,时延等等处理都不同,可能导致整个VPN不可用,详细分析可以见: Why TCP Over TCP Is A Bad Idea

二、关于vpn的详细流程图
可以参考这里: http://www.cis.syr.edu/~wedu/seed/Labs/VPN/VPN.pdf
这里有两张图可以清晰的展示利用tun通信的网络传输:
这里写图片描述

这里写图片描述

三、测试和mptun的一些问题
在容器中测试了一下mptun,下载速率大约为24MB/s,我在前文Linux虚拟网络之tun(三) 中的代码在相同测试环境下可以达到约65MB/s 以上的速率。排除增加了加解密和多链路功能,mptun应该还是有一些可以改进的地方。

  1. 并发的不够。代码中有多个socket,虽然用了select,但是本质上并没有很好的并发,多核利用不足;
  2. 收发操作是串行的;
  3. 内存空间申请释放太频繁,每次收发包、加解密都存在内存空间的申请释放;

针对上面的问题,写一个golang版本的,应该效率会高一些。

四、golang版本的mptun

待补充。。。。。。

参考:
[1]: http://blog.chinaunix.net/uid-28587158-id-5193052.html 利用/dev/tun实现点对点VPN

原创粉丝点击