ip数据报解析源地址目的地址(2)

2018-12-03 19:34

计算机网络课程设计

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(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCP、UDP、ICMP还有IGMP。然后是校验和,只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。选项字段的解释从略。

四、 设计方案改进及建议

首先理解点分十进制表示方法的运用,理解IP数据报的格式,利用C语言设计程序以点分十进制表示输出IP数据报头源/目的地址。

从网络抓取数据包作为源操作数,再生成32位二进制数作为目的操作数,用编程实现将二进制数转化成十进制数,以点分的形式输出在屏幕上。

五、 总结体会

通过本次课程设计,让我学到了很多。经过实习,通过实际操作,对计算机网络加深了理解。才知道计算机网络的可以应用的很灵活,而且加深了对IP数据报格式的了解,点分十进制理解,而且对于C语言也进行了巩固。

在实习中并不是一番风顺的,但是经过努力最终解决了这些困难,让我认识到了坚持的重要性。总的来说通过实习是我收获不小,也让我认识到了认真学习知识的重要性。希望学校以后多提供这样的机会。

本次实习,其目的是将以前所学的计算机网络理论知识上升为实践,在编程的基础上进一步了解计算机通信交流以及组网的方法,实践就要求对知识的掌握更加的系统化。在实习之初,仔细的查找了相关的资料,了解与本实习有关的知识,对IP数据报

- 5 -

计算机网络课程设计

报头的格式更进一步的复习和掌握,并查找最前沿的资料充实自己,力求将自己的实习做得的更加全面,在实习的准备过程中了解到,在实际的网络管理中大多使用的sniffer软件对流经网络的数据进行抓取和处理以及分析的过程也可以通过软件的设置将所需数据显示在终端上,本实验所要求处理的任务是将IP数据报报头中的源和目的IP地址以点分十进制的形式输出,程序的实现比较简单,结合以前C语言的基础和编程方法使用随机数生成指令,以及调用C语言库函数实现将二进制的源和目的IP地址转化为点分十进制。

在实验过程中曾试图使用套接字编程实现数据包的抓取,然后使用解析程序分析数据报的报头,但是在具体的实现过程中由于现在使用的VC++平台不包含mstcpip.h库文件,所以程序没有得到验证,但也在思考和设计的过程中学到了很多知识。

六、 主要参考文献

[1] 谢希仁 《计算机网络》(第5版) 电子工业出版社 2008 [2] 殷肖川 《网络编程与开发技术》 西安交通大学出版社 2003

七、 附录

附录1 程序流程图

开始 构造程序运行环境,生成输出创建原始套接字,并初始化 捕获IP数据包 解析IP包 输出IP包信息 退出? Y END N - 6 - 计算机网络课程设计

图7-1 程序流程图

附录2 程序源代码及解释

#include \#include \#include \#include \

#pragma comment(lib,\

typedef struct _IP_HEADER //定义IP头 {

union {

BYTE Version; //版本(前4位) BYTE HdrLen; //IHL(后4位),报头标长 };

BYTE ServiceType; //服务类型 WORD TotalLen; //总长 WORD ID; //标识 union {

WORD Flags; //标志(前3位)

WORD FragOff; //分段偏移(后13位) };

BYTE TimeToLive; //生命期 BYTE Protocol; //协议

WORD HdrChksum; //头校验和 DWORD SrcAddr; //源地址 DWORD DstAddr; //目的地址 BYTE Options; //选项 }IP_HEADER;

//逐位解析IP头中的信息

void getVersion(BYTE b, BYTE & version) { version=b>>4; //右移4位,获取版本字段 }

void getIHL(BYTE b,BYTE & result) {

result=(b&0x0f)*4; //获取头部长度字段 }

char * parseServiceType_getProcedence(BYTE b) {

- 7 -

计算机网络课程设计

switch(b>>5) //获取服务类型字段中优先级子域 { case 7: return \ break; case 6: return \ break; case 5: return \ break; case 4: return \ break; case 3: return \ break; case 2: return \ break; case 1: return \ break; case 0: return \ break; default: return \ break; } }

char * parseServiceType_getTOS(BYTE b) { b=(b>>1)&0x0f; //获取服务类型字段中的TOS子域 switch(b) { case 0: return \ break; case 1: return \ break; case 2: return \

- 8 -

计算机网络课程设计

break; case 4: return \ break; case 8: return \ break; case 15: return \ break; default: return \ } }

void getFlags(WORD w,BYTE & DF,BYTE & MF) //解析标志字段 { DF=(w>>14)&0x01; MF=(w>>13)&0x01; }

void getFragOff(WORD w,WORD & fragOff) //获取分段偏移字段 { fragOff=w&0x1fff; }

char * getProtocol(BYTE Protocol) //获取协议字段共8位 { switch(Protocol) //以下为协议号说明: { case 1: return \ case 2: return \ case 4: return \ case 6: return \ case 8: return \ case 17: return \ case 41: return \ case 46: return \ case 89:

- 9 -


ip数据报解析源地址目的地址(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:六年级上册数学基础知识测试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: