全部博文(146)
分类: LINUX
2008-11-07 17:31:25
首先,我们看一下PPTP的用户空间实现的系统框架图
看到这个图,我们会发现与PPPOE用户空间实现类似,下面讲一下数据流程:
首先PPTP会与PPTP SERVER进行控制连接,接下来就会走进PPPD中进行PPP协议的交互,建立PPP连接后,就会产生PPP0接口。
下面看看连接建立后,报文是如何走的
当收到有报文从ETH口进来时,PPTP会先解去GRE报头,然后就剩下PPP报文,送到伪终端主设备,到达伪终端从设备,送入PPP0接口单元,PPP0驱动解开压缩与加密的PPP报文后将报文送到上层进行处理。
当本机要发送报文时,首先发送到PPP0驱动接口,压缩并加密,变成PPP报文发送到伪终端从设备,到达伪终端主设备,到达PPTP,PPTP加上GRE头,通过RAW SOCKET从ETH口发送出去。
上面的数据流必须要通过伪终端进行连接PPTP与PPP0,这是性能下降的关键,所以如果去掉伪终端而让PPP0与PPTP中的RAW SOCKET直接绑定,这样数据传输性能势必会有大的提升。
从上面的分析我们可以看到,在PPTP中主要工作就是一开始建立连接的控制过程,然后就是在建立连接后的对报文进行GRE封装。这与PPPOE的运行机制很相似。所以我们可以仿照PPPOE内核空间实现,实现PPTP内核空间功能。
接下来工作主要是两部:
一是在内核协议栈中添加IP GRE协议SOCKET套接口。
二是将PPTP用户空间的实现进行改写,放到PPPD中以插件的方式运行。