资源描述
计算机网络与通信实习报告
设 计 题 目 编写程序,从IP数据报头中抽出源和目的地址,并用点分十进制表示输出
学生专业班级 通信工程2007级2班
学生姓名(学号)
指 导 教 师
完 成 时 间 2010年5月20日
实 习(设计)地点 信息学院机房
2010 年5月20日
实习题目:
编写一个计算机程序,从IP数据报包头中抽出源和目的IP地址,将它们以点分十进制的形式表示出
原理概述:
IP协议特点:
IP协议位于网络层,是因特网的核心协议,除了ARP和RARP报文外,几乎所有的数据都要经过IP协议进行发送。由于IP协议在网络层中具有重要地位,人们又将TCP/IP协议的网络层称为IP层。
IP协议是不可靠的无连接数据报协议,提高尽力而为的传输服务,具有一下特点:
① 是点对点协议,虽然IP数据报携带源IP和目的IP地址,但进行数据传输时的对等实体一定相邻设备(同一网络中)的对等实体。
② IP协议不保证传输的可靠性,不对数据进行差错校验和跟踪,可靠性有IP的上层TCP协议加以保证。
③ IP协议提供无连接数据报服务,各个数据报独立传输,可能沿着不同路径到达目的地,也可能不按序到达目的地。
正因为IP协议采用尽力传输的思想,所以IP协议的效率非常高,实现也简单。IP层向下要面对各种不同的物理网络,向上却提供一个同一的数据传输服务。通过IP数据报实现了物理数据帧的同一,IP层达到了向上屏蔽底层差异的目的。
IP数据报
IP协议所处理的数据单元称为IP数据报。其格式如下:
IP数据报由首部和数据两部分组成,首部又分为定长部分和变长部分。
◆ 版本(VER):4位,表示数据报的IP协议版本,当前的IP协议版本号为4,即IPv4;下一代网络协议IPv6,版本号为6.
◆首部长度(HLEN):4位,表示以字长(4字节)为单位的数据报首部长度。
◆服务类型(SERVICE TYPE): 8位,规定本数据报的处理方式。前三位是优先级,0-7,0表示最低,7最高(最重要),但目前的IPv4没有使用优先级。后4位是TOS,表示本数据报在传输过程中所希望得到的服务,D--最小延迟(minimize delay);T--最大吞吐率(maximize throughout);R--最高可靠性(maximize reliability);C--最低成本(minimize cost)。
值得注意的有2点:
①服务类型代表用户的希望,并不具有强制性,目前许多设备TCP/IP中不支持服务类型特性。
②在D、T、R、C这4个参数中只能设置其中一个。
◆ 数据报总长度: 在IP数据报封装到以太网帧中进行传输时很有用.
◆ 标识(IDENTIFICATION):16位每个IP数据报都有一个本地唯一的标识符,它由信源机赋予IP数据报。每次自动加1.
◆ 标志(FLAGS):3位,表示该IP数据报是否允许分片以及是否最后一片。
◆ 片偏移(FRAGMENTATION OFFSET):表示本片数据在他所属原始数据报数据区的偏移量。
◆ 生存时间(time to live,TTL): 8位,
◆ 协议(PROTOCOL):8位,指明被IP数据报封装的协议:ICMP=1,IGMP=2,TCP=6,EGP=8,UDP=17,OSPF=89.
◆首部校验和(HEADER CHECKSUM):16位,保证首部数据完整性。
◆ 源IP地址(SOURCE ADDRESS):32位(IPv4中),发送方源地址。
◆ 目的地址(DESTINATION ADDRESS): 32位(IPv4中),最总接收方IP地址。
◆ IP选项(IP OPTIONS):变长字段,传输数据报时的附加功能。
本实验的功能主要是实现将32位的二进制表示成十进制数
编程原理:
用C语言里的随机数生成指令生成32位的二进制数,作为源操作数,再生成32位二进制数作为目的操作数,用编程实现将二进制数转化成十进制数,以点分的形式输出在屏幕上
流程图:
随机数生成
i=0
2的i次幂乘以a[i]
输出次数>4?
i=i+1
输出十进制数
i的个数>8?
输出源或目的ip地址
Y
N
Y
N
结束
开始
编程程序:
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
void getid(int ad[32])
{
int p=0,q=0,r=0,t=0;
int i;
for(i=0;i<8;i++)
{p+=pow(2,7-i%8)*ad[i];} ;将低八位二进制数转化为十进制数
printf("%d.",p);
for(i=8;i<16;i++)
{q+=pow(2,7-i%8)*ad[i];}
printf("%d.",q);
for(i=16;i<24;i++)
{r+=pow(2,7-i%8)*ad[i];}
printf("%d.",r);
for(i=24;i<32;i++) ;将高八位二进制数转化为十进制
{t+=pow(2,7-i%8)*ad[i];}
printf("%d",t);
}
void main()
{
int a[65];
int i,j;
int m=0,n=0;
int b[32];
int c[32];
void getid(int ad[32]);
srand((unsigned) time(NULL));
for(i=0;i<65;i++)
{
a[i]=rand()%2;
printf("%d",a[i]); ;随机数的生成
}
for(j=0;j<=31;j++)
{b[m]=a[j];
m++;}
for(j=32;j<=64;j++)
{c[n]=a[j];
n++;}
printf("\n源地址是:");
getid(b);
printf("\n目的地址是:");
getid(c);
}
运行结果:
实习心得和体会:
本次实习,其目的是将以前所学的计算机网络理论知识上升为实践,在编程的基础上进一步了解计算机通信交流以及组网的方法,实践就要求对知识的掌握更加的系统化。在实习之初,仔细的查找了相关的资料,了解与本实习有关的知识,对IP数据报报头的格式更进一步的复习和掌握,并查找最前沿的资料充实自己,力求将自己的实习做得的更加全面,在实习的准备过程中了解到,在实际的网络管理中大多使用的sniffer软件对流经网络的数据进行抓取和处理以及分析的过程也可以通过软件的设置将所需数据显示在终端上,本实验所要求处理的任务是将IP数据报报头中的源和目的IP地址以点分十进制的形式输出,程序的实现比较简单,结合以前C语言的基础和编程方法使用随机数生成指令,以及调用C语言库函数实现将二进制的源和目的IP地址转化为点分十进制。
在实验过程中曾试图使用套接字编程实现数据包的抓取,然后使用解析程序分析数据报的报头,但是在具体的实现过程中由于现在使用的VC++平台不包含mstcpip.h库文件,所以程序没有得到验证,但也在思考和设计的过程中学到了很多知识。
参考书目:
[1] 谢希仁 《计算机网络》(第5版) 电子工业出版社 2008
[2] 殷肖川 《网络编程与开发技术》 西安交通大学出版社 2003
课程设计成绩评定表
学生姓名
专业班级
设计题目
编写计算机程序,从IP数据报头中抽出源和目的地址,将它们一点分十进制表示输出。
指导教师评语及意见:
指导教师评阅成绩: 指导教师签字:
年 月 日
展开阅读全文