ip数据报解析源地址目的地址.docx
- 文档编号:16058764
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:18
- 大小:162.63KB
ip数据报解析源地址目的地址.docx
《ip数据报解析源地址目的地址.docx》由会员分享,可在线阅读,更多相关《ip数据报解析源地址目的地址.docx(18页珍藏版)》请在冰点文库上搜索。
ip数据报解析源地址目的地址
青岛农业大学
理学与信息科学学院
计算机网络综合实习报告
题目IP数据报解析源地址/目的地址
专业计算机科学与技术
学号
姓名
指导教师
日期2014年11月8日
一、设计任务和目的-2-
二、设计要求-2-
三、设计容-2-
3.1原理概述:
-2-
3.1.1点分十进制表示法:
-2-
3.1.2IP数据报格式:
-2-
3.2运行结果及分析-4-
3.2.1程序运行及截图-4-
3.2.2分析-5-
四、设计方案改进及建议-5-
五、总结体会-5-
六、主要参考文献-6-
七、附录-7-
附录1程序流程图-7-
附录2程序源代码及解释-7-
一、设计任务和目的
设计一个解析IP数据包的程序,并根据这个程序,从IP数据报头中解析出源地址和目的地址等相关问题,从而对IP层的工作原理有更好的理解和认识。
通过实际操作,加深对计算机网络的理解,了解计算机网络应用的灵活性,加深对IP数据报格式的了解,点分十进制理解,巩固所学习的C语言。
二、设计要求
编写计算机程序,从网络捕获数据包,从IP数据报头中解析出源地址和目的地址,将它们以点分十进制形式输出。
三、设计容
3.1原理概述:
3.1.1点分十进制表示法:
对主机或路由器来说,ip地址都是32位的二进制代码,为了提高可读性,我们常常把32位的ip地址中的每8位用其等效的十进制数字表示,并且在这些数字之间加上一个点,这就叫做点分十进制表示法(dotteddecimalnotation)。
例如:
一个ip地址:
100000000000010110000001100011111用点分十进制表示为:
128.11.3.31读起来要方便得多。
3.1.2IP数据报格式:
IP协议所处理的数据单元称为IP数据报。
其格式如下:
图3-1数据报格式图[1]
IP数据报由首部和数据两部分组成,首部又分为定长部分和变长部分。
◆版本(VER):
4位,表示数据报的IP协议版本,当前的IP协议版本号为4,即IPv4;下一代网络协议IPv6,版本号为6.
◆首部长度(HLEN):
4位,表示以字长(4字节)为单位的数据报首部长度。
◆服务类型(SERVICETYPE):
8位,规定本数据报的处理方式。
前三位是优先级,0-7,0表示最低,7最高(最重要),但目前的IPv4没有使用优先级。
后4位是TOS,表示本数据报在传输过程中所希望得到的服务,D--最小延迟(minimizedelay);T--最大吞吐率(maximizethroughout);R--最高可靠性(maximizereliability);C--最低成本(minimizecost)。
值得注意的有2点:
①服务类型代表用户的希望,并不具有强制性,目前许多设备TCP/IP中不支持服务类型特性。
②在D、T、R、C这4个参数中只能设置其中一个。
◆数据报总长度:
在IP数据报封装到以太网帧中进行传输时很有用.
◆标识(IDENTIFICATION):
16位每个IP数据报都有一个本地唯一的标识符,它由信源机赋予IP数据报。
每次自动加1.
◆标志(FLAGS):
3位,表示该IP数据报是否允许分片以及是否最后一片。
◆片偏移(FRAGMENTATIONOFFSET):
表示本片数据在他所属原始数据报数据区的偏移量。
◆生存时间(timetolive,TTL):
8位,
◆协议(PROTOCOL):
8位,指明被IP数据报封装的协议:
ICMP=1,IGMP=2,TCP=6,EGP=8,UDP=17,OSPF=89.
◆首部校验和(HEADERCHECKSUM):
16位,保证首部数据完整性。
◆源IP地址(SOURCEADDRESS):
32位(IPv4中),发送方源地址。
◆目的地址(DESTINATIONADDRESS):
32位(IPv4中),最总接收方IP地址。
◆IP选项(IPOPTIONS):
变长字段,传输数据报时的附加功能。
本实验的功能主要是实现将32位的二进制表示成十进制数
图3-2IP组成结构图[2]
3.2运行结果及分析
3.2.1程序运行及截图
图3-2-1程序运行图
图3-2-2运行结果图
3.2.2分析
IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。
对于IPv4,4位版本字段是4。
4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。
8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。
总长度是整个数据报(包括IP首部和IP层payload)的字节数。
每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。
3位标志和13位片偏移用于分片。
TTL(Timetolive)是这样用的:
源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。
协议字段指示上层协议是TCP、UDP、ICMP还有IGMP。
然后是校验和,只校验IP首部,数据的校验由更高层协议负责。
IPv4的IP地址长度为32位。
选项字段的解释从略。
四、设计方案改进及建议
首先理解点分十进制表示方法的运用,理解IP数据报的格式,利用C语言设计程序以点分十进制表示输出IP数据报头源/目的地址。
从网络抓取数据包作为源操作数,再生成32位二进制数作为目的操作数,用编程实现将二进制数转化成十进制数,以点分的形式输出在屏幕上。
五、总结体会
通过本次课程设计,让我学到了很多。
经过实习,通过实际操作,对计算机网络加深了理解。
才知道计算机网络的可以应用的很灵活,而且加深了对IP数据报格式的了解,点分十进制理解,而且对于C语言也进行了巩固。
在实习中并不是一番风顺的,但是经过努力最终解决了这些困难,让我认识到了坚持的重要性。
总的来说通过实习是我收获不小,也让我认识到了认真学习知识的重要性。
希望学校以后多提供这样的机会。
本次实习,其目的是将以前所学的计算机网络理论知识上升为实践,在编程的基础上进一步了解计算机通信交流以及组网的方法,实践就要求对知识的掌握更加的系统化。
在实习之初,仔细的查找了相关的资料,了解与本实习有关的知识,对IP数据报报头的格式更进一步的复习和掌握,并查找最前沿的资料充实自己,力求将自己的实习做得的更加全面,在实习的准备过程中了解到,在实际的网络管理多使用的sniffer软件对流经网络的数据进行抓取和处理以及分析的过程也可以通过软件的设置将所需数据显示在终端上,本实验所要求处理的任务是将IP数据报报头中的源和目的IP地址以点分十进制的形式输出,程序的实现比较简单,结合以前C语言的基础和编程方法使用随机数生成指令,以及调用C语言库函数实现将二进制的源和目的IP地址转化为点分十进制。
在实验过程中曾试图使用套接字编程实现数据包的抓取,然后使用解析程序分析数据报的报头,但是在具体的实现过程中由于现在使用的VC++平台不包含mstcpip.h库文件,所以程序没有得到验证,但也在思考和设计的过程中学到了很多知识。
六、主要参考文献
[1]希仁《计算机网络》(第5版)电子工业2008
[2]殷肖川《网络编程与开发技术》交通大学2003
七、附录
附录1程序流程图
图7-1程序流程图
附录2程序源代码及解释
#include"winsock2.h"
#include"ws2tcpip.h"
#include"iostream.h"
#include"stdio.h"
#pragmacomment(lib,"ws2_32.lib")
typedefstruct_IP_HEADER//定义IP头
{
union
{
BYTEVersion;//版本(前4位)
BYTEHdrLen;//IHL(后4位),报头标长
};
BYTEServiceType;//服务类型
WORDTotalLen;//总长
WORDID;//标识
union
{
WORDFlags;//标志(前3位)
WORDFragOff;//分段偏移(后13位)
};
BYTETimeToLive;//生命期
BYTEProtocol;//协议
WORDHdrChksum;//头校验和
DWORDSrcAddr;//源地址
DWORDDstAddr;//目的地址
BYTEOptions;//选项
}IP_HEADER;
//逐位解析IP头中的信息
voidgetVersion(BYTEb,BYTE&version)
{
version=b>>4;//右移4位,获取版本字段
}
voidgetIHL(BYTEb,BYTE&result)
{
result=(b&0x0f)*4;//获取头部长度字段
}
char*parseServiceType_getProcedence(BYTEb)
{
switch(b>>5)//获取服务类型字段中优先级子域
{
case7:
return"NetworkControl";
break;
case6:
return"InternetworkControl";
break;
case5:
return"CRITIC/ECP";
break;
case4:
return"FlashOverride";
break;
case3:
return"Flsah";
break;
case2:
return"Immediate";
break;
case1:
return"Priority";
break;
case0:
return"Routine";
break;
default:
return"Unknow";
break;
}
}
char*parseServiceType_getTOS(BYTEb)
{
b=(b>>1)&0x0f;//获取服务类型字段中的TOS子域
switch(b)
{
case0:
return"Normalservice";
break;
case1:
return"Minimizemonetarycost";
break;
case2:
return"Maximizereliability";
break;
case4:
return"Maximizethroughput";
break;
case8:
return"Minimizedelay";
break;
case15:
return"Maximizesecurity";
break;
default:
return"Unknow";
}
}
voidgetFlags(WORDw,BYTE&DF,BYTE&MF)//解析标志字段
{
DF=(w>>14)&0x01;
MF=(w>>13)&0x01;
}
voidgetFragOff(WORDw,WORD&fragOff)//获取分段偏移字段
{
fragOff=w&0x1fff;
}
char*getProtocol(BYTEProtocol)//获取协议字段共8位
{
switch(Protocol)//以下为协议号说明:
{
case1:
return"ICMP";
case2:
return"IGMP";
case4:
return"IPinIP";
case6:
return"TCP";
case8:
return"EGP";
case17:
return"UDP";
case41:
return"IPv6";
case46:
return"RSVP";
case89:
return"OSPF";
default:
return"UNKNOW";
}
}
voidipparse(FILE*file,char*buffer)
{
IP_HEADERip=*(IP_HEADER*)buffer;//通过指针把缓冲区的容强制转化为IP_HEADER数据结构
fseek(file,0,SEEK_END);
BYTEversion;
getVersion(ip.Version,version);
fprintf(file,"版本号=%d\r\n",version);
BYTEheaderLen;
getIHL(ip.HdrLen,headerLen);
fprintf(file,"报头标长=%d(BYTE)\r\n",headerLen);
fprintf(file,"服务类型=%s,%s\r\n",
parseServiceType_getProcedence(ip.ServiceType),
parseServiceType_getTOS(ip.ServiceType));
fprintf(file,"总长度=%d(BYTE)\r\n",ip.TotalLen);
fprintf(file,"标识=%d\r\n",ip.ID);
BYTEDF,MF;
getFlags(ip.Flags,DF,MF);
fprintf(file,"标志DF=%d,MF=%d\r\n",DF,MF);
WORDfragOff;
getFragOff(ip.FragOff,fragOff);
fprintf(file,"分段偏移值=%d\r\n",fragOff);
fprintf(file,"生存期=%d(hopes)\r\n",ip.TimeToLive);
fprintf(file,"协议=%s\r\n",getProtocol(ip.Protocol));
fprintf(file,"头校验和=0x%0x\r\n",ip.HdrChksum);
fprintf(file,"源IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));
fprintf(file,"目的IP地址=%s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));
fprintf(file,"---------------------------------------------\r\n");
}
intmain(intargc,char*argv[])
{
if(argc!
=2)
{
printf("usageeror!
\n");
return-1;
}
FILE*file;
if((file=fopen(argv[1],"wb+"))==NULL)
{
printf("failtoopenfile%s",argv[1]);
return-1;
}
WSADATAwsData;
if(WSAStartup(MAKEWORD(2,2),&wsData)!
=0)
{
printf("WSAStartupfailed!
\n");
return-1;
}
//建立套接字
SOCKETsock;
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
{
printf("createsocketfailed!
\n");
return-1;
}
BOOLflag=TRUE;
//设置IP头操作选项,用户可对IP头处理
if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR)
{
printf("setsockoptfailed!
\n");
return-1;
}
charhostName[128];
if(gethostname(hostName,100)==SOCKET_ERROR)
{
printf("gethostnamefailed!
\n");
return-1;
}
//获取本地地址
hostent*pHostIP;
if((pHostIP=gethostbyname(hostName))==NULL)
{
printf("gethostnamefailed!
\n");
return-1;
}
//填充SOCKADDR_IN结构
sockaddr_inaddr_in;
addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(6000);
if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERROR)
{
printf("bindfailed!
\n");
return-1;
}//把socket绑定到本地网卡
DWORDdwValue=1;
//设置SOCK_RAW为SIO_RCVALL,能接收所有IP包
#defineIO_RCVALL_WSAIOW(IOC_VENDOR,1)
DWORDdwBufferLen[10];
DWORDdwBufferInLen=1;
DWORDdwBytesReturned=0;
if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ERROR)
{
printf("ioctlsocketfailed!
\n");
return-1;
}
//设置接受数据包缓冲区长度
#defineBUFFER_SIZE65535
charbuffer[BUFFER_SIZE];
//监听网卡
printf("开始解析经过本机的IP数据包:
\n");
while(true)
{
intsize=recv(sock,buffer,BUFFER_SIZE,0);
if(size>0)
{
ipparse(stdout,buffer);
ipparse(file,buffer);
}
}
fclose(file);
return0;
}
课程设计成绩评定表
学生
专业班级
设计题目
IP数据报解析源地址/目的地址
指导教师评语及意见:
指导教师评阅成绩:
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ip 数据 解析 源地 目的 地址