计算机网络课程设计.docx

上传人:b****8 文档编号:11244731 上传时间:2023-02-26 格式:DOCX 页数:49 大小:1.44MB
下载 相关 举报
计算机网络课程设计.docx_第1页
第1页 / 共49页
计算机网络课程设计.docx_第2页
第2页 / 共49页
计算机网络课程设计.docx_第3页
第3页 / 共49页
计算机网络课程设计.docx_第4页
第4页 / 共49页
计算机网络课程设计.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

计算机网络课程设计.docx

《计算机网络课程设计.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计.docx(49页珍藏版)》请在冰豆网上搜索。

计算机网络课程设计.docx

计算机网络课程设计

计算机网络课程设计

实验报告

实验一数据包的捕获与分析

1.1实验目的

数据包捕获技术是网络管理系统的关键技术。

本实验通过Wireshark软件的安装使用,监控局域网的状态,捕获在局域网中传输的数据包,并结合在计算机网络课程中学习到的理论知识,对常用网络协议的数据包做出分析,加深网络课程知识的理解和掌握。

1.2实验内容

Wireshark是一种开源的网络数据包的捕获和分析软件,本实验通过Wireshark软件的安装使用,监控局域网的状态,捕获在局域网中传输的数据包,并结合在计算机网络课程中学习到的理论知识,对常用网络协议的数据包做出分析,加深网络课程知识的理解和掌握。

具体内容及要求如下:

●Wireshark软件的安装;

●Wireshark软件的启动,并设置网卡的状态为混杂状态,使得Wireshark可以监控局域网的状态;

●启动数据包的捕获,跟踪PC之间的报文,并存入文件以备重新查;

●设置过滤器过滤网络报文以检测特定数据流;

●对常用协议的数据包的报文格式进行分析,利用协议分析软件的统计工具显示网络报文的各种统计信息。

1.3实验环境

Wirshark1.1.1

1.4实验抓包情况

EthernetⅡ数据链路层:

设置过滤方式是捕获后过滤,过滤条件为udp

Destination:

IPv4mcast_00:

00:

fc(01:

00:

5e:

00:

00:

fc)目的:

厂名_序号(网卡地址)

   Source:

4c:

80:

93:

25:

d0:

1e(4c:

80:

93:

25:

d0:

1e) 源:

厂名_序号(网卡地址)

  Type:

IP(0x0800) 帧内封装的上层协议类型为IP(十六进制码0800)

以下为网络层IP包头信息

Version:

4 互联网协议IPv4

Headerlength:

20bytes                            IP包头部长度

DifferentiatedServicesField:

0x00(DSCP0x00:

Default;ECN:

0x00)差分服务字段

TotalLength:

52                                         IP包的总长度

Identification:

0x6992(27062)                           标志字段

Flags:

0x00      标记字段(在路由传输时,是否允许将此IP包分段)

Fragmentoffset:

0   分段偏移量(将一个IP包分段后传输时,本段的标识)

Timetolive:

1                                         生存期TTL

Protocol:

TCP(0x11)                        此包内封装的上层协议为TCP

Headerchecksum:

0x64ba[correct]                 头部数据的校验和

Source:

10.27.0.86(10.27.0.86)                  源IP地址

Destination:

224.0.0.252(224.0.0.252)               目的IP地址

以下为传输层UDP包头

Sourceport:

65167(65167)源端口名称

Destinationport:

llmnr(5355)目的端口名称

Length:

32头部长度

Checksum:

0xd065[validationdisabled]UDP数据段的校验和

以下是网络层的icmp包头

Type:

8(Echo(ping)request)类型为8(ping),响应请求信号

Code:

0()代码

Checksum:

0x4d3e[correct]校验和

Identifier:

0x0001标识code=0,identifier用来匹配echo和echoreply消息

Sequencenumber:

29(0x001d)顺序号

以下为传输层TCP数据段头部信息

Sourceport:

http(80)源端口名称(端口号)

Destinationport:

52449(52449)                 目的端口名

Sequencenumber:

1   (relativesequencenumber)   序列号(相对序列号)

Headerlength:

20bytes                                       头部长度

Flags:

0x14(RST,ACK)       TCP标记字段(本字段是RST,ACK,置位表示复位TCP连接,置位表

示确认号字段有效)

Windowsize:

0                               流量控制的窗口大小

Checksum:

0xd47e[validationdisabled]                        TCP数据段的校验和

以下为数据链路层IEEE802.3报文格式

注意:

IEEE802.3是有线以太网的协议,所以要想得到IEEE802.3的报文就必须要叉网线。

DSTADDR

SRCADDR

LEN

DSAP

SSAP

CONTROL

INFO

6字节

6字节

2字节

1字节

1字节

1/2字节

信息

最大长度1518字节

Destination:

Spanning-tree-(for-bridges)_00(01:

80:

c2:

00:

00:

00)目的:

厂名_序号(网卡地址)

 Source:

Hangzhou_07:

f2:

e0(00:

0f:

e2:

07:

f2:

e0) 源:

厂名_序号(网卡地址)

Length:

132长度

1.4总结

Wireshark是一款基于winpcap的抓包软件,它的界面是友好的,功能是强大的,上手是容易的,掌握是困难的。

通过短暂的学习研究,我发现Wireshark之于我么学生的主要功能便是帮助我们更好地学习和理解协议。

正如你知道西瓜是甜的,但只有当你吃过了西瓜,你才能体会到西瓜特有的味道。

而Wirkshark就给我们提供了吃西瓜所需的西瓜刀。

Wireshark是一款网络嗅探器,它以明文的方式显示捕获的包信息,这对于分析协议格式和内容是非常有帮助的。

而且Wireshark的显示比较人性化。

过滤器方式可以是捕获前过滤也可以是捕获后过滤,可以根据自己的需要自行选择。

本次实验,让我深刻地去了解了网络各协议栈的协议,以及对应的包头格式及内容,尤其是对IP包头和ICMP包头的了解又更上一层楼了,这对于理解网络通信的原理特别有帮助,理解了各协议栈的任务以及基本原理。

实验二网络层实验—Ping程序的设计与实现

一、实验内容和要求

本实验为ICMP实验。

实验内容:

Ping命令实现的扩充,在给定的Ping程序的基础上做如下功能扩充:

●-h显示帮助信息

●-b允许ping一个广播地址,只用于IPv4

●-t设置ttl值,只用于IPv4

●-q安静模式。

不显示每个收到的包的分析结果,只在结束时,显示汇总结果

Ping命令的基本描述

Ping的操作是向某些IP地址发送一个ICMPEcho消息,接着该节点返回一个ICMPEchoreply消息。

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消息的源地址。

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的主机或路由器返回同一个值与之匹配

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];//用户数据

};

二、实验环境

Windows平台+Linux平台

三、程序的需求分析与逻辑框图

需求分析

允许ping广播地址

打印要获取包的数量

显示使用帮组信息

设置时间间隔

设置安静模式,不显示每个收到的包的分析结果,只在结束时,显示汇总结果

设置数据的长度

设置ttl(生存时间)值

除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包

逻辑框图

ping程序函数概貌

1)main函数

2)readloop函数

3)proc函数

4)send函数

四、程序核心功能的实现机制

程序分为两大部分:

一部分读取收到的所有消息,并输出ICMPEchoreplay消息,另一部分每隔一秒钟发送一个Echo消息。

另一部分由SIGALARM信号每秒驱动一次。

首先需要在main()函数里面的循环getopt()的参数里面增加参数,本次实验加的是b,c,h,i,q,s,t,v.然后不同的分支执行不同的操作。

在主函数的最后也就是readloop()函数之后再加一个statistics()数据统计函数,目的是在readloop()中返回时直接执行这个函数。

五、程序源代码(核心部分)

黑体字部分是修改部分

intmain(intargc,char**argv)

{

externchar*optarg;

intc;

structaddrinfo*ai;

char*e;

opterr=0;/*don'twantgetopt()writingtostderr*/

while((c=getopt(argc,argv,"bc:

hi:

qs:

t:

v"))!

=-1){

switch(c){

case'b':

options|=F_BROADCAST;break;

case'c':

npackets=strtol(optarg,&e,10);

if(npackets<=0||*optarg=='\0'||*e!

='\0')

errx(1,"illegalnumberofpackets--%s",optarg);

break;

case'h':

usage();

exit

(1);

break;

case'i':

/*waitbetweensendingpackets*/

interval=strtol(optarg,&e,10);

if(interval<=0||*optarg=='\0'||*e!

='\0')

errx(1,"illegaltiminginterval--%s",optarg);

options|=F_INTERVAL;

break;

case'q':

options|=F_QUIET;break;

case's':

/*sizeofpackettosend*/

datalen=strtol(optarg,&e,10);

if(datalen<=0||*optarg=='\0'||*e!

='\0')

errx(1,"illegaldatalenvalue--%s",optarg);

if(datalen>MAXPACKET)

errx(1,"datalenvaluetoolarge,maximumis%d",MAXPACKET);

break;

case't':

ttl=strtol(optarg,&e,10);

if(datalen<=0||*optarg=='\0'||*e!

='\0')

errx(1,"illegalttlvalue--%s",optarg);

options|=F_TTL;

break;

case'v':

options|=F_VERBOSE;break;

//case'?

':

//err_quit("unrecognizedoption:

%c",c);

default:

usage();

}

}

if(optind!

=argc-1)usage();

host=argv[optind];

pid=getpid();

signal(SIGALRM,sig_alrm);

ai=host_serv(host,NULL,0,0);

if(options&F_BROADCAST)

printf("WARNING:

pingingbroadcastaddress\n");

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;

#ifdefIPV6

}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);

(void)signal(SIGINT,onint);

pr->sasend=ai->ai_addr;

pr->sarecv=calloc(1,ai->ai_addrlen);

pr->salen=ai->ai_addrlen;

readloop();

statistics();

exit(0);

}

//////////////////////////////////////////////////////////////

voidreadloop(void)

{

intsize;

charrecvbuf[BUFSIZE];

socklen_tlen;

ssize_tn;

structtimevaltval;

intyes=1;

sockfd=socket(pr->sasend->sa_family,SOCK_RAW,pr->icmpproto);

setuid(getuid());/*don'tneedspecialpermissionsanymore*/

size=60*1024;/*OKifsetsockoptfails*/

setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size));

if(options&F_TTL)

setsockopt(sockfd,IPPROTO_IP,IP_TTL,&ttl,sizeof(ttl));

if(options&F_BROADCAST)

setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes));

sig_alrm(SIGALRM);/*sendfirstpacket*/

for(;;){

len=pr->salen;

n=recvfrom(sockfd,recvbuf,sizeof(recvbuf),0,pr->sarecv,&len);

if(n<0){

if(errno==EINTR)

continue;

else

err_sys("recvfromerror");

}

gettimeofday(&tval,NULL);

(*pr->fproc)(recvbuf,n,&tval);

if(npackets&&nreceived>=npackets)

break;

}

}

/////////////////////////////////////////////////////////////

voidusage()

{

err_quit("Usage:

ping[-ccount][-iinterval]\n\

[-b][-q][-spacketsize]\n\

[-tttl][-v][-h]");

}

/////////////////////////////////////////////////////////////

voidstatistics()

{printf("\n---%spingstatistics---\n",host);

printf("%ldpacketstransmitted,%ldreceived,%%%dlost\n",nsend,nreceived,(nsend-nreceived)/nsend*100);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1