网络编程工程实训_实验三 使用Libpcap库离线抓包并解析

实验任务

使用前期搭建好的开发环境(Centos7.0+gcc+libpcap),使用C/C++语言开发一个应用程序,打开离线数据包文件(前期使用tcpdump抓取的数据包文件,已经发送给大家),从其中抓取一个数据包,并对数据包内容进行解析。

实验内容:

1.使用libpcap库的pcap_t *pcap_open_offline(const char *fname, char *errbuf)函数,打开离线文件(离线文件以绝对路径的做为第一个参数,保存出错信息的字符串做为第二个参数,返回一个设备指针),并根据打开成功与否,打印“Hello+你的姓名!”(成功)或“Sorry+你的姓名!”(失败)
2.使用上一步中获取的设备,使用pcap_next()函数(或pcap_next_ex()函数),从离线文件中抓取一个数据包,并根据抓包成功与否,打印“Hello+你的姓名!”(成功)或“Sorry+你的姓名!”(失败)
3.针对你抓取到的数据包进行如下解析:
数据链路层头部:查找并阅读RFC894,针对数据链路层头部进行解析,并输出各个字段名称+对应字段取值,并解释含义。如:TYPE=0x8864表示以太网负载为PPPoE数据,YPE=0x8864表示以太网负载为IP数据。
PPPoE头部解析:查找并阅读RFC 2516,针对PPPoE头部进行解析,并输出各个字段名称+对应字段取值,并解释含义。https://tools.ietf.org/html/rfc2516
PPP头部:仅包含其负载类型,即0x0021表示负载为IPV4包。(电信运营商已经将标准的PPP协议头部进行裁剪,仅保留负载类型)
网络层头部:查找并阅读RFC791,针对IP层头部进行解析,并输出各个字段名称+对应字段取值,并解释含义。
传输层头部:查找并阅读RFC768(UDP),或RFC793,针对传输层UDP头部,或者TCP头部进行解析,并输出各个字段名称+对应字段取值,并解释含义。
实验过程填写要求:对以上3项内容,写出详细步骤,并将每一层解析的结果抓图放入报告中

实验过程:

1.新建文档offline.c,写下如下代码
(1)使用for(i=0;ilen;++i)来遍历整个数据包打印出来。
网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第1张图片
(2)if语句判断是否是PPPoE会话字段,如果是,进一步分析,如果不是,打印出:这不是PPPoE的包。
(3)通过0x0021判断接下来是ip数据报的部分
网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第2张图片
(3)通过协议字段是0x06判断是否是TCP包,打印,这是一个TCP包,若是0x11,则其十进制为17,是UDP数据包,打印这是一个UDP包,并继续分析
(4)取出12个RTP头部
网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第3张图片
(5)如果接下来一位是47,则剩下的部分就是TS数据, 直接打印出来;如果接下来一位
不是47,使用for循环遍历剩下的数据,直到遇到0x47,使用while循环,打印出剩下所有,是为TS流。
网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第4张图片
(6)main函数如下,使用pcap_open_offline()打印离线文件udptest.pcap.
使用pcap_next()函数从离线文件抓取一个数据包,成功,打印Hello,周珊
网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第5张图片
网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第6张图片
(7)实验结果如图

网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第7张图片

网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第8张图片
网络编程工程实训_实验三 使用Libpcap库离线抓包并解析_第9张图片

(8)实验感想
本次实验完成从一个已获得的数据包中提取TS数据流,判断是否是PPPoE包,不是则打印不是PPPoE包,是则继续判断是否是UDP包,是则通过0x80开始取RTP头部,通过0x47判断TS流的开始,若是,则直接打印出来,若不是,使用while循环遍历剩下数据,直到找到0x47,从它开始打印剩下部分,即为TS流。本次实验还算顺利,一层一层通过寻找帧的结构分析帧的每个字段的含义,通过本次实验,更加了解了数据包的结构,PPPoE帧,PPP帧和UDP帧的格式。

附录:

函数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: 获取到离线记录文件的最后一个报文

你可能感兴趣的:(操作部分,笔记类,网络编程工程实训,C语言)