端口监测及ip数据包的捕获实验报告.docx_第1页
端口监测及ip数据包的捕获实验报告.docx_第2页
端口监测及ip数据包的捕获实验报告.docx_第3页
端口监测及ip数据包的捕获实验报告.docx_第4页
端口监测及ip数据包的捕获实验报告.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CENTRAL SOUTH UNIVERSITY 计算机网络课程设计报告题 目 端口监控及IP数据包的捕获与分析 学生姓名 班级学号 指导教师 刘丽敏 设计时间 2015年9月 目录第一章 设计目的、任务与要求31.1设计目的31.2设计任务与要求3第二章 系统分析设计42.1 需求分析42.2 总体设计42.3 设计流程5第三章 系统实现63.1 采用技术63.2 详细设计63.3 运行结果9第四章 心得体会10参考文献11附录11第一章 设计目的、任务与要求1.1设计目的 当今世界网络技术飞速发展,网络已经在我们的生活中扮演着重要的角色,无论是人与人之间的通信或者数据传输共享都离不开网络。数据在网络中主要是以ip数据包的形式传输,由此看出IP数据包的捕获与分析是信息安全技术中十分重要的一方面。如果能够监控计算机端口,就可以知道这台计算机的工作状态,在进行什么活动,相当于监控了计算机的活动,也是安全监控中重要的一个技术。 此设计的目的主要是设计可以进行端口监测和ip数据包捕获与解析的小程序,以此锻炼编程能力, 动手能力和实践能力,将理论知识与实践相结合,熟悉ip数据包结构,熟悉在Windows上网络socket编程,熟悉其中的各种函数的运用。并对网络安全技术有更加深入的了解。1.2设计任务与要求本次实验的要求在网络环境,实现端口检测以及捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。程序的具体要求如下:l)实现本机以及局域网内计算机的端口监控。2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。3)形成记录结果的日志文件。第二章 系统分析设计2.1 需求分析1、实现端口监控。2、实现网络中ip数据包的捕获与解析2.2 总体设计1、端口监控 1)、初始化winsock的动态链接库 2)、创建套接字,建立socket连接,与目的ip地址相连。 3)、运用connect()函数,根据能否连接请求是否通过判断端口是否开启,并输出结果。2、ip数据包的捕获与分析 1)、初始化winsock的动态链接库 2)、建立原始套接字 3)、void set_socket(SOCKET s):对套接字进行设置,使用bind()函数将创建的套接口与服务器地址绑定,并用WSAIoctl()设置接收所有ip数据包。 4)、数据包的解析输出函数output_ip(IPHead *lp_iphead, ostream &out)2.3 设计流程1、端口监控2、ip数据包的捕获与解析第三章 系统实现3.1 采用技术 本实验整体运用windows上的socket编程技术,包括套接字的创建和初始化以及其中的宽口检测函数connect(),接收数据包函数recv()函数等,实现网络操作。编程工具为vs2010,使用语言为c+。3.2 详细设计(一)、ip数据包的捕获与分析1、初始化ip包的结构体,用于解析ip数据包,struct IPHead 初始化协议名与协议号的映射。2、获取本机名和ip地址:u_long gethostip() 在这个函数中主要运用socket编程中的两个函数,gethostname()和gethostbyname()两个函数。 char host_name255; /获取本地主机名称 if (gethostname(host_name, sizeof(host_name) = SOCKET_ERROR) printf(Error %d when getting local host name.n, WSAGetLastError(); printf(Host name is: %sn, host_name); /从主机名数据库中得到对应的“主机” struct hostent *phe = gethostbyname(host_name); 3、建立套接字:SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);4、套接字设置函数:void set_socket(SOCKET s) 其中使用bind()函数将创建的套接口与服务器地址绑定,若绑定不成功,则显示失败 if(bind(s, (sockaddr *)&hostaddr, sizeof(sockaddr) != 0) closesocket(s); WSACleanup(); cerr bind() error! 0时则表示有数据包的获取,此时要进行解析的输出6、数据包解析信息的输出函数:void output_ip(IPHead *lp_iphead, ostream &out) 当输出显示在控制台中时,参数为cout,当输出到文件时,参数为fout.(二)、端口监测1、初始化Windows Sockets 动态库2、建立socket连接并绑定ip地址。SOCKET sClient = NULL; SOCKADDR_IN addrServ; addrServ.sin_family=AF_INET; addrServ.sin_addr.S_un.S_addr=gethostip();3、创建套接字:sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);4、根据能否建立连接判定端口是否开放。 connect(sClient,(sockaddr *)&addrServ,sizeof(sockaddr)=SOCKET_ERROR3.3 运行结果第四章 心得体会完成整个设计对我来说是有一定难度的,由于编程基础较为薄弱,对socket编程熟练程度不够,在这个过程中有很多的困难。在不断的查阅资料,反复调试修改后,终于完成了一个较为简单的程序。这个课程设计让我整体学习了Windows上的socket编程流程,熟悉了socket编程中的常用函数及其应用,并且可以用其来获取信息。更加清楚地认识了ip数据包的结构,在ip数据包的捕获功能的实现中,让我对这个以前看起来较为抽象的东西有了比较清晰的认识。是我受益良多。不管学了什么知识,只有能够把理论运用到实际编程中去,真正解决问题,才能够算是学会,才能真正算懂得。由于个人的编程能力不强,在这个程序中有很多的不足之处。在端口扫描中,由于没能掌握多线程编程的知识,所以只能一个端口一个端口的扫描,效率非常低。又由于绑定的是本机的地址,所以只能够查询本机端口的开放情况。对于其他ip则需要手动更改代码中的地址绑定,才能获取。并且我在测试中发现,如果监控的计算机打开了防火墙,那么有部分端口是不能够正确监控的。所以整体看来,这只是一个最简单的程序,有很多地方需要完善。这次课程设计之后,我深刻的认识到了自己的不足还很多,需要学习的东西还很多,并且,一个知识点不能只学会表面,真正应用了才算学会。能够编写这样的捕包程序还是给了我一些信心,让我对安全知识有了更多的兴趣,为了弥补自己的不足,以后还是需要不断的学习,实践。参考文献1 Andrew S.Tanenbaum 计算机网络(第五版) 2012年3月附录源代码#include using namespace std;#include #include #include #include #include #pragma comment(lib, ws2_32.lib)/动态链接库pair common_ip = /协议类型 make_pair(1, ICMP), make_pair(2, IGMP),make_pair(3, GGP),make_pair(4, IP in IP), make_pair(6, TCP),make_pair(8, EGP),make_pair(17, UDP),make_pair(35, IDPR),make_pair(45, IDRP), make_pair(46, RSVP),make_pair(47, GRE),make_pair(54, NHRP),make_pair(88, IGRP),make_pair(89, OSPF),;const map IP_PROTOCOL(common_ip, common_ip + 14); /常见的IP协议编号和名称struct IPHead u_char ihl : 4; /头长度 u_char version : 4; /版本 u_char tos; /服务类型 u_short len; /IP包的总长度 u_short id; /标识 u_short off; /分段偏移量 u_char ttl; /生存期 u_char protocol; /协议 u_short cksum; /头校验和 struct in_addr saddr; /源IP地址 struct in_addr daddr; /目的IP地址;void output_ip(IPHead *lp_iphead, std:ostream &out); /把IP信息输出到流outvoid set_socket(SOCKET s); /设置套接字int duankou();int const MAX_IP_LEN = 65535;int count_num=0;int count_num_in;/输入的循环次数void menu()cout*endl;cout1.端口监测endl;cout2.IP包的捕获与分析endl;cout0.退出endl;cout*h_addr_list1, sizeof(struct in_addr); /在addr中拷贝ip地址 由于主机地址第一个位假,从第二位开始 return inet_addr(inet_ntoa(addr);/将ip地址转换成u_long形式并返回int main(int argc, char *argv)/(打开文件)int choice=1;menu();while(choice!=0)cinchoice;if(choice=1)int m;duankou();/cout是否从命令提示符获取存入日志文件(若是,请输入1)m;/if(m=1)/system(netstat -na); /system(netstat -na netstat.txt);/if(choice!=1&choice!=2&choice!=0)cout输入错误endl;if(choice=2) if(argc != 2) cout 命令行参数错误! endl; return 1; cout请输入你想捕获数据包的个数count_num_in; /初始化winsock的动态链接库 WSADATA wsa_data; if(WSAStartup(MAKEWORD(2, 2), &wsa_data) != 0) cerr WSAStartup() error! endl; return 1; /建立一个原始套接字 SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP); if (s = INVALID_SOCKET) WSACleanup(); cerr socket() error! endl; return 1; /设置套接字 set_socket(s); /打开日志文件 ofstream fout(argv1); if(!fout) cerr fout.open() error! endl; return 1; /捕获数据包,并进行解析 /将结果写入标准输出和日志文件中 char bufMAX_IP_LEN; for(;count_num 0) IPHead *lp_iphead = (IPHead *)buf; char buf20; sprintf(buf, %02d:%02d:%02d:%03d, cur_time.wHour, cur_time.wMinute, cur_time.wSecond, cur_time.wMilliseconds); /输出到标准输出 cout 捕包时间t buf endl;/count_num+; output_ip(lp_iphead, cout);/*输出 cout endl endl; /输出到文件 fout 捕包时间t buf endl; output_ip(lp_iphead, fout); fout endl endl; fout.flush(); WSACleanup();if(choice=1|choice=2)menu();getchar(); return 0;/*set_socket完成对原始套接字s的设置*以使s能接收到所用的IP数据包*/void set_socket(SOCKET s) /将s绑定到本机地址上 struct sockaddr_in hostaddr; hostaddr.sin_family = AF_INET; hostaddr.sin_port = htons(0); hostaddr.sin_addr.s_addr = gethostip(); if(bind(s, (sockaddr *)&hostaddr, sizeof(sockaddr) != 0) closesocket(s); WSACleanup(); cerr bind() error! endl; exit(-1); /将s设置为接受所有IP数据包 DWORD in_buffer = 1, n_returned; int ret = WSAIoctl(s, SIO_RCVALL, &in_buffer, sizeof(in_buffer), NULL, 0, &n_returned, NULL, NULL); if(ret != 0) closesocket(s); WSACleanup(); cerr WSAIoctl() error! endl; exit(-1); void output_ip(IPHead *lp_iphead, ostream &out) out 版本tt version endl; out 头长度tt ihl * 4) endl; out 服务类型t tos endl; out 总长度tt len endl; out 标识tt id off) 15; u_short DF = (lp_iphead-off) 14) & 0x0001; u_short MF = (lp_iphead-off) 13) & 0x0001; out 标志位tt unserved DF MF endl; out 偏移量tt off) & 0x1fff) endl; out 生存期tt ttl endl; out 协议tt protocol; map:const_iterator it = IP_PROTOCOL.find(lp_iphead-protocol); if(it != IP_PROTOCOL.end() out ( second ) endl; /输出协议号对应的名称 out 校验和tt cksum endl; out 源IP地址t saddr) end

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论