第一篇:计算机网络课程设计_IP数据包的捕获与分析[范文]
CENTRAL SOUTH UNIVERSITY
计算机网络课程设计报告
目录
第一章 课程设计的目的与要求..........................错误!未定义书签。1.1 课程设计的目的...................................错误!未定义书签。1.2 课程设计的要求....................................................1 第二章 课程设计的内容.................................................3 2.1 课程设计的内容....................................................3 2.2 内容的要求........................................................3 第三章 程序分析与设计.................................................4 3.1 IP数据包..........................................................4 3.1.1 IP数据包的格式说明..........................................4 3.1.2 IP数据包的格式..............................................4 3.1.3 IP数据包的C++定义...........................................5 3.1.4 IP数据包的解析..............................................6 3.2 套接字............................................................7 3.1.4 套接字的使用.................................................7 3.1.4 使用原始套接字...............................................7 3.3 接受数据包........................................................7 第四章 实验结果.......................................................10 4.1 程序截图.........................................................10 第五章 总结..........................................................11 5.1 实验心得.........................................................11 第六章 附录..........................................................12 6.1 源代码...........................................................12
第一章 课程设计的目的与要求
1.1 课程设计的目的
计算机网络课程设计的目的,是为了让学生更深入地掌握计算机网络的核心内容,实现理论与实践相结合。让学生用具体的实践成果,体现对理论知识的掌握程度。有利于学生提高计算机网络的实践能力,加深对计算机网络理论知识的理解。
1.2 课程设计的要求
(1)编写程序,实现系统的基本功能,鼓励自行增加新功能;
(2)要有用户界面:要求至少采用文本菜单界面;鼓励采用图形菜单界面;(3)写课程设计报告,内容包括: 封面(参见附录I)
需求分析:以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?给出功能模块图和流程图。同时明确规定:输入的形式和输出值的范围;输出的形式;程序所能够达到的功能;测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。
概要设计:包括程序设计组成框图,程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义)。
详细设计:包括模块功能说明(如函数功能、入口及出口参数说明,函数调用关系描述等),每个模块的算法设计说明(可以是描述算法的流程图)。其中源程序要按照写程序的规则来编写,结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。
运行结果:包括典型的界面、输入和输出数据等;
总结:包括课程设计中遇到的问题,解决问题的过程及体会、收获、对课程设计的认识与思考等。
附录:包括主要程序清单,要有适当的注释,使程序容易阅读。
(4)课程设计报告书写规范参见附录II,不按照规范书写的,成绩不能评为“优”或“良”。
(5)无论在校外、校内,都要严格遵守学校和所在单位的学习和劳动纪律、1 规章制度,学生有事离校必须请假。课程设计期间,无故缺席按旷课处理;缺席 时间达四分之一以上者,其成绩按不及格处理。
第二章 课程设计的内容
2.1 课程设计的内容
本次实验的要求在网络环境,使用VC++编写程序实现捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
2.2 内容的要求
(1)以命令行形式运行(应如程序名+参数名):ipparse logfile,其中ipparse是程序名,而logfile为该程序所带参数,其代表记录结果的日志文件。(2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。(3)当程序接收到键盘输入Ctrl+C时退出。
第三章 程序设计与分析
3.1 IP数据包
3.1.1 IP数据包的格式说明
IP数据包格式包含了标头固定部分,标头可变部分和数据区三部分。IP数据报标头部分固定为20个字节,其中包含了12个参数域,各参数域隐含着网间协议的传输机制。IP具体的标头格式如图1所示。
各参数域的具体含义如下:
1)版本号:长度4位,表示所使用的IP协议的版本。IPv4版本号字段值为4;IPV6版本号字段号的值为6.2)标头长:长度4位,定义了一个以4B为一个单位的IP包的报头长度 3)服务类型:共8位,高3位组成优先级子域,随后4位组成服务类型子域。4)数据报总长度:总长度为2B(即6位)。定义了以字节为单位的数据报的总长度。5)重装标识:长度16位,用于识别IP数据报的编号,让目的主机判断新来的数据属于哪个分组。
6)分片标识:共3位,最高位为0;DF禁止分片标识。DF=0,可以分片;DF=1,不能分片。MF:分片标识。MF=0,表示接的是最后一个分片;MF=1,不是最后一个分片。
7)片偏移值:共13位,说明分片在整个数据报中的相对位置。
8)生存周期:8位,用来设置数据数据报在整个网络传输过程中的寿命。常以一个数据报可以经过的最多的路由器跳步数来控制。9)协议类型:共8位,表示该IP数据报的高层协议类型。10)标头校验和:共16位,用于存放检查报头错误的校验码。
11)源、宿主机地址:共32位,分别表示发送和接受数据报的源主机和宿主机的IP地址。
选项数据域:0-40B,用于控制和测试
3.1.2 IP数据包的格式
4位版本4位首部长度8位服务类型(TOS)3位标志8位协议32位源IP地址32位目的IP地址16位总长度(字节为单位)13位片偏移16位首部检验和16位标识8位生存时间(TTL)
3.1.3 IP数据包的C++定义 typedef struct _IP { union {
BYTE Version;// 版本
BYTE HdrLen;//IHT };BYTE ServiceType;// 服务类型 WORD TotalLen;// 总长
WORD ID;// 标识
union {
WORD Flags;// 标志
WORD FragOff;// 分段偏移
};BYTE TimeToLive;// 生命期
BYTE Protocol;// 协议
WORD HdrChksum;// 头校验和
DWORD SrcAddr;// 源地址
DWORD DstAddr;// 目的地址 BYTE Options;// 选项
} IP;
3.1.4 IP数据包的解析
通过IP_HEADER解析IP头各个字段的代码: /*获取版本字段*/ ip.Version>>4;/*获取头部长度字段*/ ip.HdrLen & 0x0f;/*获取服务类型字段中的优先级子域*/ ip.ServiceType>>5;/*获取服务类型字段中的TOS子域*/(ip.ServiceType>>1)&0x0f;/*获取总长度字段*/ ip.TotalLen;/*获取标识字段*/ ip.ID;/*解析标志字段*/ DF =(ip.Flags>>14)& 0x01;MF =(ip.Flags>>13)& 0x01;/*获取分段偏移字段*/ ip.FragOff & 0x1fff;/*获取生存时间字段*/ ip.TimeToLive;/*获取协议字段*/ ip.Protocol;/*获取头校验和字段*/ ip.HdrChksum;/*解析源IP地址字段*/ inet_ntoa(*(in_addr*)&ip.SrcAddr);/*解析目的IP地址字段*/ inet_ntoa(*(in_addr*)&ip.DstAddr);3.2 套接字
3.2.1 套接字的使用
本程序使用套接字socket编程,将网卡设为能够接受流经网卡的所有类型的数据包。首先,初始化套接字,然后监听数据包,解析数据包。
SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)用来创建套接字,其参数为通信发生的区字段和套接字的类型。
WSAIoctl(sock,IO_RCVALL ,&dwBufferInLen , sizeof(dwBufferInLen)函数用来把网卡设置为混杂模式。
recv(sock,buffer,65535,0)函数用来接收经过的IP包,其参数分别是套接字描述符,缓冲区的地址,缓冲区的大小。
3.2.1 使用原始套接字
要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下:
SOCKET sock;sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0, WSA_FLAG_OVERLAPPED);在WSASoccket函数中,第一个参数指定通信发生的区字段,AF_INET是针对Internet的,允许在远程主机之间通信。第二个参数是套接字的类型,在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。在这里,设置为SOCK_RAW,表示声明的是一个原始套接字类型。第三个参数依赖于第二个参数,用于指定套接字所有的特定协议,这里使用IP协议。第四个参数为WSAPROTOCOL_INFO位,该位可以置空。第五个参数保留,永远置0。第六个参数是标志位,WSA_FLAG_OVERLAPPED表明可以使用发送接收超时设置。
创建原始套接字后,IP头就会包含在接收的数据中。然后,可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP_HDRINCL选项,表明用户可以亲自对IP头进行处理。
BOOL flag=true;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag));之后,使用如下代码完成对socket的初始化工作: /*获取主机名*/ char hostName[128];gethostname(hostName,100);/*获取本地IP地址*/ hostent * pHostIP;pHostIP = gethostbyname(hostName);/*填充SOCKADDR_IN结构的内容*/ sockaddr_in addr_in;addr_in.sin_addr = *(in_addr *)pHostIP->h_addr_list[0];addr_in.sin_family = AF_INET;addr_in.sin_port = htons(6000);/*绑定socket*/ bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));填写sockaddr_in的内容时,其地址值应填写为本机IP地址,本机IP地址可以通过gethostbyname()函数获取;端口号可以随便填写,但不能与系统冲突;协议族应填为AF_INET。使用htons()函数可以将无符号短整型的主机数据转换为网络字节顺序的数据。最后使用bind(0函数将socket绑定到本机网卡上。绑定网卡后,需要用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有网络数据,其关键代码如下:
#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1)DWORD dwBufferLen[10];DWORD dwBufferInLen = 1;DWORD dwBytesReturned = 0;WSAIoct1(SnifferSocket, IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收到的数据就拷贝到套接字中。因此,网卡就可以接收所有经过的IP包。
3.3 接收数据包 在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此,缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用RECV()函数实现接收功能的代码如下:
#define BUFFER_SIZE 65535 char buffer[BUFFER_SIZE];//while(true){ recv(sock,buffer,BUFFER_SIZE,0);// /*然后是解析接收的IP包*/ }
设置缓冲区 接收数据包
第四章 实验结果
4.1 程序截图
第五章 总结
通过这次课程设计,我们了解到关于计算机网络数据传送及处理过程中,软件起到了巨大的作用。熟悉了C++语言在计算机网络方面的应用,是一次难得的机会。此外,我还了解了网络通信协议的基本工作原理及套接字的使用,虽然刚开始的时候比较模糊,但是通过与同学共同探讨和网上查阅资料,最终我成功完成了实验。这次课程设计培养了我们基本掌握网络编程的基本思路和方法,让我们懂得如何去学习这类东西。同时提高我们对所学计算机网络理论知识的理解能力,提高和挖掘我们对所学知识的实际应用能力和创新能力。同学们的合作是实验成功的必要条件,而谨慎对待事物的态度是成功的关键。
第六章 附录
6.1 源代码
#include
//定义IP头 { union {
BYTE Version;
//版本(前4位)
BYTE HdrLen;
//报头标长(后4位),IP头长度
};BYTE ServiceType;
//服务类型
WORD TotalLen;
//数据报总长
WORD ID;
//标识
union {
WORD Flags;
//标识(前3位)
WORD FragOff;
//分段偏移(后13位)
};BYTE TimeToLive;
//生存周期
BYTE Protocol;
//协议
WORD HdrChksum;
//头校验和
DWORD SrcAddr;
//源地址
DWORD DstAddr;
//目地地址
BYTE Options;
//选项 }IP_HEADER;
char * parseServiceType_getProcedence(BYTE b){ switch(b>>5)
//获取服务类型字段中优先级子域
{ case 7:
return “Network Control”;
//网络控制
break;case 6:
return “Internet work Control”;
//网络控制
break;case 5:
return “CRITIC/ECP”;
break;case 4:
return “Flash Override”;
//最优先信号
break;case 3:
return “Flsah”;
break;case 2:
return “Immediate”;
break;case 1:
return “Priority”;
//协议
break;case 0:
return “Routine”;
//路由
break;default:
return “Unknow”;
break;} } char * parseServiceType_getTOS(BYTE b){ b=(b>>1)&0x0f;
//获取服务类型字段中的TOS子域
switch(b)
{
case 0:
return “Normal service”;
//正常运行
break;case 1:
return “Minimize monetary cost”;
//成本
break;case 2:
return “Maximize reliability”;
//可靠性
break;case 4:
return “Maximize throughput”;
//吞吐量
break;case 8:
return “Minimize delay”;
//延迟
break;case 15:
return “Maximize security”;
//安全性
break;default:
return “Unknow”;
} } char * getProtocol(BYTE Protocol)
//获取协议字段共8位 { switch(Protocol)
//以下为协议号说明:
{
case 1:
return “ICMP”;
//Internet控制报文协议
case 2:
return “IGMP”;
//Internet组管理协议
case 4:
return “IP in IP”;
//移动IP数据封装和隧道
case 6:
return “TCP”;
//传输控制协议
case 8:
return “EGP”;
//外部网关协议
case 17:
return “UDP”;
//用户数据报文协议
case 41:
return “IPv6”;case 46:
return “RSVP”;
//资源预留协议
case 89:
return “OSPF”;
//Open Shortest Path First 开发式最短路径优先
default:
return “UNKNOW”;} } void ipparse(FILE* file,char* buffer){ IP_HEADER ip=*(IP_HEADER*)buffer;
//通过指针把缓冲区的内容强制转化为IP_HEADER数据结构
fseek(file,0,SEEK_END);
fprintf(file,“_______________________________________________rn”);fprintf(file,“版本号:IPV%drn”,ip.Version>>4);fprintf(file,“报头标长:%d(BYTE)rn”,((ip.HdrLen & 0x0f)*4));fprintf(file,“服务器类型 : %s,%srn”,parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,“总长度 : %d(BYTE)rn”,ip.TotalLen);fprintf(file,“标识 : %drn”,ip.ID);fprintf(file,“标志位 DF:%d , MF=%drn”,((ip.Flags>>14)&0x01),((ip.Flags>>13)&0x01));fprintf(file,“分段偏移值 : %drn”,(ip.FragOff&0x1fff));
fprintf(file,“生存期 : %d(hops)rn”,ip.TimeToLive);fprintf(file,“协议 : %srn”,getProtocol(ip.Protocol));fprintf(file,“头校验和 : 0x%0xrn”,ip.HdrChksum);fprintf(file,“源IP地址 : %srn”,inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,“目的IP地址 : %srn”,inet_ntoa(*(in_addr*)&ip.DstAddr));fprintf(file,“________________________________________________rn”);}
int main(){
FILE * file;if((file=fopen(“logfile.txt”,“wb+”))==NULL){
printf(“fail to open file %s”);
return-1;
}
WORD rv;WSADATA WSAData;
//定义了能够储存WSAStarup调用返回值的结构
rv=MAKEWORD(2,2);
//Winsock2版本
WSAStartup(rv,&WSAData);
SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);//创建套接字,sock为套接字描述符
BOOL flag=true;setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag));//任意类型、任意状态套接口的设置选项值
char hostName[128];gethostname(hostName,100);
//获取主机名
hostent * pHostIP;
//获取本地IP地址
pHostIP = gethostbyname(hostName);
sockaddr_in addr_in;addr_in.sin_addr=*(in_addr *)pHostIP->h_addr_list[0];addr_in.sin_family = AF_INET;addr_in.sin_port = htons(6000);//将无符号短整型主机数据转换为网络字节顺序数据
bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in));
DWORD dwBufferLen[10];
//设置网卡为混杂模式
DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;WSAIoctl(sock, IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen), &dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);
char buffer[BUFFER_SIZE];
//设置缓冲区
char i,a;
printf(“
*************************************n”);
printf(“
*
IP数据包捕获程序
*n”);
printf(“
*
捕获并解析本机的数据包输入Y
*n”);
printf(“
*
放弃执行输入N
*n”);
printf(“
*
退出程序按 Ctrl+c
*n”);
printf(“
*************************************n”);cin>>i;system(“cls”);while(true&&i=='Y'||i=='y'){
int size=recv(sock,buffer,BUFFER_SIZE,0);
//接收数据包
if(size>0)
{
printf(“nnIP数据包捕获解析程序n”);
ipparse(stdout,buffer);
ipparse(file,buffer);
printf(“是否要继续捕获并解析本机的IP数据包? Y/N n”);
fflush(stdin);
cin>>i;
continue;
}
else
fclose(file);
return 0;}
closesocket(sock);}
计算机网络课程的结束已经过去将近1年,当时的学习也仅限于上课和考试。这次计算机网络课程设计给予了我一次难得的锻炼机会。刚拿到题目的时候,感觉还无从下手。后来通过上网查询各种资料和查阅书籍,我们慢慢摸索探讨出了整个组网的设计过程。该组网只是一个简单的酒店网络模拟,它离实际还是有相当的距离,需要进行不断地补充和完善。通过本次课程设计我们学到了不少新的东西,也发现了大量的问题,有些在设计过程中已经解决,有些还有待今后慢慢学习只要学习就会有更多的问题,有更多的难点,但也会有更多的收获。本次课程设计用到的packet tracer软件是我们第一次接触,但通过自学和网络的帮助,我们慢慢掌握了packet tracer软件的使用方法。从一开始的无处着手到通过自己的努力,我基本上完成了这次的任务,但是由于知识的欠缺及时间的限制,我们的成果仅限于现在完成的部分,还有很大的改善空间。总的来说,本次课程设计让我获益匪浅,希望以后还有这样锻炼自己的机会。
第二篇:计算机网络 课程设计 IP数据包解析
课设名称:IP数据包解析
班
级:
学
号:
姓
名:
指导老师:
日期: 2012.6.15
计算机网络课程设计报告
目录
1.课程设计目的..............................................................1
2.课程设计要求..............................................................1
3.程序设计分析..............................................................1
3.1 网卡设置................................................................1
3.2 使用套接字..............................................................2
3.2.2 接收数据包.............................................................2
3.3 定义IP头部的数据结构....................................................3
3.4 IP包的解析..............................................................3
3.5 协议的定义..............................................................4
3.6捕获处理.................................................................4
4.运行结果..................................................................5
5.总结......................................................................5
6.源程序代码................................................................6
Ip数据包解析
1.课程设计目的
本课程设计的目的就是设计一个捕获并解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
2.课程设计要求
本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。程序的具体要求如下:
1)以命令行形式运行:ipparse logfile,其中ipparse是程序名, 而logfile则代表记录结果的日志文件。
2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
3)当程序接收到键盘输入Ctrl+C时退出
3.程序设计分析
3.1 网卡设置
为了获取网络中的IP数据包,必须对网卡进行编程,在这里使用套接字(socket)进行编程。但是,在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的数据包或是以广播形式发出的数据包。对于其他形式的数据包,如已到达网络接口,但却不是发送到此地址的数据包,网络接口在骓投递地
Ip数据包解析
址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的数据包。我们要想获取网络设备的所有数据包,就是需要将网卡设置为混杂模式。
3.2 使用套接字
套接字分为三种,即流套接字(Stream socket)、数据报套接字(Datagram Socket)和原始套接字(Raw Socket)。要进行IP层数据包的接收和发送,应使用原始套接字。创建原始套接字的代码如下: Socket sock: Sock=wsasocket(af_inet,sock_raw,ipproto-ip,null,0,wsa-flag-overlapped): 本设计不用考虑超时情况。
创建套接后,IP头就会包含在接收数据包中。然后,我可以设置IP头操作选项,调用setsockopt函数。其中flag设置为true,并设定IP-HDRINCL选项,表明用户可以亲自对IP头进行处理。最后使用bind()函数将socket绑定到本地网卡上。绑定网卡后,需用WSAIoctl()函数把网卡设置为混杂模式,使网卡能够接收所有的网络数据。如果接收的数据包中的协议类型和定义的原始套接字匹配,那么接收的数据就拷贝到套接字中,因此,网卡就可以接收所有经过的IP包。
3.2.2 接收数据包
在程序中可使用recv()函数接收经过的IP包。该函数有四个参数,第一个参数接收操作所用的套接字描述符;第二个参数接收缓冲区的地址;第三个参数接收缓冲区的大小,也就是所要接收的字节数;第四个参数是一个附加标志,如
Ip数据包解析
果对所发送的数据没特殊要求,直接设为0。因为IP数据包的最大长度是65535B,因此缓冲区的大小不能小于65535B。设置缓冲区后,可利用循环来反复监听接收IP包,用recv()函数实现接收功能。
3.3 定义IP头部的数据结构
程序需要定义一个数据结构表示IP头部。其代码如下: struct IP_HEADER { unsigned short ip_version, /*IP的版本号 */ ip_hdr_len; /*IP包头的长度*/ ip_tos; /*IP包的服务类型*/ ip_total_len; /*IP包的总长度*/ ip_id; /*IP包的分段标识*/ ip_flags; /*IP包的分段标志*/ ip_frag_offset; /*IP包的分段偏移*/ ip_ttl; /*IP包的生存时间*/ ip_proto; /*IP包的高层协议*/ ip_hdr_chksum;/*IP包的校验和*/ struct IPADDRESS ip_src_addr; /*IP包的源IP地址*/ ip_dest_addr; /*IP包的目的IP地址*/ }ipheader;3.4 IP包的解析
Ip数据包解析
解析IP包的字段有两种策略。针对长度为8位、16位和32位的字段(或子字段)时,可以利用IP-HEADER的成员直接获取。要解析长度不是8位倍数的字段(或子字段)时,可以利用C语言中的移位以人、及与、或操作完成。
3.5 协议的定义
(包含相应的头文件#include #include):
DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/ dwProtocol=IPPROTO_IP;/*协议类型为IP*/
3.6捕获处理
1.加载 Winsock;
2.创建一个接收原始IP包的socket连接; 3.绑定到一个接口;
4.进行WSAIoctl设置,接收所有的IP数据包。代码如下:
if(WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL)== SOCKET_ERROR)5.接着设定一个线程进行捕获:(1)创建一个接收IP包的链表头;
(2)设置一个标识,为真,则不断进行IP包的捕获;(3)建立一个新的结点,将捕获的数据包加入到该结点;
(4)如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;
Ip数据包解析
(5)为下一个IP包链表创建一个链表头。
6.建立一个进行IP包解析并显示的线程,进行解析IP数据包,然后显示IP数据包。
4.运行结果
截获IP数据包程序运行结果如下:
5.总结
在本次课程设计中,通过多次上机的实践,充分利用所学的计算机网络以及socket编程与C语言编程的知识,并上网搜索一部分相当资料,粗略设计出该程序。
通过本次课程设计,充分运用了所学的计算机网络知识,设计出了如何解析IP数据包,从而更加深刻的了解到了IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
Ip数据包解析
在课程设计的过程也碰到的不少问题。例如:对IP数据包的结构不了解、IP层工作原理也不熟悉、C语言编程基础差等一系列问题。让我认识到了自己的很大不足,在以后的学习过程中还将努力提高。
6.源程序代码
#include “winsock2.h” #include “ws2tcpip.h” #include “iostream.h” #include “stdio.h”
#pragma comment(lib, “ws2_32.lib”)
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535
/* 定义IP头部数据结构 */ typedef struct _IP_HEADER{
union{
};BYTE ServiceType;//服务类型 WORD TotalLen;//总长度 WORD ID;//标识 union{
};BYTE TimeToLive;WORD Flags;WORD FragOff;BYTE Version;//版本(前4位)
BYTE HdrLen;//报头标长(后四位),IP头长度
Ip数据包解析
BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;}IP_HEADER;
//逐位解析IP头中的信息,获取版本号 void getVersion(BYTE b,BYTE &version){ }
void getIHL(BYTE b,BYTE &result){ }
//解析服务类型
char * parseServiceType_getProcedence(BYTE b){
version = b>>4;result =(b & 0x0f)*4;switch(b>>5){
case 7: return “Network Control”;case 6: return “Internet work Control”;case 5: return “CRITIC/ECP”;case 4: return “Flash Override”;
Ip数据包解析
}
} case 3: return “Falsh”;case 2: return “Immediate”;case 1: return “Priority”;case 0: return “Routine”;default: return “Unknown”;char * parseServiceType_getTOS(BYTE b){
b=(b>>1)&0x0f;switch(b){ case 0: return “Normal service”;
case 1:
return “Minimize monetary cost”;case 2: return “Maximize reliability”;case 4: return “Maximize throughput”;case 8: return “Minimize delay”;case 15: return “Maximize security”;default: return “Unknown”;
Ip数据包解析
} } /* 获取禁止分片标志和分片标志 */ void getFlags(WORD w,BYTE &DF, BYTE &MF){
}
/* 获取分片偏移量 */ void getFragoff(WORD w,WORD &fragoff){ }
//获取协议
char * getProtocol(BYTE Protocol){
DF=(w>>14)&0x01;MF=(w>>13)&0x01;fragoff=w&0x1ffff;switch(Protocol){
case 1: return “ICMP”;case 2: return “IGMP”;case 3: return “GGP”;case 4: return “IP in IP ”;case 6: return “TCP”;case 8: return “EGP”;case 17:
Ip数据包解析
}
} return “UDP”;case 41: return “IPv6”;case 46: return “OSPF”;default: return “UNKNOWN”;/* 解析IP数据包 */ void ipparse(FILE * file,char *buffer){
IP_HEADER ip = *(IP_HEADER *)buffer;fseek(file,0,SEEK_END);BYTE version;getVersion(ip.Version,version);fprintf(file,“版本=IPV%drn”,version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,“头长度=%d(BYTE)rn”,headerLen);fprintf(file,“服务类型=%s,%srn”, parseServiceType_getProcedence(ip.ServiceType), parseServiceType_getTOS(ip.ServiceType));fprintf(file,“数据报长度=%d(BYTE)rn”,ip.TotalLen);fprintf(file,“数据报ID=%drn”,ip.ID);/* DF表示禁止分片标志,MF表示分片标记 */ BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,“分段标志 DF=%d,MF=%drn”,DF,MF);WORD fragOff;
Ip数据包解析
} getFragoff(ip.FragOff,fragOff);fprintf(file,“分段偏移值=%drn”,fragOff);fprintf(file,“生存期=%d(hops)rn”,ip.TimeToLive);fprintf(file,“协议=%srn”,getProtocol(ip.Protocol));fprintf(file,“头校验和=0x%0xrn”,ip.HdrChksum);fprintf(file,“源IP地址=%srn”,inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,“目的IP地址=%srn”,inet_ntoa(*(in_addr*)&ip.DstAddr));fprintf(file,“__________________________________rn”);
/* 程序入口 */ int main(int argc,char *argv[]){
/* cmd参数 */ if(argc!=2){
} printf(“usage error!n”);return-1;FILE *file;/* 以读写的方式建立一个文本文件logfile.txt */ if((file=fopen(argv[1],“w+”))==NULL){
}
WSAData wsData;/* 启动2.2版本的Socket,并将Socket版本信息保存到wsData中 */ if(WSAStartup(MAKEWORD(2,2),&wsData)!=0){ printf(“WSA startup failed!n”);return-1;printf(“fail to open file %s”,“logfile.txt”);return-1;
Ip数据包解析
} fprintf(file,“Socket初始化...rn”);fprintf(file,“==================================rn”);fprintf(file,“描述:%srn”,wsData.szDescription);fprintf(file,“状态:%srn”,wsData.szSystemStatus);fprintf(file,“==================================rn”);SOCKET sock;/* 创建原始套接字 */ if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET){
}
BOOL flag=true;/* 设置IP头操作选项 */ if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(CHAR*)&flag,sizeof(flag))==SOCKET_Eprintf(“Can not create socket!n”);return-1;RROR){
} printf(“setsockopt failed!n”);return-1;char hostName[128];/* 获取本地主机名 */ if(gethostname(hostName,100)==SOCKET_ERROR){
}
hostent *pHostIP;printf(“gethostname failed!n”);return-1;
Ip数据包解析
R){
/* 根据主机名获取主机信息 */ if((pHostIP=gethostbyname(hostName))==NULL){
} printf(“Hostname: %srn”,pHostIP->h_name);printf(“IPAddress: %srn”,inet_ntoa(*((struct in_addr *)pHostIP->h_addr)));printf(“gethostbyname failed!n”);return-1;/* 封装IP地址信息 */ sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000);//监听的端口号 /* 把Socket绑定到本地网卡 */ if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR){
}
DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;/* 设置网卡为混杂模式 */ if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen), printf(“bind failed”);return-1;&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERRO
} printf(“icotlsocket failedn”);return-1;
Ip数据包解析
}
char buffer[BUFFER_SIZE];printf(“=============开始解析=============rn”);while(true){
} /* 解除Socket绑定 */ if(WSACleanup()==SOCKET_ERROR){
} /* 关闭文件 */ fclose(file);return 0;printf(“WSACleanup failed!n”);return-1;/* 从套接字接收IP数据报 */ int size=recv(sock,buffer,BUFFER_SIZE,0);if(size>0){
} ipparse(stdout,buffer);ipparse(file,buffer);
第三篇:计算机网络 课程设计 发送TCP数据包
课设名称:发送TCP数据包
班级:
学号:
姓名:
指导老师: 日期: 2012.6.15
计算机网络课程设计报告
目录
一.设计题目与要求........................................................................................................2
1.设计题目................................................................................................................2
2.设计要求................................................................................................................2
二.需求分析...................................................................................................................2三.详细设计...................................................................................................................2
1.创建一个原始套接字,并设置IP头选项.................................................................3
2.构造IP头和TCP头...............................................................................................3
3.计算校验和的子函数..............................................................................................4
4.流程图...................................................................................................................6
四.调试分析...................................................................................................................7
五.运行结果...................................................................................................................7
六.总结..........................................................................................................................8
七.源程序......................................................................................................................9
发送TCP数据包
一.设计题目与要求
1.设计题目
发送TCP数据包 2.设计要求
本设计的功能是填充一个TCP数据包,并发送给目的主机。
1)以命令行形式运行:TCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。
2)其他的TCP头部参数请自行设定。3)数据字段为“hello”。
4)成功发送后在屏幕上输出“send OK”。
二.需求分析
1.本程序需完成发送一个TCP数据包给目的主机
2.程序的输入:TCP source_ip source_port dest_ip dest_port,然后根据提示输入要发送的数据,回车即可。
3.程序的输出:Send OK!
4.测试数据 TCP 192.168.1.100 200 192.168.1.101 200
三.详细设计
本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分组成。
2发送TCP数据包
1.创建一个原始套接字,并设置IP头选项
SOCKET sock;sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);或者:
sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。其中flag设置为ture,并设定 IP_HDRINCL 选项,表明自己来构造IP头。
setsockopt(sock, IPPROTO_IP, IP_HDRINCL,(char *)&Flag, sizeof(Flag));int timeout=1000; setsockopt(sock, sizeof(timeout));在这里我们使用基本套接字SOL_SOCKET,设置SO_SNDTIMEO表示使用发送超时设置,超时时间设置为1000ms。2.构造IP头和TCP头
这里,IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。
typedef struct _iphdr //定义IP首部 { UCHAR h_lenver;//4位首部长度+4位IP版本号 UCHAR tos;//8位服务类型TOS
USHORT total_len;//16位总长度(字节)USHORT ident;//16位标识
USHORT frag_and_flags;//3位标志位 UCHAR ttl;//8位生存时间 TTL
UCHAR proto;//8位协议(TCP, UDP 或其他)
SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,3发送TCP数据包
USHORT checksum;//16位IP首部校验和 ULONG sourceIP;//32位源IP地址
ULONG destIP;//32位目的IP地址
}IP_HEADER;typedef struct psd_hdr //定义TCP伪首部 { ULONG saddr;ULONG daddr;//源地址 //目的地址
UCHAR mbz;//没用 UCHAR ptcl;
USHORT tcpl;//协议类型 //TCP长度
}PSD_HEADER;typedef struct _tcphdr //定义TCP首部 { USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG th_seq;//32位序列号 ULONG th_ack;//32位确认号
UCHAR th_lenres;//4位首部长度/6位保留字 UCHAR th_flag;//6位标志位 USHORT th_win;//16位窗口大小 USHORT th_sum;//16位校验和 USHORT th_urp;//16位紧急数据偏移量
}TCP_HEADER;
3.计算校验和的子函数
在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下:
USHORT checksum(USHORT *buffer, int size)
4发送TCP数据包
{ unsigned long cksum=0;while(size >1){ cksum+=*buffer++;size-=sizeof(USHORT);} if(size){ cksum += *(UCHAR*)buffer;} cksum =(cksum >> 16)+(cksum & 0xffff);cksum +=(cksum >>16);return(USHORT)(~cksum);}
5发送TCP数据包
4.流程图
开始构造原始套接字并初始化填充IP首部计算IP首部校验和构造TCP伪首部填充TCP首部计算TCP首部校验和填充发送缓冲区填入目的地址发送数据包结束
6发送TCP数据包
四.调试分析
本程序流程简单,调试过程中没有出现大的问题。
调试过程中没有出现重大的语法错误,主要是运行的结果不理想,和预期的结果有差距。填充数据包的程序部分是不容易出错的。至于数据包的发送,由于是利用函数sendto()来实现的,而sendto()是面向UDP的,将协议类型修改为UDP(Header.proto=IPPROTO_UDP;)后,调试运行成功,问题得到解决。
调试时,要添加 #include
五.运行结果
1.输入:TCP 192.168.1.100 200 192.168.1.101 200
7发送TCP数据包
2.输入要发送的字符串:“hello”按Ctrl+Z发送
六.总结
通过本次课程设计,我对发送TCP数据包的原理有了一定的了解。理解了TCP数据报的报文格式、TCP连接时的三次握手和TCP连接结束时的四次握手的过程及它们的作用。此外,在设计过程中,通过查阅资料,也让我对TCP的三大特点(流量控制、差错控制、拥塞控制)有了认识。,在课程设计过程中,由于编程知识的欠缺,使我在课程设计过程中不是很顺利,编程知识的欠缺是我的最大障碍,不过,这也给了我动力,我会努力去学好编程的相关知识,为以后的学习和工作打下基础。最后,感谢老师安排了此次课程设计。
发送TCP数据包
七.源程序
#include
#define IPVER 4 //IP协议预定 #define MAX_BUFF_LEN 65500 //发送缓冲区最大值
typedef struct ip_hdr //定义IP首部 {
UCHAR h_verlen;//4位首部长度,4位IP版本号 UCHAR tos;//8位服务类型TOS USHORT total_len;//16位总长度(字节)USHORT ident;//16位标识 USHORT frag_and_flags;//3位标志位 UCHAR ttl;//8位生存时间 TTL UCHAR proto;//8位协议(TCP, UDP 或其他)USHORT checksum;//16位IP首部校验和 ULONG sourceIP;//32位源IP地址 ULONG destIP;//32位目的IP地址
发送TCP数据包
}IP_HEADER;
typedef struct tsd_hdr //定义TCP伪首部 {
ULONG saddr;//源地址 ULONG daddr;//目的地址 UCHAR mbz;//没用 UCHAR ptcl;//协议类型 USHORT tcpl;//TCP长度
}PSD_HEADER;
typedef struct tcp_hdr //定义TCP首部 {
USHORT th_sport;//16位源端口 USHORT th_dport;//16位目的端口 ULONG th_seq;//32位序列号 ULONG th_ack;//32位确认号
UCHAR th_lenres;//4位首部长度/6位保留字 UCHAR th_flag;//6位标志位 USHORT th_win;//16位窗口大小 USHORT th_sum;//16位校验和
USHORT th_urp;//16位紧急数据偏移量
}TCP_HEADER;
//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size){ unsigned long cksum=0;while(size >1)
发送TCP数据包
{ cksum+=*buffer++;size-=sizeof(USHORT);} if(size){ cksum += *(UCHAR*)buffer;} cksum =(cksum >> 16)+(cksum & 0xffff);cksum +=(cksum >>16);return(USHORT)(~cksum);}
int ReadData(char *str,int maxlen){ int readlen=0;char ch=NULL;if(str==NULL||maxlen<=0){
printf(“ReadData Error!!n”);
return 0;//failed } printf(“Input Data(End By Ctrl+Z): n”);while(maxlen){
ch=getchar();
if(ch==EOF)break;
str[readlen++]=ch;maxlen--;
发送TCP数据包
} } str[readlen]=NULL;return readlen;int main(int argc, char* argv[]){ WSADATA WSAData;SOCKET sock;
IP_HEADER ipHeader;TCP_HEADER tcpHeader;PSD_HEADER psdHeader;
char Sendto_Buff[MAX_BUFF_LEN];//发送缓冲区
unsigned short check_Buff[MAX_BUFF_LEN];//检验和缓冲区 char tcp_send_data[1000];
BOOL flag;int rect,nTimeOver;if(argc!= 5){ printf(“Usage: SendTcp soruce_ip source_port dest_ip dest_port n”);return false;} read_data_len=ReadData(tcp_send_data,1000);int read_data_len=0;
发送TCP数据包
if(read_data_len<=0)return 1;
if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0){ printf(“WSAStartup Error!n”);return false;} if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0, WSA_FLAG_OVERLAPPED))==INVALID_SOCKET){ printf(“Socket Setup Error!n”);return false;} flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR){ printf(“setsockopt IP_HDRINCL error!n”);return false;} nTimeOver=1000;if(setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO,(char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR){ printf(“setsockopt SO_SNDTIMEO error!n”);return false;}
发送TCP数据包
//填充IP首部
ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));ipHeader.tos=(UCHAR)0;ipHeader.total_len=htons((unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+read_data_len);ipHeader.ident=0;//16位标识 ipHeader.frag_and_flags=0;//3位标志位 ipHeader.ttl=128;//8位生存时间 ipHeader.proto=IPPROTO_TCP;//协议类型 ipHeader.checksum=0;//检验和暂时为0 ipHeader.sourceIP=inet_addr(argv[1]);//32位源IP地址 ipHeader.destIP=inet_addr(argv[3]);//32位目的IP地址
//计算IP头部检验和
memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER));ipHeader.checksum=checksum(check_Buff,sizeof(IP_HEADER));
//构造TCP伪首部
psdHeader.saddr=ipHeader.sourceIP;psdHeader.daddr=ipHeader.destIP;psdHeader.mbz=0;psdHeader.ptcl=ipHeader.proto;psdHeader.tcpl=htons(sizeof(TCP_HEADER)+read_data_len);
//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[4]));//16位目的端口号 tcpHeader.th_sport=htons(atoi(argv[2]));//16位源端口号
发送TCP数据包
tcpHeader.th_seq=0;//SYN序列号 tcpHeader.th_ack=0;//ACK序列号置为0 //TCP长度和保留位
tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0);tcpHeader.th_flag=2;//修改这里来实现不同的标志位探测,2是SYN,1是//FIN,16是ACK探测 等等
tcpHeader.th_win=htons((unsigned short)16384);//窗口大小 tcpHeader.th_urp=0;//偏移大小 tcpHeader.th_sum=0;//检验和暂时填为0
//计算TCP校验和
memset(check_Buff,0,MAX_BUFF_LEN);memcpy(check_Buff,&psdHeader,sizeof(psdHeader));
memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader));
//填充发送缓冲区
memset(Sendto_Buff,0,MAX_BUFF_LEN);memcpy(Sendto_Buff,&ipHeader,sizeof(IP_HEADER));
memcpy(Sendto_Buff+sizeof(IP_HEADER), &tcpHeader,sizeof(TCP_HEADER));memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);tcpHeader.th_sum=checksum(check_Buff,sizeof(PSD_HEADER)+ sizeof(TCP_HEADER)+read_data_len);memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER), tcp_send_data,read_data_len);
发送TCP数据包
int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+read_data_len;//发送数据报的目的地址 SOCKADDR_IN dest;memset(&dest,0,sizeof(dest));dest.sin_family=AF_INET;dest.sin_addr.s_addr=inet_addr(argv[3]);dest.sin_port=htons(atoi(argv[4]));
rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest));if(rect==SOCKET_ERROR){ printf(“send error!:%dn”,WSAGetLastError());return false;} else
closesocket(sock);WSACleanup();return 1;} printf(“nsend ok!n”);
第四篇:基于数据包捕获与分析的个人防火墙论文
基于数据包捕获与分析的个人防火墙论文
本套设计论文描述及运行界面展示
摘 要
数据包过滤是一个用软件或硬件设备对向网络上传或从网络下载的数据流进行有选择的控制过程。数据包过滤的功能通常是在将数据包从一个网站向另一个网络传送的过程中允许或阻止它们的通过(更为常见的是在从英特网向内部网络传输数据时,或从内部网络向英特网传输)。若要完成数据包过滤,你就要设置好规则来指定哪些类型的数据包被允许通过和哪些类型的数据包将会被阻止。
基于数据包过滤的防火墙,能够很好地保护用户在与网络连接时的安全性。
我们的目标,就是通过截获数据包,并且对其进行分析,来放行或阻止网络访问,从而达到保护计算机安全的目的。
本论文主要讲述了下面几点:
一、数据包捕获及网络安全技术
二、系统的设计与实现
三、测试及其他
关键字:数据包捕获;防火墙;网络安全
Abstract Packet Filtering is the process a piece of software or device takes to selectively control the flow of data to and from a network.Packet Filters allow or block packets, usually while routing them from one network to another(most often from the Internet to an internal network, and vice-versa).To accomplish packet filtering, you set up rules that specify what types of packets are to be allowed and what types are to be blocked.The packet filtering based firewall can protect the security of computers very well.Our goal is to capture and analysis data packets ,so we can examines all packets that pass in and out of it to prevent packets from passing through ,and the computer is protected.The thesis presents these aspects:
1、Technology of Packet Filtering and Network Security
2、How to implement the system
3、Testing document and others Key Words: Packet Filtering、Firewall、network security
目 录 第一章 绪论 1 第一节 课题意义1 第二节 课题综述1
一、国内外发展情况 1
二、网络安全技术介绍 4
三、防火墙介绍 6
四、防火墙技术发展趋势8
五、防火墙产品发展趋势10 第二章 需求分析 11 第一节 需求分析11
一、功能调查11
二、初步设计12 第二节 可行性分析 12
一、技术可行性及方案选择 12 第三节 开发环境及工具 13
一、开发环境13
二、开发工具14 第三章 基础实现技术介绍 15 第一节 MFC介绍15 第二节 数据包过滤技术 15
一、数据包 15
二、数据包过滤是怎样工作的16
三、包过滤的优点 16 第四章 系统总体设计18 第一节 功能分析18 第二节 系统工作流程 19
一、系统工作流程图 18
二、原理分析20
三、系统工作过程描述 21 第五章 子模块设计 22 第一节 模块分析21
一、模块划分原则 22
二、模块划分23
三、模块接口定义 25 第二节 子模块详细设计 26
一、注册模块26
二、查询模块28
三、流量统计模块 29 第六章 出现问题及解决办法 32 第一节 出现问题32 第二节 无法解决的问题 33 第七章 测试 34 第一节 测试方案34 第二节 测试实例35 第三节 测试总结39 结束语 40 致谢 41 参考文献42
第五篇:数据包捕获与协议实验报告
计算机网络实验(实习)报告
Ⅰ.实验(实习)名称 :数据包捕获与协议分析
实验(实习)日期
专业姓名:学号:(或使用青岛农业大学实验报告纸)
1、实验目的(1)掌握网络协议分析工具Ethereal的使用方法;
(2)截获数据包并对它们观察和分析,了解协议的运行机制;
2、实验内容:
(1)设计一个捕获HTTP实现的完整过程,并对捕获的结果进行分析和统计。
要求:
(2)设计一个捕获TCP实现的完整过程,并对捕获的结果进行分析和统计。
要求:给出捕获某一数据包后的屏幕截图。以16进制形式显示其包的内容,并分析
TCP报文(源端口、目的端口、序号、确认号,ACK、SYN、窗口等)。
(3)设计一个捕获ICMP实现的完整过程,并对捕获的结果进行分析和统计
要求:给出捕获某一数据包后的屏幕截图。以16进制形式显示其包的内容,并分析
该ICMP报文。
(4)设计一个捕获IP数据包的过程,并对捕获的结果进行分析和统计
要求:给出捕获某一数据包后的屏幕截图。以16进制形式显示其包的内容,并分析
在该数据包中的内容:版本首部长度、服务类型、总长度、标识、片偏移、寿命、协议、源Ip地址、目的地址
3.实验总结(掌握了哪些内容?遇到了什么问题?如何解决的?你的体会或收获如何?)