计算机网络课程设计-网络报文分析程序的设计与实现

目录

前言

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选项字段的介绍,尝试更完整的解析

1 实验题目

        实验八 网络报文分析程序的设计与实现

2 实验目的

        在实验七 网络嗅探器的设计与实现的基础上,参照教材中各层报文的头部结构,结合使用 wireshark 软件(下载地址https://www.wireshark.org/download.html#releases)观察网络各层报文捕获,解析和分析的过程,尝试编写一个网络报文的解析程序。

3 实验内容

3.1 步骤

        (1)创建 socket 监听网络通信,获取数据帧。

        (2)解析数据帧,提取 IP 数据报。

        (3)根据协议类型提取 TCP/UDP 数据。

        (4)将解析结果保存至对应的文件中。

3.2 关键代码

3.2.1 利用handleTcpData函数解析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

3.2.2 利用handleUdpData函数解析UDP数据包

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

4 实验结果与分析

(1)在root用户模式启动程序,刚开始因为没有数据传输,控制台没有输出。

图1.1 利用root用户启动程序

(2)打开火狐浏览器Firefox,可以看到控制台除了输出MAC地址、IP地址、端口号和协议等信息。

计算机网络课程设计-网络报文分析程序的设计与实现_第1张图片

图1.2 打开火狐浏览器Firefox

计算机网络课程设计-网络报文分析程序的设计与实现_第2张图片

图1.3 终端输出的数据包相关信息

(3)打开tcp.txt文件可以看到在程序中抓到的TCP数据包的解析信息。

计算机网络课程设计-网络报文分析程序的设计与实现_第3张图片

图1.4 tcp.txt文件中的信息

(4)打开udp.txt文件可以看到在程序中抓到的UDP数据包的解析信息。

计算机网络课程设计-网络报文分析程序的设计与实现_第4张图片

图1.5 udp.txt文件中的信息

5 代码

/***************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

你可能感兴趣的:(计算机网络,网络,计算机网络)