声明:
本文是我在工作中遇到的一种apk使用本地代理接收媒体流的方式,这种方式可以更加的安全。这里与大家分享,希望可以对你有所帮助。
介绍:
1.某apk获得数据和向player发送数据的方式:
a. 使用本地代理的方式访问服务器,而本地代理就是使用 127.0.0.1 的网址。某apk首先会通过本地代理向服务器发送对应视频的请求,只不过这里发送请求的URL中加入了Accept-Encoding:gzip\r\n 关键字,这个关键字就是向服务器申明自己是可以接收加密数据的。而如果服务器有加密数据将返回客户端加密的数据,同时会在返回客户端的请求中加入 Content-Encoding: gzip:表明传输的数据是gzip过的数据,而 Content-Length:117:表示gzip压缩后的数据大小,便于客户端使用。
b. 本地代理获得数据后会检测响应中是不是有 Content-Encoding: gzip,如果有,之后会对数据解码。并将解码后的清流推送到播放器进行播放。
而关于HTTP gzip可以看下面的介绍:
https://www.jianshu.com/p/b0a463958b60
https://blog.csdn.net/u010266010/article/details/80331889
2.
而通常我们是不能抓到本地(127.0.0.1)的网络包的,这个时候需要设置才可以抓获本地的网络包。这也是为什么我们看log中会是从127.0.0.1中获得的信息,而网络包中却没有包。所以我们需要使用命令:
tcpdump -s 0 -w eth1.pcap -i any & :抓取含有本地网络包的命令
-i any : 在采用2.2版本或之后版本内核的Linux 操作系统上, 'any' 这个虚拟网络接口可被用来接收所有网络接口上的数据包
-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
-w eth1.pcap : 保存成pcap 文件,方便用ethereal(即wireshark)分析
而具体的原因和命令的解析:
原因是本地环回不经过以太网卡。WireShark只能抓取经过电脑网卡的包,由于我是使用localhost或者127.0.0.1进行测试的,流量是不经过电脑网卡的,所以WireShark无法抓包,一番查找之下找到了解决方法。
Windows的解决方法:https://blog.csdn.net/bingjianIT/article/details/54847852
tcpdump使用命令: tcpdump -s 0 -w eth1.pcap -i any & :抓取本地网络包的命令抓取含有本地网络包的命令