计算机网络课程设计实验报告.doc
《计算机网络课程设计实验报告.doc》由会员分享,可在线阅读,更多相关《计算机网络课程设计实验报告.doc(35页珍藏版)》请在冰点文库上搜索。
![计算机网络课程设计实验报告.doc](https://file1.bingdoc.com/fileroot1/2023-5/7/b611016d-b26f-4b5d-8655-c88eded37428/b611016d-b26f-4b5d-8655-c88eded374281.gif)
计算机网络课程设计
实验报告
一、实验内容和要求
1、实验一数据包的捕获与分析
Wireshark是一种开源的网络数据包的捕获和分析软件,本实验通过Wireshark软件的安装使用,监控局域网的状态,捕获在局域网中传输的数据包,并结合在计算机网络课程中学习到的理论知识,对常用网络协议的数据包做出分析,加深网络课程知识的理解和掌握。
具体内容及要求如下:
lWireshark软件的安装;
lWireshark软件的启动,并设置网卡的状态为混杂状态,使得Wireshark可以监控局域网的状态;
l启动数据包的捕获,跟踪PC之间的报文,并存入文件以备重新查;
l设置过滤器过滤网络报文以检测特定数据流;
l对常用协议的数据包的报文格式进行分析,利用协议分析软件的统计工具显示网络报文的各种统计信息。
2、实验二网络层实验—Ping程序的设计与实现
实验目的
本实验目的是使学生掌握网络层协议的原理及实现方法。
实验设计内容
本实验为ICMP实验。
实验内容:
Ping命令实现的扩充,在给定的Ping程序的基础上做如下功能扩充:
-h 显示帮助信息
-b 允许ping一个广播地址,只用于IPv4
-t设置ttl值,只用于IPv4
-q 安静模式。
不显示每个收到的包的分析结果,只在结束时,显示汇总结果
Ping命令的基本描述
Ping的操作是向某些IP地址发送一个ICMPEcho消息,接着该节点返回一个ICMPEchoreplay消息。
ICMP消息使用IP头作为基本控制。
二、实验环境
实验一数据包的捕获与分析
1.联网计算机
2.Windows或linux系统
3.在PC中安装协议分析软件(如:
Wireshark)
4.物理基础:
IEEE802.3标准的以太网采用的是持续CSMA的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。
运用这一原理使信息捕获系统能够拦截的我们所要的信
5.工作模式:
1)广播模式(BroadCastModel):
它的物理地址(MAC)地址是0Xffffff的帧为广播帧,工作在广播模式的网卡接收广播帧。
2)多播传送(MultiCastModel):
多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。
但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
3)直接模式(DirectModel):
工作在直接模式下的网卡只接收目地址是自己MAC地址的帧。
4)混杂模式(PromiscuousModel):
工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
实验二网络层实验—Ping程序的设计与实现
1.联网计算机
2.Linux系统
3.系统自带编译环境
三、程序的需求分析与逻辑框图
需求分析
1、实验一
数据包的捕获与分析
1>.在PC中安装协议分析软件。
2>.启动Wireshark协议分析软件,选择抓包菜单项启动实时监视器,开始实时跟踪显示网络数据报文。
可根据系统提示修改显示方式。
3>.调出跟踪存储的历史报文,选择有代表性的ETHERNET,IEEE802.3,IP,ICMP,TCP,UDP报文,对照有关协议逐个分析报文各字段的含义及内容。
4>.设置过滤器属性,如目的地址,源地址,协议类型等。
如过滤不需要的网络报文,过滤器允许设置第二层,第三层或第四层的协议字段。
2、实验二
网络层实验—Ping程序的设计与实现
PING程序是我们使用的比较多的用于测试网络连通性的程序。
PING程序给予ICMP使用ICMP的回送请求和回送应答来工作。
ICMP是基于IP的一个协议,ICMP包通过IP的封装之后传递。
实现检测网络通畅及速度的ping,并扩展以下功能:
-h显示帮助信息
-b允许ping一个广播地址,只用于IPv4
-t设置ttl值,只用于IPv4
-q安静模式,不显示每个收到的包的分析结果,只在结束时,显示汇总结果
三、程序的需求分析与逻辑框图
逻辑框图
1、总体设计
程序分为两大部分:
一部分读取收到的所有消息,并输出ICMPEchoreplay消息,另一部分每个一秒钟发送一个Echo消息。
另一部分由SIGALARM信号每秒驱动一次。
2、详细设计
1)main函数
三、 程序的需求分析与逻辑框图
逻辑框图
2)readloop函数
3)proc函数 4)send函数
三、 程序的需求分析与逻辑框图
逻辑框图
Checksum开始
定义初始化cksum
(size>1)
确定cksum及size大小
是
if(size)
计算校验cksum,获得结果
cksum+=*(UCHAR*)buffer;
否
结束
四、程序核心功能的实现机制
1、实验一
利用协议分析软件跟踪局域网报文,实验内容如下:
将安装协议分析软件的PC接入以太网中,跟踪PC之间的报文,并存入文件以备重新查。
设置过滤器过滤网络报文以检测特定数据流。
利用协议分析软件的统计工具显示网络报文的各种统计信息。
2、实验二
Ping命令的基本描述
Ping的操作是向某些IP地址发送一个ICMPEcho消息,接着该节点返回一个ICMPEchoreplay消息。
ICMP消息使用IP头作为基本控制。
IP头的格式如下
0123
01234567890123456789012345678901
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|IHL|TypeofService|TotalLength|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Identification|Flags|FragmentOffset|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|TimetoLive|Protocol|HeaderChecksum|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|SourceAddress|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|DestinationAddress|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version=4
IHLInternet头长
TypeofService=0
TotalLengthIP包的总长度
Identification,Flags,FragmentOffset用于IP包分段
TimetoLiveIP包的存活时长
ProtocolICMP=1
Addresses发送Echo消息的源地址是发送Echoreply消息的目的地址,相反,发送Echo消息的目的地址是发送Echoreply消息的源地址。
四、程序核心功能的实现机制
2、实验二
Ping实际上是使用ICMP中的ECHO报文来实现的。
Echo或EchoReply消息格式如下:
0123
01234567890123456789012345678901
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Type|Code|Checksum|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Identifier|SequenceNumber|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Data...
+-+-+-+-+-
Type
echo消息的类型为8
echoreply的消息类型为0。
Code=0
Checksum
为从TYPE开始到IP包结束的校验和
Identifier
如果code=0,identifier用来匹配echo和echoreply消息
SequenceNumber
如果code=0,identifier用来匹配echo和echoreply消息
功能描述:
收到echo消息必须回应echoreply消息。
identifier和sequencenumber可能被发送echo的主机用来匹配返回的
echoreply消息。
例如:
identifier可能用于类似于TCP或UDP的port
用来标示一个会话,而sequencenumber会在每次发送echo请求后递增。
收到echo的主机或路由器返回同一个值与之匹配
四、 程序核心功能的实现机制
2、实验二
1、 数据结构的描述
1)IP包格式
structip{
BYTEVer_ihl;//版本号与包头长度
BYTETOS;//服务类型
WORDLeng;//IP包长度
WORDId;//IP包标示,用于辅助IP包的拆装,本实验不用,置零
WORDFlg_offset;//偏移量,也是用于IP包的拆装,本实验不用,置零
BYTETTL;//IP包的存活时间
BYTEProtocol;//上一层协议,本实验置ICMP
WORDChecksum;//包头校验和,最初置零,等所有包头都填写正确后,计算并替换。
BYTESaddr[4];//源端IP地址
BYTEDaddr[4];//目的端IP地址
BYTEData[1];//IP包数据
};
2)ICMP包格式
structicmp{
BYTEType; //ICMP类型,本实验用8:
ECHO0:
ECHOREPLY
BYTECode;//本实验置零
WORDChecksum;//ICMP包校验和,从TYPE开始,直到最后一位用户数据,如果为
字节数为奇数则补充一位
WORDID;//用于匹配ECHO和ECHOREPLY包
WORDSeq;//用于标记ECHO报文顺序
BYTEData[1];//用户数据
};
五、程序源代码(核心部分)
2、实验二
PING.H
#ifndefPING_H_
#definePING_H_
#include
#include
#include
#include
#include
#include /*basicsystemdatatypes*/
#include /*basicsocketdefinitions*/
#include /*timeval{}forselect()*/
#include /*timespec{}forpselect()*/
#include /*sockaddr_in{}andotherInternetdefns*/
#include /*inet(3)functions*/
#include
#include
#include
#include
#include
#include
#include
#include
#include /*forUnixdomainsockets*/
#include
#include
#include
#include
#ifdefHAVE_SOCKADDR_DL_STRUCT
#include
#endif
#defineBUFSIZE 1500
#defineMAXLINE4096
/*globals*/
char recvbuf[BUFSIZE];
char sendbuf[BUFSIZE];
intttl_signal;
intttl_value;
char*ttl_val;
intdatalen; /*#bytesofdata,followingICMPheader*/
char *host;
intbroad_sign=0;
int nsent; /*add1foreachsendto()*/
pid_tpid; /*ourPID*/
int sockfd;
int verbose;
intdaemon_proc;/*setnonzerobydaemon_init()*/
/*functionprototypes*/
void proc_v4(char*,ssize_t,structtimeval*);
void proc_v6(char*,ssize_t,structtimeval*);
void send_v4(void);
void send_v6(void);
void readloop(void);
void sig_alrm(int);
void tv_sub(structtimeval*,structtimeval*);
char*Sock_ntop_host(conststructsockaddr*sa,socklen_tsalen);
structaddrinfo*host_serv(constchar*host,constchar*serv,intfamily,intsocktype);
staticvoiderr_doit(interrnoflag,intlevel,constchar*fmt,va_listap);
voiderr_quit(constchar*fmt,...);
voiderr_sys(constchar*fmt,...);
structproto{
void (*fproc)(char*,ssize_t,structtimeval*);
void (*fsend)(void);
structsockaddr*sasend; /*sockaddr{}forsend,fromgetaddrinfo*/
structsockaddr*sarecv; /*sockaddr{}forreceiving*/
socklen_t salen; /*lengthofsockaddr{}s*/
int icmpproto; /*IPPROTO_xxxvalueforICMP*/
}*pr;
#endif/*PING_H_*/
PING.C
#include"ping.h"
structproto proto_v4={proc_v4,send_v4,NULL,NULL,0,IPPROTO_ICMP};
#ifdef IPV6
structproto proto_v6={proc_v6,send_v6,NULL,NULL,0,IPPROTO_ICMPV6};
#endif
int datalen=56; /*datathatgoeswithICMPechorequest*/
doublertt_min=INFINITY,rtt_max=-INFINITY,rtt_total=0,rtt_sqr_total=0;
longlongsend_count=0,recv_count=0;
intttl_flag=0,broadcast_flag=0;
intttl=0;
structtimevaltval_start;
constchar*usage=
"usage:
ping[-v][-h][-b][-tttl][-q]\n"
"\t-v\tNormalmode\n"
"\t-b\tBroadcast\n"
"\t-tttl\tSetTTL(0-255)\n"
"\t-q\tQuietmode";
intmain(intargc,char**argv)
{
int c;
structaddrinfo *ai;
opterr=0; /*don'twantgetopt()writingtostderr*/
while((c=getopt(argc,argv,"vhbt:
q"))!
=-1){
switch(c){
case'v':
verbose++;
break;
case'h':
puts(usage);
return0;
case'b':
broadcast_flag=1;
break;
case't':
ttl_flag=sscanf(optarg,"%d",&ttl)&&ttl>=0&&ttl<256;
break;
case'q':
verbose--;
break;
case'?
':
err_quit("unrecognizedoption:
%c",c,usage);}
if(optind!
=argc-1)
err_quit(usage);
host=argv[optind];
pid=getpid();
signal(SIGALRM,sig_alrm);
signal(SIGINT,sig_int);
ai=host_serv(host,NULL,0,0);
printf("ping%s(%s):
%ddatabytes\n",ai->ai_canonname,
Sock_ntop_host(ai->ai_addr,ai->ai_addrlen),datalen);
/*4initializeaccordingtoprotocol*/
if(ai->ai_family==AF_INET){
pr=&proto_v4;
#ifdef IPV6
}elseif(ai->ai_family==AF_INET6){
pr=&proto_v6;
if(IN6_IS_ADDR_V4MAPPED(&(((structsockaddr_in6*)
ai->ai_addr)->sin6_addr)))
err_quit("cannotpingIPv4-mappedIPv6address");
#endif
}else
err_quit("unknownaddressfamily%d",ai->ai_family);
pr->sasend=ai->ai_addr;
pr->sarecv=calloc(1,ai->ai_addrlen);
pr->salen=ai->ai_addrlen;
gettimeofday(&tval_start,NULL);
readloop();
exit(0);
}
voidproc_v4(char*ptr,ssize_tlen,structtimeval*tvrecv)
{
int hlen1,icmplen;
double rtt;
struc