网络实验报告Word下载.docx
《网络实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《网络实验报告Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
按图搭建实验环境,将两台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
中的
Includes
目录添加为新的包含文件目录
添加库
wpcap.lib
和
wsock32.lib
4.接收包实验,健入对应程序
5.使用ping程序,分析接收包
6.键入发送包程序
7.使用ethrea分析实验结果
注意事项
编译的时候又遇到问题——“无法打开pcap.h”。
解决方法:
1.安装Winpcap驱动。
下载地址:
//www.winpcap.org/install/bin/WinPcap_3_1.exe。
2.将Winpcap的Include,Lib目录添加进VC6.0的环境变量中;
针对每一个项目,先用VC打开项目,然后在"
Project->
Settings"
,标签栏出选择"
C/C++"
,在"
Preprocessor
definitions"
的输入框里添加"
WPCAP"
,再选择"
Link"
Object/library
modules"
Packet.lib"
。
实验内容分析:
1)程序中用到的链路层协议中有如下要求:
接口的地址列表
接口的掩码列表
(与地址列表一一对应)
接口的广播地址列表
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));
icmp.iphdr.ident=htons(0x7b3e);
icmp.iphdr.frag_and_flags=0;
icmp.iphdr.ttl=126;
icmp.iphdr.proto=IPPROTO_ICMP;
icmp.iphdr.checksum=0;
icmp.iphdr.sourceIP=inet_addr(SourceIp);
icmp.iphdr.DestIp=inet_addr(DestIp);
(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抓包并分析数据包注意事项
实验注意事项:
实验是用主机单向向目的主机发送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数据包给指定网段的主机。
(1)服务器的实现
如前所述,TCP/IP协议的应用一般采用客户/服务器模式,因此在实际应用中,必须有客户和服务器两个进程,并且首先启动服务器。
面向连接的协议(如TCP)的套接字系统调用如图所示:
服务器必须首先启动,直到它执行完accept()调用,进入等待状态后,方能接收客户请求。
假如客户在此前启动,则connect()将返回出错代码,连接不成功。
在这个程序中,将两个工程添加到一个工作区。
同时还要链接一个ws2_32.lib的库文件。
服务器端代码如下:
#include"
windows.h"
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))<
bindingstreamsocket"
/*找出指定的端口号并打印出来*/
length=sizeof(server);
if(getsockname(sock,(structsockaddr*)&
server,&
length)<
gettingsocketname"
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)
{
readingstreammessage"
intk=GetLastError();
}
if(rval==0)
printf("
endingconnection\n"
else
-->
%s\n"
buf);
}while(rval!
=0);
closesocket(msgsock);
}while(TRUE);
/*因为这个程序已经有了一个无限循环,所以套接字"
sock"
从来不显式关闭。
然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。
*/
exit(0);
(2)客户端实现
#defineDATA"
halfaleague,halfaleague..."
/*这个程序建立套接字,然后与命令行给出的套接字连接;
连接结束时,在连接上发送
一个消息,然后关闭套接字。
streamc主机名端口号
端口号要与服务器程序的端口号相同*/
main(intargc,char*argv[])
intsock;
structhostent*hp;
WSADATAWSADAtA;
/*使用命令行中指定的名字连接套接字*/
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);
if(connect(sock,(structsockaddr*)&
connectingstreamsocket"
exit(3);
while
(1)
if(send(sock,DATA,sizeof(DATA),0)<
sendingonstreamsocket"
);
Sleep(200);
(3)运行服务器和客户机,这两个程序是一组自收自发形式的TCP收发程序
这组C/S程序是自发自收程序,利用的是设置好的5656端口,运行的结果如上所示,这组程序验证了TCP协议的运作机制,运用套接字socket的编程打开一个端口对应的接受客户机所要求的响应。
实验四网络协议分析实验
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实用程序将向用户提供所有当前的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名称。
“已注册”表