实验任务:
使用前期搭建好的开发环境(Centos7.0+gcc+libpcap),使用C/C++语言开发一个应用程序,打开虚拟机网卡(与物理主机在同一个子网的)设备,实时抓取从物理主机发来的UDP数据包并进行解析,去除协议层头部,仅保留应用层数据,保存为TS文件(扩展名为ts)。
实验内容:
1.使用TS流发送软件Winsend发送TS视频数据流到虚拟机和VMnet8网卡所在的网络(或者以单播的形式发送到虚拟机),选择重复播放,Winsend的参数配置:interface选择VMnet8网卡的IP地址,端口号可以填8000,IP address填写一个多播IP地址,其它参数均默认,发送视频文件可以点击open,选择发送给大家的TS文件(会单独发送给大家)。
2.使用libpcap库的pcap_t *pcap_open_live(const char *fname, char *errbuf)函数,打开虚拟机网卡设备(用实验二的方法),并根据打开成功与否,打印“Hello+你的姓名!”(成功)或“Sorry+你的姓名!”(失败)。
3.使用上一步中获取的设备,采用以下两种方法其一,从网卡抓包并解析处理,提取应用层数据保存为ts文件,名称为:学号+姓名2.ts。
使用while死循环和pcap_next()或pcap_next_ex()对抓包数据进行解析,并去除PDU头部。
使用pcap_loop()和自定义回调函数来进行数据包解析,去除各层PDU头部,对数据包的解析和头部处理操作均放在回调函数中。
4.针对你得到的ts文件,使用VLC播放器进行播放,如果能够正常播放,则数据提取成功。
5.使用Elecard StreamEye Tools中的SAnalyzer(单独发送给大家)打开解析提取出的ts文件,查看TS文件中,节目流的数目及相应的PID,在实验报告中记录下来。
实验过程填写要求:对以上5项内容,写出详细步骤,并将每一层解析的结果抓图放入报告中。
实验过程:
1.代码测试阶段,选择Repea file以便测试,最后抓取这个ts文件时,不选择重复而直接发送,以便抓取整个包。
2.打开虚拟机网卡设备
3.使用上一步中获取的设备,从网卡抓包并解析处理,提取应用层数据保存为ts文件,名称为:XXX2.ts。
4.将生成的ts文件拖到物理机上:
直接双击打开
5.使用SAnalyzer打开解析提取出的XXX2.ts文件,查看TS文件中,节目流的数目及相应的PID,
如图,有1个program,有两个TS流,;PID为0xC8和0x64.
ES流:基本码流,包括视频、音频或数据的连续码流。
PES流:打包的基本码流,将基本的码流ES流根据需要分成长度不等的数据包,加上包头,
TS流:传输流,有由固定长度为188个字节的包组成
6.实验感想
本次实验在实验三和实验四的基础上分析没有PPPoE和PPP而只有IP和UDP的帧,将TS流提取出来,实验较为简答,只是最后提取出的文件播放时有雪花,使用别人的计算机编译运行自己的源码后,得到的文件没有雪花,播放流畅清晰,询问老师后得知是虚拟机的性能问题,最后,将提取出的TS文件使用SAnalyzer打开解析,得到节目流的数目和PID。
附录:
函数pcap_next()的使用说明:
const u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h);
pcap_next()
参数:p: 已打开的捕捉实例的描述符
h: 报文头
返回值:成功则返回指向数据包的指针;
出错则返回控指针,抓包出错,从网卡上抓不到包(包由于过滤条件都被丢弃了。超时了,抓包句柄指向的网卡不支持堵塞模式并且没有不论什么包经过该网卡)。
函数pcap_next_ex()的使用说明:
pcap_next_ex(pcap_t* p,struct pcap_pkthdr** pkt_header,const u_char** pkt_data)
功能: 从interface或离线记录文件获取一个报文
参数: p: 已打开的捕捉实例的描述符
pkt_header: 报文头
pkt_data: 报文内容
返回值: 1: 成功
0: 获取报文超时
-1: 发生错误
-2: 获取到离线记录文件的最后一个报文
函数pcap_loop()的使用说明:
int pcap_loop(pcap_t * p,int cnt, pcap_handler callback, uchar * user);
第一个参数是会话句柄,
第二个参数是pcap_loop()在返回前应捕捉多少个数据包。
第三个参数是回调函数的名称(不包含括号)。
第四个参数,用户向回调函数传递的参数,