互联网实践及应用报告.docx
《互联网实践及应用报告.docx》由会员分享,可在线阅读,更多相关《互联网实践及应用报告.docx(38页珍藏版)》请在冰豆网上搜索。
互联网实践及应用报告
互联网技术及应用实践
实验报告
报告名称:
路由器配置及应用
路由追踪的实现
EMAIL的客户端程序
开发一个简单的WEB服务器
学生姓名:
学号:
指导教师:
实验一路由器配置及应用
1.实验原理
2.实验步骤
第一步:
在路由器Router1上配置快速以太网口的IP地址
Router1#configureterminal
Router1(config)#interfaceFastEthernet0/0!
进入以太网0口配置状态
或Router1(config)#interfaceFastEthernet1/0
Router1(config-if)#ipaddress172.16.1.1255.255.255.0!
为以太网0口配置地址
Router1(config-if)#noshutdown!
打开以太网0口
Router1(config-if)#end
第二步:
在路由器Router1上配置广域网口的IP地址和时钟频率(假设Router1为DCE端)
Router1#con
Router1(config)#interfaceserial2/0!
进入广域网0口配置状态
或Router1(config)#interfaceserial1/2
Router1(config-if)#ipaddress172.16.2.1255.255.255.0!
为广域网0口配置地址
Router1(config-if)#clockrate64000!
DCE端需设置端口时钟频率
Router1(config-if)#noshutdown!
打开广域网0口
Router1(config-if)#end
验证测试:
验证路由器接口配置状态。
Router1#showipinterfacebrief!
显示IP端口状态简况
InterfaceIP-AddressOK?
MethodStatusProtocol
FastEthernet0/0172.16.1.1/24YESmanualupup
FastEthernet0/1noaddressYESunsetadministrativelydowndown
Serial2/0172.16.2.1/24YESmanualupup
Serial3/0noaddressYESunsetadministrativelydowndown
Null0noaddressYESup
第三步:
为Router1添加静态路由
Router1#con
Router1(config)#iproute172.16.3.0255.255.255.0172.16.2.2!
添加静态路由
Router1(config)#end
Router1#showiproute!
显示路由表
Codes:
C-connected,S-static,R-RIP
O-OSPF,IA-OSPFinterarea
E1-OSPFexternaltype1,E2-OSPFexternaltype2
Gatewayoflastresortisnotset
172.16.0.0/24issubnetted,3subnets
C172.16.1.0isdirectlyconnected,FastEthernet0
C172.16.2.0isdirectlyconnected,Serial0
S172.16.3.0[1/0]via172.16.2.2
Router1#wr!
保存所作的修改
第四步:
在路由器Router2(R2624)上配置快速以太网口的IP地址
Router2#con
Router2(config)#interfacefastethernet0/0
或Router2(config)#interfacefastethernet1/0
Router2(config-if)#ipaddress172.16.3.2255.255.255.0
Router2(config-if)#noshutdown
Router2(config-if)#end
第五步:
在路由器Router2(R2624)上配置广域网口的IP地址
Router2#conf
Router2(config)#interfaceserial2/0
或Router2(config)#interfaceserial1/2
Router2(config-if)#ipaddress172.16.2.2255.255.255.0
Router2(config-if)#noshutdown
Router2(config-if)#end
Router2#showipinterfacebrief
InterfaceIP-AddressOK?
MethodStatusProtocol
FastEthernet0/0172.16.3.2YESmanualupup
FastEthernet0/1unassignedYESunsetadministrativelydowndown
Serial2/0172.16.2.2YESmanualupup
Serial3/0unassignedYESunsetadministrativelydowndown
图下图:
图1.1
第六步:
测试两台路由器之间的连通性
Router2#ping172.16.2.1
Typeescapesequencetoabort.
Sending5,100-byteICMPEchoesto172.16.2.1,timeoutis2seconds:
!
!
!
!
!
Successrateis100percent(5/5),round-tripmin/avg/max=1/1/4ms
如下图:
图1.2
第七步:
为Router2(R2624)添加静态路由
Router2#con
Configuringfromterminal,memory,ornetwork[terminal]?
Enterconfigurationcommands,oneperline.EndwithCNTL/Z.
Router2(config)#iproute172.16.1.0255.255.255.0172.16.2.1
Router2(config)#end
Router2#showiproute
Codes:
C-connected,S-static,R-RIP
O-OSPF,IA-OSPFinterarea
E1-OSPFexternaltype1,E2-OSPFexternaltype2
Gatewayoflastresortisnotset
172.16.0.0/24issubnetted,3subnets
S172.16.1.0[1/0]via172.16.2.1
C172.16.2.0isdirectlyconnected,Serial0
C172.16.3.0isdirectlyconnected,FastEthernet0
Router2#wr
如下图:
图1.3
第八步:
用ping命令对PC1,PC2进行连通性检测
如下图:
图1.4
注意事项:
(1)如果两台路由器经过串口直接相连,则必须在时钟一端设置时钟频率(DCE)。
(2)PC机必须配置默认网关。
实验二路由追踪
1.实验目的:
熟悉掌握路由器实现路由追踪,熟悉ICMP协议
2.实验环境:
MicrosoftVisualC++6.0
3.实验原理:
路由追踪是从源主机向目的主机发送一连串的IP数据报,数据包中封装的是无法交付的UDP数据报。
源主机先向目的主机发送一个回应请求报文(类型8),TTL设置为1,第一个路由器收到后将TTL设为1第一个路由器收到后将TTL减1,这样TTL变为0,分组被废除,同时路由器向源主机发送一个TTL超时报文(类型为11),报文的IP报头中的源IP地址就是第一个路由器的地址,源主机可以通过对该报文进行分析,得到第一个路由器的地址,接着发送TTL等于2的报文得到第二个路由器的地址,再发送TTL等于3的报文,如此下去直到收到目的主机的回应应答报文(类型为0)或不可到达报文(类型为3),或者到了最大跳数(要检测路由器个数的最大值)。
这样,源主机达到了自己的目的,因为这些路由器和最后的目的主机发送的ICMP报文正好给源主机想知道的路由信息——到达目的主机所经过的路由器的IP地址,以及到达其中每一个路由器的往返时间。
4.源代码如下:
#defineWIN32_LEAN_AND_MEAN
#include//使用原始套接字需要WinSock2的支持
#include//进行IPPROTO_IP级别设置时用到
#include
#include
#defineICMP_ECHO8//发送Ping请求时的ICMP报文类型
#defineICMP_ECHOREPLY0//接收Ping回复时的ICMP报文类型
#defineICMP_TIMEOUT11//ICMP超时报文类型
#defineICMP_MIN8//Minimum8-byteICMPpacket(header)
#defineMAX_PACKET1024//MaxICMPpacketsize
#defineDEICMP_PACKSIZE44//DefautICMPPACKETSIZE
charlpdest[16];//用来存放目的IP地址
DWORDcStartTickCount;//用来存放发送包的起始时间
#pragmacomment(lib,"ws2_32.lib")
typedefstruct_icmphdr//ICMP头部定义,被封装在IP包中
{
BYTEi_type;//报文类型
BYTEi_code;//代码
USHORTi_cksum;//校验和
USHORTi_id;//标识符
USHORTi_seq;//序号
}IcmpHeader;
//初始化ICMP头部
voidFillICMPData(char*icmp_data,intdatasize)
{
IcmpHeader*icmp_hdr=NULL;
char*datapart=NULL;
icmp_hdr=(IcmpHeader*)icmp_data;
icmp_hdr->i_type=ICMP_ECHO;//requestanICMPecho
icmp_hdr->i_code=0;
icmp_hdr->i_id=(USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum=0;
icmp_hdr->i_seq=0;
datapart=icmp_data+sizeof(IcmpHeader);
memset(datapart,'E',datasize-sizeof(IcmpHeader));
}
//校验和函数
USHORTchecksum(USHORT*buffer,intsize)
{
unsignedlongcksum=0;
while(size>1)
{
cksum+=*buffer++;
size-=sizeof(USHORT);
}
if(size)
cksum+=*(UCHAR*)buffer;
cksum=(cksum>>16)+(cksum&0xffff);
cksum+=(cksum>>16);
return(USHORT)(~cksum);;
}
intDecodeIPHeader(char*buf,intbytes,structsockaddr_in*from)
{
IcmpHeader*icmphdr=NULL;
DWORDtick;
staticinticmpcount=1;
unsignedshortiphdrlen;
//判断接收操作是否超时
if(!
buf)
{
printf("%2d:
***.***.***.***Requesttimedout.\n",icmpcount++);
return1;
}
tick=GetTickCount();
iphdrlen=(buf[0]&0x0f)*4;
icmphdr=(IcmpHeader*)(buf+iphdrlen);
if(bytes{
printf("Toofewbytesfrom%s\n",inet_ntoa(from->sin_addr));
return0;
}
//判断接收的ICMP报文是否为超时报文
if(icmphdr->i_type==ICMP_TIMEOUT&&icmphdr->i_code==0)
{
printf("%2d:
%-15s%4dms\n",icmpcount++,inet_ntoa(from->sin_addr),tick-cStartTickCount);
return0;
}
//判断接收的ICMP报文是否为回复报文
elseif(icmphdr->i_type==ICMP_ECHOREPLY&&icmphdr->i_id==GetCurrentProcessId())
{
printf("%2d:
%-15s%4dms\n",icmpcount++,inet_ntoa(from->sin_addr),tick-cStartTickCount);
printf("Tracecomplete!
\n");
return1;
}
//其他类型,表示不可达
else
{
printf("%2d:
Destinationhostisunreachable!
\n",icmpcount++);
return1;
}
}
intmain()
{
WSADATAwsaData;
SOCKETsockRaw=INVALID_SOCKET;
structsockaddr_indest,
from;
inti,bread,fromlen=sizeof(from),timeout=1000,ret;
structhostent*hp=NULL;
char*icmp_data=NULL,*recvbuf=NULL;
USHORTseq_no=0;
printf("DestinationAddress(IP/Hostname):
");
scanf("%s",lpdest);
if(WSAStartup(MAKEWORD(2,2),&wsaData)!
=0)
{
printf("WSAStartup()failed:
%d\n",GetLastError());
return-1;
}
//创建套接字
sockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
if(sockRaw==INVALID_SOCKET)
{
printf("WSASocket()failed:
%d\n",WSAGetLastError());
return-1;
}
//对锁定套接字设置超时
bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
if(bread==SOCKET_ERROR)
{
printf("setsockopt(SO_RCVTIMEO)failed:
%d\n",WSAGetLastError());
return-1;
}
timeout=1000;
bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));
if(bread==SOCKET_ERROR)
{
printf("setsockopt(SO_SNDTIMEO)failed:
%d\n",WSAGetLastError());
return-1;
}
//解析目标地址,将主机名转化为IP地址
memset(&dest,0,sizeof(dest));
dest.sin_family=AF_INET;
if((dest.sin_addr.S_un.S_addr=inet_addr(lpdest))==INADDR_NONE)
{
if((hp=gethostbyname(lpdest))!
=NULL)
{
memcpy(&(dest.sin_addr.S_un.S_addr),hp->h_addr_list[0],hp->h_length);
dest.sin_family=hp->h_addrtype;
printf("dest.sin_addr=%s\n",inet_ntoa(dest.sin_addr));
}
else
{
printf("gethostbyname()failed:
%d\n",WSAGetLastError());
return-1;
}
}
//CreatetheICMPpakcet
icmp_data=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);
recvbuf=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET);
if(!
icmp_data)
{
printf("HeapAlloc()failed:
%d\n",GetLastError());
return-1;
}
memset(icmp_data,0,MAX_PACKET);
FillICMPData(icmp_data,DEICMP_PACKSIZE);
printf("HopIPAddressTimeelapsed\n");
//开始发送/接收ICMP报文
for(i=1;i<=255;i++)
{
intbwrote;
//设置IP包的生存期
ret=setsockopt(sockRaw,IPPROTO_IP,IP_TTL,(char*)&i,sizeof(int));
if(ret==SOCKET_ERROR)
{
printf("setsockopt(IP_TTL)failed:
%d\n",WSAGetLastError());
}
((IcmpHeader*)icmp_data)->i_cksum=0;
((IcmpHeader*)icmp_data)->i_seq=seq_no++;//SequencenumberofICMPpackets
((IcmpHeader*)icmp_data)->i_cksum=checksum((USHORT*)icmp_data,DEICMP_PACKSIZE);
//发送ICMP包请求查询
cStartTickCount=GetTickCount();
bwrote=sendto(sockRaw,icmp_data,DEICMP_PACKSIZE,0,(structsockaddr*)&dest,sizeof(dest));
if(bwrote==SOCKET_ERROR)
{
if(WSAGetLastError()==WSAETIMEDOUT)
{
printf("timedout\n");
continue;
}
printf("sendto()failed:
%d\n",WSAGetLastError());
return-1;
}
if(bwrote{
printf("Wrote%dbytes\n",bwrote);
}
//接收ICMP回复包
bread=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(structsockaddr*)&from,&fromlen);
if(bread==SOCKET_ERROR)
{
if(WSAGetLastError()==WSAETIMEDOUT)
{
DecodeIPHeader(NULL,0,NULL);
continue;
}
printf("recvfrom()failed:
%d\n",WSAGetLastError());
return-1;
}
if(DecodeIPHeader(recvbuf,bread,&from))
break;
Sleep(1000);
}
system("pause");
if(sockRaw!
=INVALID_SOCKET)
closesocket(sockRaw);
HeapFree(GetProcessHeap(),0,recvbuf);
HeapFree(GetProcessHeap(),0,icmp_data);
WSACleanup();
return0;
}
5.实验结果如图:
实验三EMAIL的客户端程序
1.代码如下: