网络实验报告.docx

上传人:b****5 文档编号:5712710 上传时间:2022-12-31 格式:DOCX 页数:22 大小:1.63MB
下载 相关 举报
网络实验报告.docx_第1页
第1页 / 共22页
网络实验报告.docx_第2页
第2页 / 共22页
网络实验报告.docx_第3页
第3页 / 共22页
网络实验报告.docx_第4页
第4页 / 共22页
网络实验报告.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

网络实验报告.docx

《网络实验报告.docx》由会员分享,可在线阅读,更多相关《网络实验报告.docx(22页珍藏版)》请在冰豆网上搜索。

网络实验报告.docx

网络实验报告

NJUST

计算机网络实验

赫思奇0710210223

乔宇龙07102102

周建海07102102

2010-6-15

指导教师:

项文波

实验目的

1、掌握计算机网络通信时,数据在传输层、网络层和数据链路层中是如何传输的,各层的协议有哪些,这些协议的语法(即各层的数据和控制信息的格式)、语义(即需要发出何种控制信息,完成何种动作以及做出何种应答)、同步(即事件实现顺序的详细说明)是如何定义的。

2、在TCP/IP网络应用中,通信的两个进程之间相互作用采用客户/服务器模式时,通信的这两个进程之间如何进行数据传输(包括建立连接、传输数据以及释放链接)。

一、实验原理

1、数据链路层

为了使局域网中的数据链路层不至于过于复杂,应将局域网中的数据链路层划分为两个子层,即:

媒体接入控制或媒体访问控制MAC子层和逻辑链路控制LLC子层,网络的服务访问点SAP则在LLC层与高层的交界面。

如下图:

局域网链路层中有两种不同的数据单元LLCPDU和MAC帧。

高层的协议数据单元传到LLC层,加上适当的首部和尾部,就构成了LLC子层的协议数据单元LLCPDU。

LLCPDU向下传到MAC层时,加上适当的首部尾部,就构成了MAC子层的协议数据单元MAC帧。

如下图:

 

2、网络层

网际协议IP是TCP/IP体系中两个最主要的协议之一。

与IP协议配套使用的还有三个协议:

地址解析协议ARP(负责将IP地址转换为硬件地址)、逆地址解析协议RARP(负责将硬件地址转换为IP地址)、因特网控制报文协议ICMP

IP数据报格式如下:

ICMP报文格式如下:

IP地址放在IP地址的首部,硬件地址放在MAC帧首部。

在网络层及以上使用的是IP地址,链路层及收下使用的是硬件地址。

在IP层抽象的互连网上只能看到的是IP数据报。

在具体的物理网络的链路层中我们只能看到MAC帧。

IP地址与硬件地址关系图如下:

3、传输层

TCP段格式如下:

 

三、实验内容:

实验一使用winpcap网络层收发包实验

目的:

1、了解数据链路层通信的基本方法;2、了解pcap编程方法。

内容:

按图搭建实验环境,将两台PC机通过RJ-45连接电缆相连。

PC1(172.16.1.2)PC2(172.16.1.3)

实验步骤:

1. 下载并安装 WinPcap, 推荐的版本是3.0 

2. 从 http:

//winpcap.polito.it 下载 WinPcap Developer’s Pack 并解压缩 

3. 把 Winpcap Developer’s Pack 中的 Includes 目录添加为新的包含文件目录  添加库 wpcap.lib 和 wsock32.lib  

4.接收包实验,健入对应程序

5.使用ping程序,分析接收包

6.键入发送包程序

7.使用ethrea分析实验结果

注意事项

编译的时候又遇到问题——“无法打开pcap.h”。

解决方法:

1.安装Winpcap驱动。

下载地址:

http:

//www.winpcap.org/install/bin/WinPcap_3_1.exe。

2.将Winpcap的Include,Lib目录添加进VC6.0的环境变量中;

3. 针对每一个项目,先用VC打开项目,然后在"Project->Settings",标签栏出选择"C/C++",在"Preprocessor definitions"的输入框里添加"WPCAP",再选择"Link",在"Object/library modules"的输入框里添加"wpcap.lib Packet.lib"。

实验内容分析:

1)程序中用到的链路层协议中有如下要求:

1. 接口的地址列表 

2. 接口的掩码列表 (与地址列表一一对应) 

3. 接口的广播地址列表 (与地址列表一一对应) 

4. 目标地址列表 (与地址列表一一对应) 

2)捕获数据包:

pcap_t*pcap_open(constchar*source,intsnaplen,intflags)

只是在捕获数据包的时候前天的程序用的是pcap_loop(),基于pcap_loop()抓包机制的回调很方便而且在某些情况下是一个不错的选择。

但是,处理回调有些时候不适用——它使得程序更复杂,尤其是在应用程序与多线程或C++类有关的情况下。

3)用于过滤的函数:

Winpcap提供(libpcap也提供)的一个强大特性是过滤引擎(filteringengine)。

它提供了一个非常有效的接收网络流量的方法,并且它通常与Winpcap提供的抓包机制集成在一起。

用于过滤数据包的函数是pcap_complie()和pcap_setfilter()。

4)发送数据包

intpcap_sendpacket(pcap_t*p,u_char*buf,intsize)

发送一个原始数据包(rawpacket)到网络上。

p是用来发送数据包的那个接口,buf包含着要发送的数据包的数据(包括各种各样的协议头),size是buf所指的缓冲区的尺寸,也就是要发送的数据包的大小。

MAC循环冗余码校验不必被包含,因为它很容易被计算出来并被网络接口驱动添加。

如果数据包被成功发送,返回0;否则,返回-1。

Winpcap是针对Win32平台上的抓包和网络分析的一个架构。

它包括一个核心态的包过滤器,一个底层的动态链接库(packet.dll)和一个高层的不以来于系统的库(wpcap.dll)。

实验的具体代码分析:

实验贴图以及分析结果:

发包程序运行结果,我们的主机ip号是172.16.1.202

目的主机的ip号是172.16.6.2

发送的内容是一个原始数据包(rawpacket)

如图所示,每次都会进行四次请求和响应。

发包程序运行结果,源主机ip号是172.16.14.3

目的主机的ip号是172.16.1.202

如图中蓝色部分所示,源主机一共向目的主机进行了四次请求,同时目的主机向源主机进行了四次响应。

 

实验二跨网络数据传输实验

目的:

1、了解IP地址与硬件地址的区别,掌握IP包结构2、理解ICMP包的回送和回送响应消息功能

内容:

1、设计程序,其功能是发送ICMP数据包给指定网段的主机。

2、利用Ethreal截获数据包,分析ICMP包,判断是否成功发送数据包给指定网段主机。

实验步骤:

定义数据结构

(1)定义IP头部的数据结构

typedefstruct_iphdr//定义IP首部

{

unsignedcharh_verlen;//4位首部长度,4位IP版本号

unsignedchartos;//8位服务类型TOS

unsignedshorttotal_len;//16位总长度(字节)

unsignedshortident;//16位标识

unsignedshortfrag_and_flags;//3位标志位

unsignedcharttl;//8位生存时间TTL

unsignedcharproto;//8位协议(TCP,UDP或其他)

unsignedshortchecksum;//16位IP首部校验和

unsignedintsourceIP;//32位源IP地址

unsignedintDestIp;//32位目的IP地址

}IP

(2)定义ICMP头部的数据结构

(3)定义链路层数据包包头的数据结构

typedefstructethdr//以太头结构

{

unsignedchareh_dst[6];

unsignedchareh_src[6];

unsignedshorteh_type;

}ETHDR,*PETHDR;

_HEADER;

填充数据包首部

(1)填充IP首部

icmp.iphdr.h_verlen=(4<<4|sizeof(icmp.iphdr)/sizeof(unsignedlong));//高四位IP版本号,低四位首部长度

icmp.iphdr.tos=0;

icmp.iphdr.total_len=htons(60);//htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER));//16位总长度(字节)

icmp.iphdr.ident=htons(0x7b3e);//16位标识

icmp.iphdr.frag_and_flags=0;//3位标志位

icmp.iphdr.ttl=126;//8位生存时间TTL

icmp.iphdr.proto=IPPROTO_ICMP;//8位协议(TCP,UDP或其他)

icmp.iphdr.checksum=0;//16位IP首部校验和

icmp.iphdr.sourceIP=inet_addr(SourceIp);//32位源IP地址

icmp.iphdr.DestIp=inet_addr(DestIp);//32位目的IP地址

(2)填充ICMP首部

icmp.ihdr.i_type=8;

icmp.ihdr.i_code=0;

icmp.ihdr.i_cksum=0;

icmp.ihdr.i_id=htons(0x0200);

icmp.ihdr.i_seq=htons(0x1600);

(3)填充链路包首部

eth.eh_dst[0]=0x00;//本地路由MAC地址

eth.eh_dst[1]=0x0f;

eth.eh_dst[2]=0xe2;

eth.eh_dst[3]=0x5d;

eth.eh_dst[4]=0x26;

eth.eh_dst[5]=0x74;

eth.eh_src[0]=0x00;//本地主机MAC地址

eth.eh_src[1]=0x1b;

eth.eh_src[2]=0xb9;

eth.eh_src[3]=0x74;

eth.eh_src[4]=0x11;

eth.eh_src[5]=0x50;

eth.eh_type=htons(0x0800);

(4)填充发送缓冲区

(5)获得网卡实例对象

(6)发送数据包

while

(1){

if(pcap_sendpacket(adhandle,(unsignedchar*)SendBuf1,datasize+14)!

=0){

printf("发送失败.\n");

}

Sleep(200);

}

2、编译并运行程序。

3、用Ethereal抓包并分析数据包注意事项

实验注意事项:

编译的时候又遇到问题——“无法打开pcap.h”。

解决方法:

1.安装Winpcap驱动。

下载地址:

http:

//www.winpcap.org/install/bin/WinPcap_3_1.exe。

2.将Winpcap的Include,Lib目录添加进VC6.0的环境变量中;

3. 针对每一个项目,先用VC打开项目,然后在"Project->Settings",标签栏出选择"C/C++",在"Preprocessor definitions"的输入框里添加"WPCAP",再选择"Link",在"Object/library modules"的输入框里添加"wpcap.lib Packet.lib"。

 

实验贴图以及分析结果:

实验是用主机单向向目的主机发送ICMP报文,目的主机只需要发送回复即可。

可以看到发送方式主机172.16.1.202目的主机是172.16.6.2。

通过两个主机的路由可以看出,这是一个跨网发送IP数据报的实验,因此发送是会涉及到路由的转发问题,在源主机发送时,应该填充的MAC地址是路由的MAC地址。

但目的IP地址是目的主机的IP地址。

路由器的MAC地址需要用DOS命令行arp–a这条语句来解析路由地址,获得路由器的IP和MAC地址,这里只用MAC地址。

试验中由于IP包的报头填充不正确,导致数据包不断丢失然后重传。

这在图中是可以看出来的。

实验三传输层网络数据收发

目的:

1、了解IP地址与硬件地址的区别;

2、理解ICMP包的回送和回送响应消息功能;

3、掌握利用Winpcap发送数据包的方法。

内容:

设计程序,其功能是发送ICMP数据包给指定网段的主机。

2、利用Ethreal截获数据包,分析ICMP包,判断是否成功发送数据包给指定网段主机。

实验步骤:

(1)服务器的实现

如前所述,TCP/IP协议的应用一般采用客户/服务器模式,因此在实际应用中,必须有客户和服务器两个进程,并且首先启动服务器。

面向连接的协议(如TCP)的套接字系统调用如图所示:

服务器必须首先启动,直到它执行完accept()调用,进入等待状态后,方能接收客户请求。

假如客户在此前启动,则connect()将返回出错代码,连接不成功。

在这个程序中,将两个工程添加到一个工作区。

同时还要链接一个ws2_32.lib的库文件。

服务器端代码如下:

#include"windows.h"

#include"stdio.h"

#defineTRUE1

/*这个程序建立一个套接字,然后开始无限循环;每当它通过循环接收到一个连接,则打印出一个信息。

当连接断开,或接收到终止信息,则此连接结束,程序再接收一个新的连接。

命令行的格式是:

streams*/

main()

{

intsock,length;

structsockaddr_inserver;

structsockaddrtcpaddr;

intmsgsock;

charbuf[1024];

intrval,len;

/*建立套接字*/

WSADATAWSADAtA;

if(WSAStartup(MAKEWORD(2,2),&WSADAtA))

{

printf("WSAStArtupfAiled:

%d\n",GetLastError());

return-1;

}

server.sin_family=AF_INET;

server.sin_addr.S_un.S_addr=INADDR_ANY;//=htonl(inaddr_any);

server.sin_port=htons(5656);

sock=socket(AF_INET,SOCK_STREAM,0);

if(sock<0){

perror("openingstreamsocket");

exit

(1);

}

/*使用任意端口命名套接字*/

if(bind(sock,(structsockaddr*)&server,sizeof(server))<0){

perror("bindingstreamsocket");

exit

(1);

}

/*找出指定的端口号并打印出来*/

length=sizeof(server);

if(getsockname(sock,(structsockaddr*)&server,&length)<0){

perror("gettingsocketname");

exit

(1);

}

printf("socketport#%d\n",ntohs(server.sin_port));

/*开始接收连接*/

listen(sock,5);

len=sizeof(structsockaddr);

do{

msgsock=accept(sock,(structsockaddr*)&tcpaddr,(int*)&len);

if(msgsock==-1)

perror("accept");

elsedo{

memset(buf,0,sizeof(buf));

if((rval=recv(msgsock,buf,1024,0))<0)

{

perror("readingstreammessage");

intk=GetLastError();

}

if(rval==0)

printf("endingconnection\n");

else

printf("-->%s\n",buf);

}while(rval!

=0);

closesocket(msgsock);

}while(TRUE);

/*因为这个程序已经有了一个无限循环,所以套接字"sock"从来不显式关闭。

然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。

*/

exit(0);

}

(2)客户端实现

#include"windows.h"

#include"stdio.h"

#defineDATA"halfaleague,halfaleague..."

/*这个程序建立套接字,然后与命令行给出的套接字连接;连接结束时,在连接上发送

一个消息,然后关闭套接字。

命令行的格式是:

streamc主机名端口号

端口号要与服务器程序的端口号相同*/

main(intargc,char*argv[])

{

intsock;

structsockaddr_inserver;

structhostent*hp;

charbuf[1024];

WSADATAWSADAtA;

if(WSAStartup(MAKEWORD(2,2),&WSADAtA))

{

printf("WSAStArtupfAiled:

%d\n",GetLastError());

return-1;

}

/*建立套接字*/

sock=socket(AF_INET,SOCK_STREAM,0);

if(sock<0){

perror("openingstreamsocket");

exit

(1);

}

/*使用命令行中指定的名字连接套接字*/

server.sin_family=AF_INET;

hp=gethostbyname(argv[1]);

if(hp==0){

fprintf(stderr,"%s:

unknownhost\n",argv[1]);

exit

(2);

}

memcpy((char*)&server.sin_addr,(char*)hp->h_addr,hp->h_length);

server.sin_port=htons(5656);

if(connect(sock,(structsockaddr*)&server,sizeof(server))<0){

perror("connectingstreamsocket");

exit(3);

}

while

(1)

{

if(send(sock,DATA,sizeof(DATA),0)<0)

perror("sendingonstreamsocket");

Sleep(200);

}

}

(3)运行服务器和客户机,这两个程序是一组自收自发形式的TCP收发程序

实验贴图以及分析结果:

这组C/S程序是自发自收程序,利用的是设置好的5656端口,运行的结果如上所示,这组程序验证了TCP协议的运作机制,运用套接字socket的编程打开一个端口对应的接受客户机所要求的响应。

 

实验四网络协议分析实验

目的:

1、了解IP地址与硬件地址的区别;

2、理解ICMP包的回送和回送响应消息功能;

3、掌握利用Winpcap发送数据包的方法。

内容:

1、使用Ping命令测试目标主机是否在线。

2、利用Ethreal截获数据包,分析三次握手机制

实验步骤:

(1)Ping命令:

ping

(2)使用Ethreal查看结果:

显示4次reply

(3)实验截图

(4)结果分析

从结果中可以看出,浏览器版本是ipv4,头部长度为20byte,总长度是60byte

操作系统是windows(生存时间128秒)。

协议是因特网控制报文协议ICMP,校验和的校验结果是正确的。

报文来自172.16.2.202(源主机IP),目的IP218.22.21.21。

实验五网络命令的使用

目的:

1、掌握各个网络命令的运行方法;

2、理解网络命令的运行原理;

内容:

1、输入命令。

2、利用Ethreal截获数据包,各个命令的运行结果。

实验步骤:

输入以下命令,观察运行结果:

1.1ARP命令:

arp命令显示和修改地址解析协议使用的“因特网至适配器”地址解析转化表。

arp命令显示HostName变量指定的主机的当前ARP条目。

主机可以由名称或编号指定,它使用因特网点十进制符号。

1.2Ipconfig命令:

该诊断命令显示所有当前的TCP/IP网络配置值。

该命令在运行DHCP系统上的特殊用途,允许用户决定DHCP配置的TCP/IP配置值。

  更新DHCP配置参数。

该选项只在运行DHCP客户端服务的系统上可用。

要指定适配器名称,请键入使用不带参数的ipconfig命令显示的适配器名称。

  /release[adapter]

  发布当前的DHCP配置。

该选项禁用本地系统上的TCP/IP,并只在DHCP客户端上可用。

要指定适配器名称,请键入使用不带参数的ipconfig命令显示的适配器名称。

  如果没有参数,那么ipconfig实用程序将向用户提供所有当前的TCP/IP配置值,包括IP地址和子网掩码。

该使用程序在运行DHCP的系统上特别有用,允许用户决定由DHCP配置的值。

1.3Nbtstas命令:

该诊断命令使用NBT(TCP/IP上的NetBIOS)显示协议统计和当前TCP/IP连接。

该命令只有在安装了TCP/IP协议之后才可用。

  nbtstat[-aremotename][-AIPaddress][-c][-n][-R][-r][-S][-s][interval]

  参数

  -aremotename

  使用远程计算机的名称列出其名称表。

  -AIPaddress

  使用远程计算机的IP地址并列出名称表。

  

  -c

  给定每个名称的IP地址并列出NetBIOS名称缓存的内容。

  -n

  列出本地NetBIOS名称。

“已注册”表

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

当前位置:首页 > 经管营销 > 金融投资

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

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