计算机网络课程设计.docx
- 文档编号:7110761
- 上传时间:2023-01-18
- 格式:DOCX
- 页数:44
- 大小:1.23MB
计算机网络课程设计.docx
《计算机网络课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计.docx(44页珍藏版)》请在冰豆网上搜索。
计算机网络课程设计计算机网络课程设计计算机网络课程设计实验报告一、实验内容和要求一、实验内容和要求1、实验一数据包的捕获与分析、实验一数据包的捕获与分析目的:
数据包捕获技术是网络管理系统的关键技术。
本实验通过Wireshark软件的安装使用,监控局域网的状态,捕获在局域网中传输的数据包,并结合在计算机网络课程中学习到的理论知识,对常用网络协议的数据包做出分析,加深网络课程知识的理解和掌握。
内容和要求:
Wireshark是一种开源的网络数据包的捕获和分析软件,本实验通过Wireshark软件的安装使用,监控局域网的状态,捕获在局域网中传输的数据包,并结合在计算机网络课程中学习到的理论知识,对常用网络协议的数据包做出分析,加深网络课程知识的理解和掌握。
具体内容及要求如下:
Wireshark软件的安装;Wireshark软件的启动,并设置网卡的状态为混杂状态,使得Wireshark可以监控局域网的状态;启动数据包的捕获,跟踪PC之间的报文,并存入文件以备重新查;设置过滤器过滤网络报文以检测特定数据流;对常用协议的数据包的报文格式进行分析,利用协议分析软件的统计工具显示网络报文的各种统计信息。
2、实验二、实验二Ping程序的设计与实现程序的设计与实现目的:
1.通过设计和实现ping程序,从而使我们掌握网络层协议的原理及实现方法。
对偏底层的网络程序设计,有一定的认识和理解。
2.通过调用原始套接字进行编制程序,最终实现Ping程序,从而对套接字编程及网络程序设计有进一步的理解。
内容和要求:
本实验为ICMP实验。
实验内容:
Ping命令实现的扩充,在给定的Ping程序的基础上做如下功能扩充:
-h显示帮助信息-b允许ping一个广播地址,只用于IPv4-t设置ttl值,只用于IPv4-q安静模式。
不显示每个收到的包的分析结果,只在结束时,显示汇总结果Ping命令的基本描述Ping的操作是向某些IP地址发送一个ICMPEcho消息,接着该节点返回一个ICMPEchoreply消息。
二、实验环境二、实验环境1、实验一数据包的捕获与分析、实验一数据包的捕获与分析本实验是在windows下进行的,具体实验环境如下:
操作系统:
windowsXP抓包工具:
Wireshark网络环境:
IPV4、IPV62、实验二、实验二Ping程序的设计与实现程序的设计与实现本实验是在linux下进行的,具体实验环境如下:
操作系统:
Ubuntu10.10_linux-2.6.38编辑工具:
Gedit编译工具:
GCC调试工具:
GDB网络环境:
IPV4、IPV6三、程序的需求分析与逻辑框图三、程序的需求分析与逻辑框图1、实验一数据包的捕获与分析、实验一数据包的捕获与分析需求分析:
如今,网络已经遍布了全球的大街小巷,几乎每一天我们都得和它打交道,学习、工作都得用到网络。
网络是一个很庞大的系统,是系统就得有人去管理,然而要想管理好网络,那么就得对网络有非常深入的认识和了解。
数据包捕获技术是网络管理系统的关键技术,所以我们可以通过学习数据包捕获技术从而达到学习网络的目的。
这个实验我们需要对数据包进行捕获和分析,这恰恰对我们学习网络是有非常大的帮助的。
逻辑框图:
2、实验二、实验二Ping程序的设计与实现程序的设计与实现需求分析:
在繁华的网络世界中,我们经常想要看看网络上的提供的各式各样的新闻、有趣的东西,我们知道,要想让自己的电脑能显示出来这些内容,就必须连入网络中,这是一个大前提,可是光有了这个前提还是不行的。
我们还得保证我们与提供内容的那台服务器的连接是通畅的,这就得用到我们编写的ping程序了。
在网络层中工作的ping程序,可以给远端的一个电脑发送一个回射请求,然后要是连接畅通,那么远端的电脑会给我们的电脑发送一个回射应答,然后我们的ping程序就可以输出一些信息,这样我们就可以知道我们与目标主机的连接是否通畅啦。
逻辑框图:
四、程序核心功能的实现机制四、程序核心功能的实现机制1、实验一数据包的捕获与分析、实验一数据包的捕获与分析本实验分为两大部分:
一部分主要是对抓包程序的基本运用,进行简单抓包。
另一部分主要是编写过滤条件对所抓到得包进行过滤,让程序只显示我们关心的包的信息。
比较简单,就是启动Wireshark软件,并设置网卡的状态为混杂状态,使得Wireshark可以监控局域网的状态;启动数据包的捕获,跟踪PC之间的报文,并存入文件以备重新查。
2、实验二、实验二Ping程序的设计与实现程序的设计与实现程序分为两大部分:
一部分读取收到的所有消息,并输出ICMPEchoreplay消息,另一部分每隔一秒钟发送一个Echo消息。
另一部分由SIGALARM信号每秒驱动一次。
程序首先肯定从main函数开始,然后处理完命令行参数,后把主控权交给接收消息的无限循环,在接收函数中启动发送消息的函数,并且这个发送函数在每次调用完真正的发送函数后,设置一个新的闹钟。
然后闹钟到了又会调用这个函数,如此一直循环下去。
概述逻辑框图如下:
具体实现细节分析如下:
2.1主函数设计与实现主函数设计与实现主函数是我们程序的入口,整个程序都在主函数中,执行完主函数也就意味着我们的程序结束啦。
所以,在主函数中,我们应该设计的是整个程序的框架,把整个程序分成若干个模块,然后再去一点一点的实现各个模块。
各模块之间的协调就得依靠主函数啦,所以,主函数的设计还是至关重要的。
本程序的主函数起到了类似总线的功能,它把所有的模块都串了起来,掌控着这一切,控制着程序的稳步运行。
在一开始,一个大的模块就是识别和处理命令行参数,在这一部分,我们用到了linux中的一套非常好的处理命令行参数的函数,利用getopt函数和与它相配的一些全局指针,让我们的命令行参数处理起来,非常的省事儿而且很高效。
对这套函数的具体介绍如下:
表头文件#include定义函数intgetopt(intargc,char*constargv,constchar*optstring);函数说明getopt()用来分析命令行参数。
参数argc和argv是由main()传递的参数个数和内容。
参数optstring为选项字符串,告知getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:
”,则表示还有相关的参数,全域变量optarg即会指向此额外参数。
如果在处理期间遇到了不符合optstring指定的其他选项getopt()将显示一个错误消息,并将全域变量optopt设为“?
”字符,如果不希望getopt()印出错信息,则只要将全域变量opterr设为0即可。
getopt()所设置的全局变量包括:
optarg指向当前选项参数(如果有)的指针。
optind再次调用getopt()时的下一个argv指针的索引。
optopt最后一个已知选项。
命令行参数处理完了就开始下一个规程了,那就是注册两个信号的处理函数,一个是SIGALARM闹钟的处理函数,后面用于发送回射请求包。
一个是SIGINT的处理函数,用于用户按了CTRL+C时显示统计信息。
再后面就是根据用户输入的网络地址来得到目标主机地址信息了,用了host_serv函数,此函数又调用getaddrinfo完成了具体的获得地址信息的工作。
接下来就是根据获得的地址信息,设置具体控制发送和接收数据包的结构体pr的各项成员。
最后调用循环接收数据包函数readloop,等此函数退出后,整个程序退出。
整个主函数的逻辑流程图如下:
2.2循环接收数据包函数循环接收数据包函数readloop设计与实现设计与实现这个函数主要实现的是根据用户输入的命令行参数,设置IP包头选项,从而实现IP包格式的填充,然后显示的调用一下SIGALARM信号处理函数,让发送循环开始。
接下来是进入无限接收循环,接收到一个分组,记录接到的时间,调用相应的处理函数,进行分组的分析。
这函数就是一切之后一直做的事情,程序一直就这样运行着。
整个readloop函数的逻辑流程图如下:
到了这个函数就既有了发送,又有了接收了,只是整个函数它只管接收到分组,不管后续的处理,具体是怎么分析的分组就得下面的函数来处理啦,下面主要有两个函数,一个是发送函数,主要管理着发送相关的处理;另一个是接收函数,主要管理着接收相关的处理。
2.3分组处理函数分组处理函数proc设计与实现设计与实现在接收到分组以后,readloop函数就调用本函数,并把接收到得分组和接收到的时间传送给本函数,本函数分为两个版本,一个v4版本,一个v6版本。
V4版本处理的是ipv4的分组,v6版本处理的是ipv6的分组,各个版本根据相应的ip头格式和icmp的头格式,把需要的信息读取出来,并把数据段的第一个字节读取出来,因为这个字节存放的是这个分组发送时的时间,然后与结束的时间相减得出这条路线的延迟时间。
整个proc函数的逻辑流程图如下:
这个逻辑图是v4版本和v6版本共同的地方,v4不同于v6版本的是,v4版本在或得icmp头指针之前还得先获得ip头指针,然后把ip头分析完才到icmp头呢,而v6版本是直接就是icmp头,没有ip头,所以我们不必再去获得和分析ip头。
2.4发送分组函数发送分组函数send设计与实现设计与实现此函数与proc函数非常类似也是有v4和v6两个版本,各个版本的函数填充并发送对应版本的数据包,唯一不同的就是v4版本中如果用户指定了伪装源地址的话,是需要自己填写一个ip头的。
除此之外,其他的都是共同的,主要就是填充icmp头信息和获取当前时间并把它存到数据包的第一个字节里。
整个send函数的逻辑流程图如下:
五、程序源代码五、程序源代码1、实验一数据包的捕获与分析、实验一数据包的捕获与分析在实验一中,因为主要是抓包,所以,没有什么源代码,主要也就有一些过滤条件,可以算是代码。
因此,在这里就把过滤条件说明如下:
1ip.dst=这一个过滤代码是指发往XX的ip包。
所以,把这个写到filter窗格里就可以只显示发往XX主页的ip包的信息了。
2tcp.dstport=80这个是过滤了所有目的端口不是80的包,这样剩下的就都是发往80端口的数据包啦。
3tcp.dstport=80andip.dst=过滤条件可以用与、或、非的关系运算符进行连接,所以这句就可以显示出所有发往XX主页的端口为80的数据包了。
4ip.addr!
=值得注意的就是这个让我们以为对的,可是其实不是非常对的表达式,说它我们以为对是因为,我们总把它想成是把所有发给XX主页的包过滤掉,很不幸,它不会按照我们的期望进行。
相反,那个表达式为真值的条件源地址或目标地址中的任意一个不等于即可。
因此,那个表达式可以被读作:
该包包含的ip字段值必须不为。
因为一个ip数据报同含源地址和目标地址,只要两个地址有一个不为表达式就为真。
2、实验二、实验二Ping程序的核心代码程序的核心代码2.1主函数核心代码主函数核心代码intmain(intargc,char*argv)intc;inttemp;structaddrinfo*ai;quite_mode=0;send_overtime.tv_sec=0;send_overtime.tv_usec=0;recv_overtime.tv_sec=0;recv_overtime.tv_usec=0;bzero(&false_source_addr,sizeof(structsockaddr_in);opterr=0;/*dontwantgetopt()writingtostderr*/while(c=getopt(argc,argv,vhT:
c:
i:
vt:
hbqs:
o:
r:
)!
=-1)switch(c)casev:
verbose+;break;caseh:
printf(!
*ThisisaPingprogram*!
YoucanuseittosendICMPECHO_REQUESTpacketstonetworkhosts.nUsage:
pingOPTION.HOST.nnOptionsvalidforallrequesttypes:
nn-cNUMBERStopaftersendingNUMBERpacketsn-iNUMBERWaitNUMBERsecondsbetweensendingeachpacketn-vVerboseoutputnnOptionsvalidfor-echorequests:
nn-tNUM设置ttl值为NUM,IPv4和IPv6同时适用n-b允许ping一个广播地址,只用于IPv4n-q安静模式n-sSendNUMBERdataoctetsnnOptionsvalidforother:
nn-oNUMSevertypen0-最小化延迟n1-最大化吞吐量n2-最大化可靠性n3-最小化成本n-ripaddr伪装的源ip地址n-h显示帮助信息nn);return0;caseq:
quite_mode=1;break;caset:
en_ttl=1;ttl=atoi(optarg);if(ttl255)err_quit(Thettlvalueistoobig!
Itmustbetween1and255!
);break;caseb:
allow_broadcast=1;break;casec:
ping_count=atoi(optarg);break;casei:
delay=atoi(optarg);if(delay0)err_quit(Thedelayvalueistoosmall!
Itmustbiggerthan0!
);cases:
datalen=atoi(optarg);if(datalen1472&datalen65399)err_quit(Thedatalenvalueistoobig!
);break;caseo:
temp=atoi(optarg);if(temp3|tempai_canonname,Sock_ntop_host(ai-ai_addr,ai-ai_addrlen),datalen);/*4initializeaccordingtoprotocol*/if(ai-ai_family=AF_INET)pr=&proto_v4;#ifdefIPV6elseif(ai-ai_family=AF_INET6)pr=&proto_v6;if(IN6_IS_ADDR_V4MAPPED(&(structsockaddr_in6*)ai-ai_addr)-sin6_addr)err_quit(cannotpingIPv4-mappedIPv6address);#endifelseerr_quit(unknownaddressfamily%d,ai-ai_family);if(ai-ai_family=AF_INET6&en_false_source_addr)err_quit(-roptioncanntuseonipv6!
);pr-sasend=ai-ai_addr;pr-sarecv=calloc(1,ai-ai_addrlen);pr-salen=ai-ai_addrlen;readloop();exit(0);2.2循环接收数据包函数循环接收数据包函数readloop核心代码核心代码voidreadloop(void)intsize;constinten_broadcast=1;charrecvbufBUFSIZE;socklen_tlen;ssize_tn;structtimevaltval;sockfd=socket(pr-sasend-sa_family,SOCK_RAW,pr-icmpproto);setuid(getuid();/*dontneedspecialpermissionsanymore*/size=60*1024;/*OKifsetsockoptfails*/setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size);if(en_ttl)setsockopt(sockfd,pr-ttllevel,pr-ttloptname,&ttl,sizeof(int);if(allow_broadcast)setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&en_broadcast,sizeof(int);if(en_server_type)setsockopt(sockfd,IPPROTO_IP,IP_TOS,&server_type,sizeof(int);if(en_false_source_addr)setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&en_broadcast,sizeof(int);sig_alrm(SIGALRM);/*sendfirstpacket*/while
(1)len=pr-salen;n=recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,pr-sarecv,&len);if(nfproc)(recvbuf,n,&tval);2.3分组处理函数分组处理函数proc核心代码核心代码1.IPV4版本voidproc_v4(char*ptr,ssize_tlen,structtimeval*tvrecv)inthlen1,icmplen;doublertt;structip*ip;structicmp*icmp;structtimeval*tvsend;ip=(structip*)ptr;/*startofIPheader*/hlen1=ip-ip_hl2;/*lengthofIPheader*/icmp=(structicmp*)(ptr+hlen1);/*startofICMPheader*/if(icmplen=len-hlen1)8)err_quit(icmplen(%d)icmp_type=ICMP_ECHOREPLY)if(icmp-icmp_id!
=pid)return;/*notaresponsetoourECHO_REQUEST*/if(icmplen16)err_quit(icmplen(%d)icmp_data;tv_sub(tvrecv,tvsend);rtt=tvrecv-tv_sec*1000.0+tvrecv-tv_usec/1000.0;if(!
quite_mode)printf(%dbytesfrom%s:
seq=%u,ttl=%d,rtt=%.3fmsn,icmplen,Sock_ntop_host(pr-sarecv,pr-salen),icmp-icmp_seq,ip-ip_ttl,rtt);+recv_pk_num;if(rttmax_rtt)max_rtt=rtt;if(rttsarecv,pr-salen),icmp-icmp_type,icmp-icmp_code);2.IPV6版本voidproc_v6(char*ptr,ssize_tlen,structtimeval*tvrecv)#ifdefIPV6inthlen1,icmp6len;doublertt;structip6_hdr*ip6;structicmp6_hdr*icmp6;structtimeval*tvsend;icmp6=(structicmp6_hdr*)ptr;if(icmp6len=len)8)/len-40err_quit(icmp6len(%d)icmp6_type=ICMP6_ECHO_REPLY)if(icmp6-icmp6_id!
=pid)return;/*notaresponsetoourECHO_REQUEST*/if(icmp6len16)err_quit(icmp6len(%d)tv_sec*1000.0+tvrecv-tv_usec/1000.0;if(!
quite_mode)printf(%dbytesfrom%s:
seq=%u,rtt=%.3fmsn,icmp6len,Sock_ntop_host(pr-sarecv,pr-salen),icmp6-icmp6_seq,rtt);+recv_pk_num;if(rttmax_rtt)max_rtt=rtt;if(rttsarecv,pr-salen),icmp6-icmp6_type,icmp6-icmp6_code);#endif/*IPV6*/2.4发送分组函数发送分组函数send核心代码核心代码1.IPV4版本voidsend_v4(void)intlen;inthead_len;structicmp*icmp;structip*ip;if(en_false_source_addr)head_len=sizeof(structip)+sizeof(structicmp);ip=(structip*)sendbuf;ip-ip_v=IPVERSION;ip-ip_hl=sizeof(structip)2;ip-ip_tos=server_type;ip-ip_len=head_len+datalen;ip-ip_id=0;ip-ip_off=0;ip-ip_ttl=ttl;ip-ip_p=IPPROTO_ICMP;ip-ip_sum=0;ip-ip_dst.s_addr=inet_addr(pr-sasend-sa_data);ip-ip_src.s_addr=false_source_addr.sin_addr.s_addr;icmp=(structicmp*)(sendbuf+sizeof(structip);elseicmp=(structicmp*)sendbuf;icmp-icmp_type=ICMP_ECHO;icmp-icmp_code=0;icmp-icmp_id=pid;icmp-icmp_seq=nsent+;gettimeofday(structtimeval*)icmp-icmp_data,NULL);len=8+datalen;/*checksumICMPheaderanddata*/icmp-icmp_cksum=0;icmp-icmp_cksum=in_cksum(u_short*)icmp,len);if(en_false_source_addr)len+=sizeof(structip);sendto(sockfd,sendbuf,len,0,pr-sasend,pr-salen);2.IPV6版本voidsend_v6()#ifdefIPV6intlen;structicmp6_hdr*icmp6;icmp6=(structicmp6_hdr*)sendbuf;icmp6-icmp6_type=ICMP6_ECHO_REQUEST;icmp6-icmp6_code=0;icmp6-icmp6_id=pid;icmp6-icmp6_seq=nsent+;gettimeofday(s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计