目录
前言
1 实验题目
2 实验目的
3 实验内容
3.1 步骤
3.2 关键代码
3.2.1 利用handleTcpData函数解析TCP数据包
3.2.2 利用handleUdpData函数解析UDP数据包
4 实验结果与分析
5 代码
本实验为计算机网络课程设计内容,基本上所有代码都是根据指导书给的附录写出来的。有些实验需要实现图形界面,但是出于期末考试压力,我所有实验均是在控制台输入输出的,没有花额外时间去学习qt了,有精力的同学可以自学一下qt实现简单的图形界面。同时,该博客内容为部分报告内容,仅为大家提供参考,请勿直接抄袭。另外,本次实验所用平台是centos7,代码均是在终端进行编译的,不会的可以先了解怎么用终端编程,或者利用其他较为智能的开发环境进行编程
因为tcp数据有扩展选项,而本人精力不够的原因,我对tcp数据的解析限制了其大小,即根据书上的介绍,一般不超过576字节,超过的我就没有将其存储到tcp.txt文件中,只输出了mac地址、ip和端口等信息,有能力的同学可以根据tcp选项字段的介绍,尝试更完整的解析
实验八 网络报文分析程序的设计与实现
在实验七 网络嗅探器的设计与实现的基础上,参照教材中各层报文的头部结构,结合使用 wireshark 软件(下载地址https://www.wireshark.org/download.html#releases)观察网络各层报文捕获,解析和分析的过程,尝试编写一个网络报文的解析程序。
(1)创建 socket 监听网络通信,获取数据帧。
(2)解析数据帧,提取 IP 数据报。
(3)根据协议类型提取 TCP/UDP 数据。
(4)将解析结果保存至对应的文件中。
int handleTcpData(char *TcpData,const char *fileName,int dataLen,char *buf) {
int i;
LL seq = ((TcpData + 4)[0]<<24)&0xff000000 | ((TcpData + 5)[0]<<16)&0xff0000
| ((TcpData + 6)[0]<<8)&0xff00 | ((TcpData + 7)[0]<<16)&0xff;
LL ack = ((TcpData + 8)[0]<<24)&0xff000000 | ((TcpData + 9)[0]<<16)&0xff0000
| ((TcpData + 10)[0]<<8)&0xff00 | ((TcpData + 11)[0]<<16)&0xff;
TcpData=TcpData+TcpHeaderLen;
dataLen = dataLen - TcpHeaderLen;
FILE *fpWrite=fopen(fileName,"a");
if(fpWrite==NULL) return 0;
fprintf(fpWrite,"TCP -> %s, seq: %lld, ack: %lld, TcpDataLen: %u\n",buf,seq,ack,dataLen);
for(i=0; i
int handleUdpData(char *UdpData,const char *fileName,char *buf) {
int i;
int udpDataLen = ((UdpData + 4)[0]<<8)&0xff00 | (UdpData + 5)[0]&0x00ff;
printf("UDP数据长度: %u\n",udpDataLen);
UdpData = UdpData + 8;
FILE *fpWrite=fopen(fileName,"a");
if(fpWrite==NULL) return 0;
fprintf(fpWrite,"UDP -> %s, UdpDataLen: %u\n",buf,udpDataLen);
for(i=0; i
(1)在root用户模式启动程序,刚开始因为没有数据传输,控制台没有输出。
图1.1 利用root用户启动程序
(2)打开火狐浏览器Firefox,可以看到控制台除了输出MAC地址、IP地址、端口号和协议等信息。
图1.2 打开火狐浏览器Firefox
图1.3 终端输出的数据包相关信息
(3)打开tcp.txt文件可以看到在程序中抓到的TCP数据包的解析信息。
图1.4 tcp.txt文件中的信息
(4)打开udp.txt文件可以看到在程序中抓到的UDP数据包的解析信息。
图1.5 udp.txt文件中的信息
/***************SimpelSniffer.c*************/
/*注意:本代码为 LINUX 操作系统下的源代码*/
//author:duanjigang@2006s
#include
#include
#include
#include
#include
#include
#define BUFFER_MAX 2048
typedef long long LL;
const int TcpHeaderLen = 20;
const int UdpHeaderLen = 8;
const int MaxLen = 576;
const int TcpCode = 1;
const int UdpCode = 0;
const char *tcpP="tcp.txt";
const char *udpP="udp.txt";
//解析TCP数据
int handleTcpData(char *TcpData,const char *fileName,int dataLen,char *buf) {
int i;
LL seq = ((TcpData + 4)[0]<<24)&0xff000000 | ((TcpData + 5)[0]<<16)&0xff0000
| ((TcpData + 6)[0]<<8)&0xff00 | ((TcpData + 7)[0]<<16)&0xff;
LL ack = ((TcpData + 8)[0]<<24)&0xff000000 | ((TcpData + 9)[0]<<16)&0xff0000
| ((TcpData + 10)[0]<<8)&0xff00 | ((TcpData + 11)[0]<<16)&0xff;
TcpData=TcpData+TcpHeaderLen;
dataLen = dataLen - TcpHeaderLen;
FILE *fpWrite=fopen(fileName,"a");
if(fpWrite==NULL) return 0;
fprintf(fpWrite,"TCP -> %s, seq: %lld, ack: %lld, TcpDataLen: %u\n",buf,seq,ack,dataLen);
for(i=0; i %s, UdpDataLen: %u\n",buf,udpDataLen);
for(i=0; i 目的MAC地址: "
"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
p[6]&n, p[7]&n, p[8]&n, p[9]&n, p[10]&n, p[11]&n,
p[0]&n, p[1]&n, p[2]&n,p[3]&n, p[4]&n, p[5]&n);
iphead = ethhead + 14;
p = iphead + 12;
printf("网络层---源IP地址: %d.%d.%d.%d => 目的IP地址: %d.%d.%d.%d\n",
p[0]&n, p[1]&n, p[2]&n, p[3]&n,
p[4]&n, p[5]&n, p[6]&n, p[7]&n);
memset(srcIp,'\0',strlen(srcIp));
memset(destIp,'\0',strlen(destIp));
sprintf(srcIp,"%d.%d.%d.%d",p[0]&n, p[1]&n, p[2]&n, p[3]&n);
sprintf(destIp,"%d.%d.%d.%d",p[4]&n, p[5]&n, p[6]&n, p[7]&n);
proto = (iphead + 9)[0];
ipHeaderLen = (iphead)[0]&0x0f;
ipTotalLen = ((iphead + 2)[0]<<8)&0xff00 | (iphead + 3)[0]&0x00ff;
// printf("高字节: %u,低字节: %u\n",((iphead + 2)[0]<<8)&0xff00,(iphead + 3)[0]&0x00ff);
ipDataLen = ipTotalLen - ipHeaderLen*4;
p = iphead + 20;
printf("IP数据报头部长度: %d,总长度: %u,数据部分长度: %d\n",
ipHeaderLen*4,ipTotalLen,ipDataLen);
printf("Protocol: ");
switch(proto) {
case IPPROTO_ICMP:
printf("ICMP\n");
break;
case IPPROTO_IGMP:
printf("IGMP\n");
break;
case IPPROTO_IPIP:
printf("IPIP\n");
break;
case IPPROTO_TCP :
printf("TCP,source port: %u,",(p[0]<<8)&0XFF00 | p[1]&0XFF);
printf("dest port: %u\n", (p[2]<<8)&0XFF00 | p[3]&0XFF);
memset(srcPort,'\0',strlen(srcPort));
memset(destPort,'\0',strlen(destPort));
sprintf(srcPort,"%u",(p[0]<<8)&0XFF00 | p[1]&0XFF);
sprintf(destPort,"%u",(p[2]<<8)&0XFF00 | p[3]&0XFF);
memset(buf,'\0',strlen(buf));
sprintf(buf,"(srcIp: %s---srcPort: %s),(destIp: %s---destPort: %s)",
srcIp,srcPort,destIp,destPort);
if(ipDataLen