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

本文详细描述了一个实验项目,目标是设计并实现一个网络报文解析程序,通过监听网络通信、解析TCP和UDP数据包,并将结果保存到文件。作者使用Linux系统,C语言编写,重点展示了处理TCP和UDP数据包的关键代码片段。
摘要由CSDN通过智能技术生成

目录

前言

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<dataLen; i++) {
		fprintf(fpWrite,"%02x ",TcpData[i]&0xff);
	}
	fprintf(fpWrite,"\n\n");
	fclose(fpWrite);
	fpWrite=NULL;
	return 1;
}

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<udpDataLen; i++) {
		fprintf(fpWrite,"%02x ",UdpData[i]&0xff);
	}
	fprintf(fpWrite,"\n\n");
	fclose(fpWrite);
	fpWrite=NULL;
	return 1;
}

4 实验结果与分析

(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文件中的信息

5 代码

/***************SimpelSniffer.c*************/
/*注意:本代码为 LINUX 操作系统下的源代码*/
//author:duanjigang@2006s
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <netinet/in.h>
#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<dataLen; i++) {
		fprintf(fpWrite,"%02x ",TcpData[i]&0xff);
	}
	fprintf(fpWrite,"\n\n");
	fclose(fpWrite);
	fpWrite=NULL;
	return 1;
}
//解析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<udpDataLen; i++) {
		fprintf(fpWrite,"%02x ",UdpData[i]&0xff);
	}
	fprintf(fpWrite,"\n\n");
	fclose(fpWrite);

	fpWrite=NULL;
	return 1;
}

int main(int argc, char *argv[]) {
	char buf[256];
	char srcPort[6],destPort[6];
	char srcMac[18],decMac[18];
	char srcIp[16],destIp[16];
	int sock, n_read, proto,ipTotalLen,ipHeaderLen,ipDataLen;
	char buffer[BUFFER_MAX];
	char *ethhead, *iphead, *tcphead,
	     *udphead, *icmphead, *p;
	if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0) {
		fprintf(stdout, "create socket error\n");
		exit(0);
	}
	while(1) {
		n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
		if(n_read < 42) {
			fprintf(stdout, "Incomplete header, packet corrupt\n");
			continue;
		}

		ethhead = buffer;
		p = ethhead;
		int n = 0XFF;
		printf("数据链路层---源MAC地址: %.2X:%02X:%02X:%02X:%02X:%02X ==> 目的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<MaxLen) {
					if(handleTcpData(p,tcpP,ipDataLen,buf)) {
						printf("TCP数据部分已写入 tcp.txt 文件\n");
					} else {
						printf("TCP数据部分已写入 tcp.txt 文件错误\n");
					}
				}
				printf("\n\n");
				break;
			case IPPROTO_UDP :
				printf("UDP,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<MaxLen) {
					if(handleUdpData(p,udpP,buf)) {
						printf("UDP数据部分已写入 udp.txt 文件\n");
					} else {
						printf("UDP数据部分已写入 udp.txt 文件错误\n");
					}
				}
				printf("\n\n");
				break;
			case IPPROTO_RAW :
				printf("RAW\n");
				break;
			default:
				printf("Unkown, please query in include/linux/in.h\n");
		}
	}
}

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 摘 要 1 关键词: 计算机网络网络规划;网络设计 ;校园网 1 一. 前言 2 二. 学校描述 3 三. 需求分析 4 3.1 带宽 4 3.2 子网与VLAN规划 4 3.3 实现的信息服务 4 3.4 应用程序 5 3.5 存储系统分析 5 3.6 系统及数据安全分析 5 3.7 QoS 5 3.8 网间隔离 6 四. 拓扑图及方案整体描述 7 4.1 主干网传输方案设计 7 4.2 Internet接入方案 7 4.3 远程访问支持 8 4.4 子网划分 9 4.5 网间隔离方案设计 12 4.6存储方案 13 4.7 设备选型 13 4.8 软件 14 4.9 信息服务方案 14 4.10 综合布线方案 15 4.10.1 结构化布线设计 15 4.10.2 综合布线系统 16 4.10.3设计目标 17 4.10.4工作区设计 18 4.10.6主干线区设计 19 4.10.7子配线间设计 20 4.10.8主配线间设计 21 五. 网络管理 22 5.1网络管理 22 5.2远程监控 22 5.2.1 制作客户端安装盘 22 5.2.2 配置客户机 23 5.2.3远程控制 23 5.3网络安全 24 六. 系统主要设备报价 26 七. 网络测试及协议数据包分析 27 参考资料 31 致谢 32 摘 要 当今的世界正从工业化社会向信息化社会转变。一方面,社会经济已由基于资源的经济逐渐转向基于知识的经济,人们对信息的需求越来越迫切,信息在经济的发展中起着越来越重要的作用,信息的交流成为发展经济最重要的因素。另一方面,随着计算机、网络和多媒体等信息技术的飞速发展,信息的传递越来越快捷,信息的处理能力越来越强,信息的表现形式也越来越丰富,对社会经济和人们的生活产生了深刻的影响。网上教育以受众广、投入低、不受师资的校舍等条件限制、容易开展高水平教育、教学质量相对容易保证等特点而受到教育界的广泛重视,目前国内一些重事业高校的网站已经开展这方面的应用。但现在中小学的校园网正在建设阶段。中小学建设校园计算机网络的根本动机,就是提高学校的管理效益和教学质量。而并非只有大量的资金投入,建设具有规模的计算机网络,才能开展学校的教育手段。架设满足学校应用需求的小的局域网络、教学网络同样也能发挥大的教育效益。 网络是信息时代的产物,互联网本身以及各种基于互联网的应用都成了学校教学的内容,这就需要一个平台支持实施这种教学活动.校园网就是利用学校原有的内部局域网, ,通过架设WEB服务器、FTP服务器、论坛、在线流媒体等,从而组建起一个校园网络,促进学校教育的发展. 关键词: 计算机网络网络规划;网络设计 ;校园网 一. 前言 在二十一世纪的现代信息社会中,对于网络办公和学习是越来越受到重视很运用,几乎在全球的绝大多数学校都组建了网络环境。在通信设备不断普及的今天,原始的教学方式已经不能完全满足我们学习和生活的需求。为了提高教育和学习的质量,所有师生对网络办公和学习的需求是迫在眉睫,所有人都希望在校园里的都能上网络。正所谓大有大的难处,校园网一般具有较大的规模,它不是网络设备的简单组合,而是一种整体的校园系统。校园网必须满足校园扩展需要,确保高吞吐量、安全性。在很多时候,由于校园网络的种种问题的产生,以及学校对网络的需求随着学校的扩招却迅速增大。因此迫切需要在保障学生的学习和生活不受到影响的前提下,通过引进先进的组网模式,改造或者重新规划建设校园网络,以满足学校对网络的需求,保障学校的正常运转,同时实现教育信息化的目标。要求全新设计的校园网络能够最大限度的保护现有网络投资,以最低的造价实现信息化校园网络的标准,以满足日益增长的校园建设需求;建成后的网络应易于应用、管理和维护;施工过程中不能影响学校的正常运转,所提供的方案最好具有推广的价值,或者能够有效的降低网络接入与运行费用,保障大多数学生、教职员工都能够有条件接入、使用网络,提高学习与工作效率,实现教育的信息化。鉴于现在大多数校园都已经普及了有线网络,为了保障投资和提高网络的利用率以及最大限度的保障网络的健壮性,我在下面的方案中主要是以校园网组网为主。为所有师生提供最好的网络接入方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值