欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    网络流量在线分析系统的设计与实现(共41页).docx

    • 资源ID:8338803       资源大小:146.75KB        全文页数:41页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    网络流量在线分析系统的设计与实现(共41页).docx

    精选优质文档-倾情为你奉上综合实训报告题目:网络流量在线分析系统的设计与实现 信息学院计算机科学系目 录一、 实训目的 3二、 实训内容 3三、 主要设备及环境 3四、 设计与步骤 4五、 过程与调试 22六、 整理与小结 23七、 参考文献 24八、 附录 25一、实训目的设计并实现一个网络流量的分析系统。该系统具有以下功能:(1)实时抓取网络数据。(2)网络协议分析与显示。(3)将网络数据包聚合成数据流,以源IP、目的IP、源端口、目的端口及协议等五元组的形式存储。(4)计算并显示固定时间间隔内网络连接(双向流)的统计量(如上行与下行的数据包数目,上行与下行的数据量大小等)。在这些统计数据的基础上分析不同网络应用的流量特征。二、实训内容 (1)能够实时抓取网络中的数据包。并实时显示在程序界面上。用户可自定义过滤条件以抓取所需要的数据包。(2)分析各个网络协议格式,能够显示各协议字段的实际意义。例如,能够通过该程序反映TCP三次握手的实现过程。(3)采用Hash链表的形式将网络数据以连接(双向流)的形式存储。(4)计算并显示固定时间间隔内网络连接(双向流)的统计量(如上行与下行的数据包数目,上行与下行的数据量大小等)。例如,抓取一段时间(如30分钟)的网络流量,将该段时间以固定时长(如1分钟)为单位分成若干个时间片,计算网络连接在每一个时间片内的相关统计量。并在上述统计数据的基础上分析不同应用如WEB、DNS、在线视频等服务的流量特征。注意,可根据实际的流量分析需要自己定义相关的统计量。三、主要设备及环境硬件设备:(1)台式计算机或笔记本计算机(含网络适配器)软件设备:(2)Windows操作系统(3)网络数据包捕获函数包,Windows平台为winpcap(4)编程语言选用C/C+。(5)编程环境为codeblocks4、 设计与步骤(1) 设计代码检索机器所连接的所有网络适配器,并在屏幕中显示适配器的名称和详细信息,用户可以输入适配器编号选择指定的适配器用来捕获包,如果没有找到适配器,提示用户检查WinPcap是否安装,代码与结果显示如下:/* set the source */if (pcap_createsrcstr(source, PCAP_SRC_IFLOCAL, NULL, NULL, NULL, errbuf) = -1) printf("%sn", errbuf);exit(-1);printf("source: %s", source);/* find all devices */if (pcap_findalldevs_ex(source, NULL, &alldevs, errbuf) = -1) printf("%sn", errbuf);exit(-1);/* choose one devices */d = alldevs;while (d != NULL) printf("%s, %sn", d->name, d->description);d = d->next;printf("choose a devicenumber between 1 to 4:");scanf("%d", &i);d = alldevs;while (-i)d = d->next; printf("n-n");printf("selected device: %sn", d->name);实验结果显示如下:(2) 选择指定适配器后,调用ifprint();函数计算本机的IP地址、掩码、广播地址、目标地址等信息,并用声明static char b;用来记录本机IP地址,为接下来查找Hash表判断流量包的流向做准备:void ifprint(pcap_if_t *d) pcap_addr_t *a; /* 名称 */ /printf("%sn",d->name); /* 描述 */ if (d->description) printf("tDescription: %sn",d->description); /* 回环地址 */ printf("tLoopback: %sn",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no"); /* IP 地址 */ for(a=d->addresses;a;a=a->next) printf("tAddress Family: #%dn",a->addr->sa_family); switch(a->addr->sa_family) case AF_INET: printf("tAddress Family Name: AF_INETn"); if (a->addr) /* Y- IP 地址 */ printf("tAddress: %sn",iptos(struct sockaddr_in *)a->addr)->sin_addr.s_addr); b = iptos(struct sockaddr_in *)a->addr)->sin_addr.s_addr); if (a->netmask) /* Y- 掩码 */ printf("tNetmask: %sn",iptos(struct sockaddr_in *)a->netmask)->sin_addr.s_addr); if (a->broadaddr) /* Y- 广播地址 */ printf("tBroadcast Address: %sn",iptos(struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr); if (a->dstaddr) /* Y - 目标地址 */ printf("tDestination Address: %sn",iptos(struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr); break; default: /* 未知 */ printf("tAddress Family Name: Unknownn"); break; printf("n");/* 来自 tcptracert, 把数字IP地址转换为点格式 */#define IPTOSBUFFERS 12char *iptos(u_long in) static char outputIPTOSBUFFERS3*4+3+1; static short which; u_char *p; p = (u_char *)&in; which = (which + 1 = IPTOSBUFFERS ? 0 : which + 1); sprintf(outputwhich, "%d.%d.%d.%d", p0, p1, p2, p3); return outputwhich;结果显示如下:(3) 接收到用户输入的适配器编号,打开指定适配器:/* open one device */cap_ins_des = pcap_open(d->name, 65536, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errbuf);if (cap_ins_des = NULL) printf("%sn", errbuf);pcap_freealldevs(alldevs);exit(-1);(4) 打开指定文件存储捕获的数据包:/* open a file to dump data */dumpfp = pcap_dump_open(cap_ins_des, "traffic1");if( dumpfp = NULL) printf("Error on opening output filen");exit(-1);(5) 在main()函数开始做一个声明,方便用户自由选择过滤规则,声明如下:int switchnum;char t1 = "ip"/ip过滤规则char t2 = "ip and tcp"/tcp过滤规则 char t3 = "ip and udp"/udp过滤规则 char t4 = ""/mac帧过滤char packet_filter100;/ the filter设置过滤规则时使用swich()语句判断用户输入的编号,是对应的编号与对应的过滤规则相一致:/* open a file to dump data */dumpfp = pcap_dump_open(cap_ins_des, "traffic1");if( dumpfp = NULL) printf("Error on opening output filen");exit(-1);/* get the netmask, used at compiling the filter */if (d->addresses != NULL)netmask = (struct sockaddr_in *)(d->addresses->netmask)->sin_addr.S_un.S_addr;/*#$%&*!*/elsenetmask = 0xffffff;/* 255.25.255.0 */ netmask = 0;/*选择过滤规则*/printf("n-n"); printf("%d:%sn",1, "IP协议"); printf("%d:%sn",2, "IP和TCP协议"); printf("%d:%sn",3, "IP和UDP协议"); printf("%d:%sn",4, "MAC帧"); printf("请选择要获取的协议类型):"); scanf("%d", &switchnum); switch (switchnum) case 1: strcpy(packet_filter,t1); break; case 2: strcpy(packet_filter,t2); break; case 3: strcpy(packet_filter,t3); break; case 4: strcpy(packet_filter,t4); break; default:printf("errorn"); /* compile the filter */if (pcap_compile(cap_ins_des, &fcode, packet_filter, 1, netmask) < 0) printf("Errorn");pcap_freealldevs(alldevs);exit(-1);结果显示如下:(6) 用户可以根据提示设置抓包的时间长短,该功能的实现依靠创建一个线程:pthread_t ptClock; argument args; args.handle = cap_ins_des; int argv_time = atoi(argv1); int timeLen; printf("n设置抓包时长:"); scanf("%d",&timeLen); printf("设置抓包时长为 %d s",timeLen); args.timeLen = (argv_time > 0) ? argv_time : timeLen; /int argv_time = 2; /args.timeLen = argv_time; /printf("抓取时长:%d sn", args.timeLen); if(pthread_create(&ptClock, NULL, thread_clock, &args) printf("pthread_create(): Error!n"); return -1;void *thread_clock(void *argv) pcap_t *handle = (argument*)argv)->handle; int timeLen = (argument*)argv)->timeLen; / set time / printf("%d",timeLen); Sleep(timeLen*1000); pcap_breakloop(handle);结果显示如下:(7) 抓包时调用函数pcap_loop()函数调用cb_getPacket()函数,实现在线程内的抓包,Sleep函数一旦结束,通过pcap_breakloop()退出抓包:pcap_loop(cap_ins_des, -1, cb_getPacket, (u_char*)dumpfp);void cb_getPacket(u_char *dumpfile, const struct pcap_pkthdr *pkthdr, const u_char *packet) / ip_header *seg_ip = (ip_header*)(package + ETHER_LEN); pcap_dump(dumpfile, pkthdr, packet); ethernet_protocol_packet_callback(dumpfile,pkthdr,packet);(8) 设置完成抓包时长后,系统开始进行抓包,一旦抓包结束,调用pcap_close()关闭会话并释放适配器列表:pcap_close(cap_ins_des); pcap_freealldevs(allAdapters);/释放适配器列表(9) 捕获结束后将捕获的数据包存入traffic1.data文件中,再将文件打开进行分析,打开文件之前使用pcap_createsrcstr函数指明文件位置为本机文件,文件名为“traffic1.data”,在调用pcap_open()打开捕获文件:pcap_t *fp;/文件指针 /pcap_createsrcstr指明打开文件的地方:本地文件 if (pcap_createsrcstr(source,/*源字符串*/ PCAP_SRC_FILE,/*本机文件*/ NULL,/*远程主机*/ NULL,/*远程主机端口*/ "traffic1",/*文件名*/ errbuf/*错误缓冲区*/) != 0)fprintf(stderr, "nError in create source string:%sn",errbuf);return -1; /打开捕获文件if (fp = pcap_open(source,/*设备名*/65536,/*要捕捉的数据包的部分,65535保证能捕获到不同数据链路层上的每个数据包的全部内容*/PCAP_OPENFLAG_PROMISCUOUS, / 混杂模式1000, / 读取超时时间NULL, / 远程机器验证errbuf / 错误缓冲池) = NULL)fprintf(stderr, "nCan not open the file %s.n", source);return -1;(10) 打开文件开始对数据包进行分析,通过timeval记录当前时间和上一次采样时间,通过计算可以求出延迟时间,根据数据包的大小,进行字节转换,求出采样时每秒的比特数以及每秒的数据包数量: struct timeval *old_ts = (struct timeval *)argument; u_int delay; LARGE_INTEGER Bps,Pps; struct tm *ltime; char timestr16; time_t local_tv_sec; /以毫秒计算上一次采样的延迟时间 /这个值通过采样到的时间戳获得 delay=(packet_header->ts.tv_sec - old_ts->tv_sec) * - old_ts->tv_usec + packet_header->ts.tv_usec; /获取每秒的比特数b/s /Bps.QuadPart=(*(LONGLONG*)(packet_content + 8) * 8 * ) / (delay); /* | | | | | | 将字节转换成比特 - | | 延时是以毫秒表示的 -| */ u_int m = (*(LONGLONG*)(packet_content + 8) * 8 * ; u_int n = (*(LONGLONG*)(packet_content) * ); Bps.QuadPart = m/delay; Pps.QuadPart = n/delay; /printf("%I64un",m); / printf("%I64un",delay); /得到每秒的数据包数量 / Pps.QuadPart=(*(LONGLONG*)(packet_content) * ) / (delay); / 将时间戳转化为可识别的格式 /*local_tv_sec = packet_header->ts.tv_sec; ltime=localtime(&local_tv_sec); strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);*/ /打印时间戳 /printf("%s ", timestr); /打印采样结果 /printf("%I64un",delay); printf("n*n每秒的比特数:"); printf("BPS=%I64un", Bps.QuadPart); printf("每秒的数据包数量:"); printf("PPS=%I64un", Pps.QuadPart); /存储当前的时间戳 old_ts->tv_sec=packet_header->ts.tv_sec; old_ts->tv_usec=packet_header->ts.tv_usec;结果显示如下:(11) 通过捕获的文件,对抓取的每个数据包的各层的首部进行解析,并将解析结果进行显示首先对以太网协议进行解析:printf("捕获第%d个网络数据包n",packet_number); printf("捕获时间:"); printf("%s",ctime(const time_t*)&packet_header->ts.tv_sec); printf("数据包长度:"); printf("%dn",packet_header->len); printf("n-以太网协议-n"); ethernet_protocol=(struct ether_header*)packet_content;/获得数据包内容 printf("以太网类型:"); ethernet_type=ntohs(ethernet_protocol->ether_type);/获得以太网类型 printf("%04xn",ethernet_type); switch (ethernet_type) case 0x0800: printf("上层协议是IP协议n");break; case 0x0806: printf("上层协议是ARP协议n");break; case 0x8035: printf("上层协议是RARP协议n");break; case 0x814C: printf("上层协议是简单网络管理协议SNMPn"); break; case 0x8137: printf("上层协议是因特网包交换(IPX:Internet Packet Exchange)n"); break; case 0x86DD: printf("上层协议是IPv6协议n"); break; case 0x880B: printf("上层协议是点对点协议(PPP:Point-to-Point Protocol)n"); break; default:break; printf("MAC帧源地址:"); mac_string=ethernet_protocol->ether_shost; printf("%02x:%02x:%02x:%02x:%02x:%02xn",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5); printf("MAC帧目的地址:"); mac_string=ethernet_protocol->ether_dhost; printf("%02x:%02x:%02x:%02x:%02x:%02xn",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5); if(ethernet_type=0x0800)/继续分析IP协议 ip_protool_packet_callback (argument,packet_header,packet_content + sizeof(struct ether_header); printf("-nn");packet_number+;结果显示如下:对IP协议进行解析:struct tcp_header *tcp_protocol; / u_int offset; /u_char tos; u_int16_t checksum; tcp_protocol = (struct tcp_header *)packet_content; checksum = ntohs(tcp_protocol->check); / tos = tcp_protocol->tcp_tos; /offset = ntohs(tcp_protocol->tcp_off); printf("n-TCP协议-n"); printf(" 源端口:%d",tcp_protocol->source_port); printf(" 目的端口:%dn", tcp_protocol->dest_port);printf(" SEQ:%dn", ntohs(tcp_protocol->seq);printf(" ACK_SEQ:%dn",ntohs(tcp_protocol->ack_seq);printf(" fin标志位:%dn",tcp_protocol->fin);printf(" syn标志位:%dn",tcp_protocol->syn);printf(" rst标志位:%dn",tcp_protocol->rst);printf(" psh标志位:%dn",tcp_protocol->psh);printf(" ack标志位:%dn",tcp_protocol->ack);printf(" urg标志位:%dn",tcp_protocol->urg);printf(" ece标志位:%dn",tcp_protocol->ece);printf(" cwr标志位:%dn",tcp_protocol->cwr);printf("check:%dn",checksum);printf("滑动窗口:%dn",tcp_protocol->window);printf("紧急字段:%dn",tcp_protocol->urg_ptr);结果显示如下: 对UDP协议进行解析struct udp_header* udp_protocol; /u_int header_length = 0; u_int16_t checksum; udp_protocol = (struct udp_header *)packet_content; checksum = ntohs(udp_protocol->check); /* u_int16_t source_port; /源地址端口u_int16_t dest_port; /目的地址端口u_int16_t len; /UDP长度u_int16_t check; /UDP校验和 */ printf("n-UDP协议-n");printf("源端口:%d", udp_protocol->source_port);printf(" 目的端口:%dn", udp_protocol->dest_port);printf("用户数据包长度:%dn", udp_protocol->len);printf("校验和:%dn", checksum);结果显示如下:对TCP协议进行解析,其中三次握手的过程可以通过syn与ack标志位来实现:/*1、syn=12、syn=1,ack=1 3、ack=1*/struct tcp_header *tcp_protocol; / u_int offset; /u_char tos; u_int16_t checksum; tcp_protocol = (struct tcp_header *)packet_content; checksum = ntohs(tcp_protocol->check); / tos = tcp_protocol->tcp_tos; /offset = ntohs(tcp_protocol->tcp_off); printf("n-TCP协议-n"); printf(" 源端口:%d",tcp_protocol->source_port); printf(" 目的端口:%dn", tcp_protocol->dest_port);printf(" SEQ:%dn", ntohs(tcp_protocol->seq);printf(" ACK_SEQ:%dn",ntohs(tcp_protocol->ack_seq);printf(" fin标志位:%dn",tcp_protocol->fin);printf(" syn标志位:%dn",tcp_protocol->syn);printf(" rst标志位:%dn",tcp_protocol->rst);printf(" psh标志位:%dn",tcp_protocol->psh);printf(" ack标志位:%dn",tcp_protocol->ack);printf(" urg标志位:%dn",tcp_protocol->urg);printf(" ece标志位:%dn",tcp_protocol->ece);printf(" cwr标志位:%dn",tcp_protocol->cwr);printf("check:%dn",checksum);printf("滑动窗口:%dn",tcp_protocol->window);printf("紧急字段:%dn",tcp_protocol->urg_ptr);结果显示如下:(12) 建立Hash表对数据包进行分流存储,结点与表声明如下,调用InitHashTable()建立TCP和UDP的哈希表,然后调用Hash()函数利用用除留取余法获取最初的结点位置,通InsertHashTable查表将结点放入正确位置,SerchHashTable()查表返回bool值判断关键结点是否已经在哈希表中:typedef struct Node struct in_addr ip_source_address; struct in_addr ip_dest_address; u_int16_t source_port; u_int16_t dest_port; u_int32_t sum; struct node *next;HashNode;typedef struct Table HashNode *Table; int count;HashTable;void InitHashTable(HashTable* H) / printf("hahahahahahahahahhahahaah"); int i; H -> count = MAXSIZE; H -> Table = ( HashNode* )malloc( ( H->count ) * sizeof( HashNode ) ); for(i = 0;i < H->count; i+) / H->Tablei.ip_source_address = NULLKEY; / H->Tablei.ip_dest_add

    注意事项

    本文(网络流量在线分析系统的设计与实现(共41页).docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开