网络实验报告.docx
《网络实验报告.docx》由会员分享,可在线阅读,更多相关《网络实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
网络实验报告
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名称。
“已注册”表