计算机网络课程设计实验报告Word文件下载.doc
《计算机网络课程设计实验报告Word文件下载.doc》由会员分享,可在线阅读,更多相关《计算机网络课程设计实验报告Word文件下载.doc(35页珍藏版)》请在冰点文库上搜索。
![计算机网络课程设计实验报告Word文件下载.doc](https://file1.bingdoc.com/fileroot1/2023-5/7/b611016d-b26f-4b5d-8655-c88eded37428/b611016d-b26f-4b5d-8655-c88eded374281.gif)
多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。
但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。
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;
否
结束
四、程序核心功能的实现机制
利用协议分析软件跟踪局域网报文,实验内容如下:
将安装协议分析软件的PC接入以太网中,跟踪PC之间的报文,并存入文件以备重新查。
设置过滤器过滤网络报文以检测特定数据流。
利用协议分析软件的统计工具显示网络报文的各种统计信息。
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消息的源地址。
四、程序核心功能的实现机制
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
功能描述:
收到echo消息必须回应echoreply消息。
identifier和sequencenumber可能被发送echo的主机用来匹配返回的
echoreply消息。
例如:
identifier可能用于类似于TCP或UDP的port
用来标示一个会话,而sequencenumber会在每次发送echo请求后递增。
收到echo的主机或路由器返回同一个值与之匹配
四、 程序核心功能的实现机制
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;
//本实验置零
//ICMP包校验和,从TYPE开始,直到最后一位用户数据,如果为
字节数为奇数则补充一位
WORDID;
//用于匹配ECHO和ECHOREPLY包
WORDSeq;
//用于标记ECHO报文顺序
//用户数据
五、程序源代码(核心部分)
PING.H
#ifndefPING_H_
#definePING_H_
#include <
netinet/in_systm.h>
#include <
netinet/ip.h>
netinet/ip_icmp.h>
netinet/icmp6.h>
netinet/ip6.h>
sys/types.h>
/*basicsystemdatatypes*/
sys/socket.h>
/*basicsocketdefinitions*/
sys/time.h>
/*timeval{}forselect()*/
time.h>
/*timespec{}forpselect()*/
netinet/in.h>
/*sockaddr_in{}andotherInternetdefns*/
arpa/inet.h>
/*inet(3)functions*/
netdb.h>
signal.h>
stdio.h>
stdlib.h>
string.h>
errno.h>
pwd.h>
unistd.h>
sys/un.h>
/*forUnixdomainsockets*/
sys/ioctl.h>
net/if.h>
#include<
stdarg.h>
syslog.h>
#ifdefHAVE_SOCKADDR_DL_STRUCT
#include<
net/if_dl.h>
#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};
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]<
hostname>
\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;
h'
puts(usage);
return0;
b'
broadcast_flag=1;
break;
t'
ttl_flag=sscanf(optarg,"
%d"
&
ttl)&
&
ttl>
=0&
ttl<
256;
q'
verbose--;
?
'
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;
}elseif(ai->
ai_family==AF_INET6){
proto_v6;
if(IN6_IS_ADDR_V4MAPPED(&
(((structsockaddr_in6*)
ai->
ai_addr)->
sin6_addr)))
cannotpingIPv4-mappedIPv6address"
);
}else
err_quit("
unknownaddressfamily%d"
ai_family);
pr->
sasend=ai->
ai_addr;
sarecv=calloc(1,ai->
ai_addrlen);
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