vpnservice 详解

来源:互联网 发布:淘宝店铺装修页尾 编辑:程序博客网 时间:2024/06/05 19:01

Vpnservice 

这个类是一个基础的类,继承与vpnservice 创建自己的vpn  。通常,创建一个虚拟的网络接口,配置地址和路由规则,他将返回文件描述符给这应用。每次读文件描述符可以检索出来一个向外发出来的packet 这个ip数据包是被路由到这个网卡上的。每次将ip数据包写到这个文件描述符  就像从文件描述符中读取一个数据包一样从这个接口。这个接口是运行在网络层(即ip 层的)因此这个数据包也是总是包含一个ip header 。你的应用完成vpn连接通过一个进程和交换数据包 通过远程的服务器和通道。

 

 

让应用拦截数据包产生一个巨大的安全隐患,一个vpn应用能很轻易拦截网络数据。除此之外,他们之中还有两个冲突。系统有几个动作到地址 

下面是几个关键点:

1,用户主动要求去创建一个vpn连接

2,仅仅是一个vpn 连接运行在同一时间。当一个新的网卡被创建,已经存在的虚拟网卡接口将失效。

3,系统管理通知  被展示在vpn连接的生命期间。

4,系统的对话框给一个信息关于当前vpn 连接。同时也提供一个按钮去关闭。

5,当网络描述符被关闭的时候,这个网络将会被自动修复。也包括另一种情况当这个vpn应用被清除或被系统杀掉了。

 

 

 

有两个主要的方法  

1 prepare(context ) 和  establish();

这个模型处理具有用户的动作和停止vpn 连接  由其他的应用创建。后创建的vpn接口被使用参数提供给vpnservice.builder  

2,应用必须调用prepare(context) 去授权使用这个类的其他方法,正确的方法能被调用在任何时候。

下面是通常创建 VPN 连接的  步骤:

1,当用户连接vpn连接的时候,调用  prepare(context)  和返回intent

2,当这个应用准备好的时候,启动这个服务。

3,创建一个通道到远程的服务器和参数对于这个 VPN链接

4,支持哪些参数使用VpnService.Builder 和创建一个VPN接口通过调用establish()这个方法;

5,应用进程交换数据报在隧道和返回到这个文件描述符。

6,当这个Onrevoke()方法被调用的时候,可以很好的关闭文件描述符和关闭隧道。

这个类继承与service 需要在清单文件中声明这个service 和涉及到的权限 intentfilter  。要求必须有这个BIND_VPN_SERVICE这个权限,和intent-filter 必须匹配SERVICE_INTERFACE 这个动作。

下面是一个例子声明一个VPNSERVICE  在androidManifest.xml

 <service android:name=".ExampleVpnService"         android:permission="android.permission.BIND_VPN_SERVICE">     <intent-filter>         <action android:name="android.net.VpnService"/>     </intent-filter> </service>
 从上面这个例子可以到,这个类 需要  bind_vpn_service 这个权限和一个过滤器intent-filter

与其相关类还有  vpnservice.builder

vpnservice .builder    帮助创建一个vpn 接口

几个 重要的方法

IBinder   onBinder(intent intent)

返回一个返回一个通信接口对于这个service 

void   onrevoke();

当这个应用被取消掉的时候,调用这个方法。

static intent prepare(context context )

这是一个静态的方法  准备创建一个VPN连接

Boolean protect (int socket)

保护socket 从这个vpn连接经过

Boolean protect (DatagramSocket socket)

一个便利的方法保护datagramsaocket  经过这个VPN 连接

Boolean protect(Socket socket)

同上





public void onRevoke()

应用被废除的时候,调用这个方法。 在这个时刻,这个VPN借口已经被激活由系统。这个应用应该关闭这个文件描述符。stopSelf()默认已经实现了

调用这个方法也可能不应该在主线程中。


public static Intent prepare(Context context)

准备去建立一个VPN 连接。如果这个VPN应用已经准备就绪这个方法将返回null  除此之外,他将返回一个intent 到这个系统的activity。你的应用应该启动这个activity 通过

startactivityForResult(Intent ,int) 去 得到他自身是否准备好。这个activity 会被弹出一个dialog去要求用户响应,这个结果将返回到onActivityResult(int ,int,intent)。如果这个

结果是RESULT_OK,这个应用已经准备好了和授权了使用其他方法的权限对于这个VPNSERVICE 这个类。

在同一个时刻仅仅有一个应用被授权。 这个权利被取消当有其他应用被授权的时候。这个应用丢失权利将被通知调用Onrevoke()方法。除非他又 回到准备状态了。



public boolean protect(int socket)

保护socket 通过这个VPN连接,保护之后,数据被发送通过socket将会被直接的传到网卡上去。因此他的路由将不会通过VPN连接

这个方法是非常有用对于一些不需通过VPN连接的数据。例如:一个VPN通道应该保护他自己的目的地址被覆盖通过VPN路由。

一个很显而易见的问题外出的ip数据报被送回到VPN接口会造成无线循环。这个方法将失败如果应用没有准备好或被废除。

这个socket 没有被关闭通过这个方法。





0 0
原创粉丝点击