至今还没有完全理解这个API的意义。按照google的文档来说就是:
看起来像是添加一个虚拟IP地址的意思,然而按照教程中的描述则为:
参数变成了子网掩码,但是按照实际的使用来看更偏向于第一种。
添加路由来过滤发送特定IP地址的流量,如果不进行任何过滤则需要设置为0000/0或::/0
添加DNS服务器的地址,如果不添加的话将使用手机默认的DNS服务器。
添加白名单,白名单中的app的流量将不会经过虚拟通道而直接走系统网络。
设置是否为阻塞模式,默认为非阻塞。个人感觉很重要的API,github上的很多项目没有设置为阻塞导致具体实现的时候用的都是线程轮询的方式,这一样一来大大提升了系统的开销。设置为阻塞模式后将大大减少进程上下文的切换。
设置虚拟通道的最大传输字节数,需要根据具体情况具体分析。在抓包的场景下最好尽可能得设置大一些。
简单来说是否允许一些app在使用一些非主流的方式访问网络的情况下不走虚拟通道。个人觉得最好允许。
VpnService启动后创建Builder进行各种初始化,结束后调用establish()获得本地虚拟通道的文件描述符(mFD)。通过输入流读取需要发送IP数据包后解析包的解析(网上有各种第三方的库可供选择)。首先判断是版本是IPV4还是IPV6,之后根据不同的版本来判断使用的是什么协议。
实际抓包的时候可以看到很多协议种类,当然主要的还是UDP与TCP。
可以创建一个稀疏数组,key为源端口,value为Datagram通道,通过Datagram通道向外发送UDP数据,从而减少系统开销。最终通过Datagram通道拿到UDP响应数据后写入mFD的输出流。
TCP的情况比较麻烦,涉及到三次握手以及四次分手,在github上看到个人感觉比较好的做法是,本地建立一个代理服务器来模拟这个过程。这个还需要深入研究。
套接字在发送之前一定要调用protect来防止循环链接,否则发出去的包又回回到mFD的输入流造成死循环。
另外mFD如果不关闭的话是没办法停止VpnService的。点击左上角红色方块(停止抓包),然后在点击左边蓝色的鲨鱼鳍形的方块,保不保存随你,以继续不保存为例,然后开始抓包了,如下:
打开电脑上的浏览器,输入一个网站:
这时看你的Wireshark界面,输入>方法/步骤
启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框。
在Fiddler Options”对话框切换到“Connections”选项卡,然后勾选“Allow romote computers to connect”后面的复选框,然后点击“OK”按钮。
在本机命令行输入:ipconfig,找到本机的ip地址。
打开android设备的“设置”->“WLAN”,找到要连接的网络,在上面长按,然后选择“修改网络”,d出网络设置对话框,然后勾选“显示高级选项”。
在“代理”后面的输入框选择“手动”,在“代理服务器主机名”后面的输入框输入电脑的ip地址,在“代理服务器端口”后面的输入框输入8888,然后点击“保存”按钮。
然后启动android设备中的浏览器,访问百度的首页,在fiddler中可以看到完成的请求和响应数据。第一、>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)