IP数据包的捕获与分析设计报告_第1页
IP数据包的捕获与分析设计报告_第2页
IP数据包的捕获与分析设计报告_第3页
IP数据包的捕获与分析设计报告_第4页
IP数据包的捕获与分析设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 CENTRAL SOUTH UNIVERSITY 计计算算机机网网络络课课程程设设计计报报告告 题 目 IP 数据包的捕获与分析 学生姓名 胡 壮 班级学号 计科 1106 班 0909112924 指导教师 穆 帅 设计时间 2014 年 1 月 2 目录 第一章 绪论 3 1 1 课题研究的意义 3 1 2 捕获数据包的常用方法 3 第二章 系统需求分析 4 2 1 课程设计题目与要求 4 2 2 IP 数据包格式 6 2 3 程序流程图 7 2 4 实验环境 9 第三章 系统总体框架 9 3 1 套接字模块 9 3 2 IP 数据包的捕获模块 9 3 3 IP 数据包分析模块 9 3 4 输出模块 9 第四章 详细设计与实现 10 4 1 数据结构的定义 10 4 2 初始化工作 11 4 3 套接字的创建和设置 12 4 4 数据包的捕获与分析 13 4 5 信息的输出 14 第五章 程序运行结果与分析 15 5 1 程序运行结果截图 15 5 2 程序中有待改进的地方 16 第六章 总结 17 参考文献 17 附 录 18 3 第一章 绪论 现如今 计算机网络已经彻彻底底地改变了人们的生活 大量的数据都是经过 计算机网络传输的 而 TCP IP 协议是计算机网络中最重要的协议之一 计算机网 络中绝大多数数据都是以 IP 数据包的形式发送和接受的 所以 IP 数据包的捕获是 很多计算机安全技术的基础 1 1 课题研究的意义 计算机之间进行通信时 交互的所有信息都封装在数据包中 因此 通过采集 网络数据并对其进行相应的分析 可以清楚地了解到进行通信的计算机的通信目的 首先 分析采集到的数据包 可以确定网络是否受到攻击入侵 其次 也可以使用 采集到的数据包来分析网络应用程序可能出现的问题的原因 此外 通过网络数据 采集和统计可以清楚的了解整个网络在各个时段内的网络负载情况 从而判断网络 使用得是否合理 除了以上谈到的几个方面以外 数据包采集分析还有其他很多用 途 在研究 IPv4 网络的同时 我们还对 IPv6 协议进行了初步的研究并通过对数据 报的分析 了解了在不同网络环境下 IPv6 数据包的封装格式以及在网络中的传输 路径 目前 在同一子网范围内 可以通过邻居计算机发现协议自动配置主机的本 地一链路 IPv6 地址 并获取子网内其他主机的通信地址 通过该地址可以实现子 网内的主机间纯 IPv6 环境下的通信 但由于现在整个因特网并不支持 IM 协议 因 此 IPv6 数据包要在网间传输 必须通过基于双协议栈的 IPv4 隧道 Tunnel 技术 将 EM 数据报封装在 IPv4 包头中 并通过指定的支持 IM 协议的路由在 Internet 中 传送到目的地 再由目的主机进行数据报解析 获取 IPv6 数据报中的信息 1 2 捕获数据包的常用方法 目前常用的捕获数据包的方法有原始套接字 LibPcap WinPcap 和 JPcap 等方 法 它们各有特点 实现起来有难有易 如何选择取决于具体需求与程序员的喜好 下面分别对它们作简单介绍 套接字是网络应用编程接口 应用程序可以使用它进行网络通信而不需要知道 底层发生的细节 有时需要自己生成一些定制的数据包或者功能并希望绕开 Socket 提供的功能 原始套接字 RawSocket 满足了这样的要求 原始套接字能够生成自己 的数据报文 包括报头和数据报本身的内容 通过原始套接字 可以更加自如地控制 Windows 下的多种协议 而且能够对网络底层的传输机制进行控制 4 LibPcap 是一种与系统无关 采用分组捕获机制的分组捕获函数库 用于访问数 据链路层 它在不同的平台上采用统一的编程接口 使用 LibPcap 编写的程序可自由 的跨平台使用 同时 LibPcap 是一个独立于系统接口的用户级的抓包库 它为底层 网络监听提供了可移植框架 它的应用包括网络统计集合 安全监听 网络调试等 WinPcap 是一个基于 Win32 的捕获数据包和网络分析的体系结构 它包括一个内 核级的包过滤器 一个底层的动态链接库 Packet dll 一个高层并且与系统无关的 库 WPcap dll 基于 LibPcap0 6 2 版本 WinPcap 是集成于 Windows 95 98 ME NT 2000 和 XP 操作系统的设备驱动程序 它可以从网卡捕获或者发送原始数据 同 时能够过滤并且存储数据包 JPcap 是一个能够捕获 发送网络数据包的 Java 类库包 这个包用到了 LibPcap 和原始套接字 API JPcap 支持 Ethernet IPv4 IPv6 ARP RARP TCP UDP ICMPv4 协议 JPcap 是一个 Java 类集合 它为网络数据包的捕获提供接口和 系统支持 其最初版本是 2000 年 6 月发布的 JPcap0 01 版 此后几经修改 到 2003 年 4 月发布了最新的 JPcap0 4 版 第二章 系统需求分析 2 1 课程设计题目与要求 本次实验的要求在网络环境 使用 VC 编写程序实现捕获网络中的 IP 数据包 解析数据包的内容 将结果显示在标准输出上 并同时写入日志文件 程序的具体要求如下 l 以命令行形式运行 ipparse logfile 其中 ipparse 是程序名 而 logfile 则代表记录结果的日志文件 2 在标准输出和日志文件中写入捕获的 IP 包的版本 头长度 服务类型 数 据包总长度 数据包标识 分段标志 分段偏移值 生存时间 上层协议类型 头 校验和 源 IP 地址和目的 IP 地址等内容 3 当程序接收到键盘输入 Ctrl C 时退出 2 2 IP 数据包格式 5 只有先了解 IP 数据包的格式 才能对 IP 数据包进行解析 下图是 IP 数据包 的格式 IP 数据包由首部和数据两部分组成 首部的前一部分是固定长度 共 20 字节 是所有 IP 数据报必须具有的 在首部的固定部分的后面是一些可选字段 其长度 是可变的 可选字段之后是数据部分 其中 首部固定部分中的各字段的长度及意 义如下 1 1 版本版本 占 4 位 指 IP 协议的版本 通信双方使用的 IP 协议版本必须一致 目前广泛使用的 IP 协议版本号为 4 即 IPv4 关于 IPv6 目前还处于草案阶段 2 2 首部长度首部长度 占 4 位 可表示的最大十进制数值是 15 请注意 这个字段所 表示数的单位是 32 位字长 1 个 32 位字长是 4 字节 因此 当 IP 的首部长度为 1111 时 即十进制的 15 首部长度就达到 60 字节 当 IP 分组的首部长度不是 4 字节的整数倍时 必须利用最后的填充字段加以填充 因此数据部分永远在 4 字节 的整数倍开始 这样在实现 IP 协议时较为方便 首部长度限制为 60 字节的缺点是 有时可能不够用 但这样做是希望用户尽量减少开销 最常用的首部长度就是 20 字节 即首部长度为 0101 这时不使用任何选项 3 3 区分服务区分服务 占 8 位 用来获得更好的服务 这个字段在旧标准中叫做服务 类型 但实际上一直没有被使用过 1998 年 IETF 把这个字段改名为区分服务 DS Differentiated Services 只有在使用区分服务时 这个字段才起作用 4 4 总长度总长度 总长度指首部和数据之和的长度 单位为字节 总长度字段为 16 位 因此数据报的最大长度为 2 16 1 65535 字节 在 IP 层下面的每一种数据链路 层都有自己的帧格式 其中包括帧格式中的数据字段的最大长度 这称为最大传送 6 单元 MTU Maximum Transfer Unit 当一个数据报封装成链路层的帧时 此数据报 的总长度 即首部加上数据部分 一定不能超过下面的数据链路层的 MTU 值 5 5 标识标识 identification identification 占 16 位 IP 软件在存储器中维持一个计数器 每 产生一个数据报 计数器就加 1 并将此值赋给标识字段 但这个 标识 并不是 序号 因为 IP 是无连接服务 数据报不存在按序接收的问题 当数据报由于长度 超过网络的 MTU 而必须分片时 这个标识字段的值就被复制到所有的数据报的标识 字段中 相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的 数据报 6 6 标志标志 flag flag 占 3 位 但目前只有 2 位有意义 标志字段中的最低位记为 MF More Fragment MF 1 即表示后面 还有分片 的数据报 MF 0 表示这已是若干数据报片中的最后一个 标志字段中间的一位记为 DF Don t Fragment 意思是 不能分片 只有当 DF 0 时才允许分片 7 7 片偏移片偏移 占 13 位 片偏移指出 较长的分组在分片后 某片在原分组中的 相对位置 也就是说 相对用户数据字段的起点 该片从何处开始 片偏移以 8 个 字节为偏移单位 这就是说 每个分片的长度一定是 8 字节 64 位 的整数倍 8 8 生存时间生存时间 占 8 位 生存时间字段常用的的英文缩写是 TTL Time To Live 表明是数据报在网络中的寿命 由发出数据报的源点设置这个字段 其目的是防止 无法交付的数据报无限制地在因特网中兜圈子 因而白白消耗网络资源 最初的设 计是以秒作为 TTL 的单位 每经过一个路由器时 就把 TTL 减去数据报在路由器消 耗掉的一段时间 若数据报在路由器消耗的时间小于 1 秒 就把 TTL 值减 1 当 TTL 值为 0 时 就丢弃这个数据报 后来把 TTL 字段的功能改为 跳数限制 但名 称不变 路由器在转发数据报之前就把 TTL 值减 1 若 TTL 值减少到零 就丢弃这 个数据报 不再转发 因此 现在 TTL 的单位不再是秒 而是跳数 TTL 的意义是 指明数据报在网络中至多可经过多少个路由器 显然 数据报在网络上经过的路由 器的最大数值是 255 若把 TTL 的初始值设为 1 就表示这个数据报只能在本局域网 中传送 9 9 协议协议 占 8 位 协议字段指出此数据报携带的数据是使用何种协议 以便 使目的主机的 IP 层知道应将数据部分上交给哪个处理过程 10 10 首部检验和首部检验和 占 16 位 这个字段只检验数据报的首部 但不包括数据部 分 这是因为数据报每经过一个路由器 路由器都要重新计算一下首部检验和 一 些字段 如生存时间 标志 片偏移等都可能发生变化 不检验数据部分可减少 计算的工作量 11 11 源地址源地址 占 32 位 为发送方的 IP 地址 12 12 目的地址目的地址 占 32 位 为接收方的 IP 地址 7 2 3 程序流程图 通过对实验题目和要求的分析 画出程序流程图如下 8 开始 命令行参数正确 Y 加载 WinSock 动 态链接库成功 Y 创建原始套接字 设置套接字 解析 IP 数据包 接收到 Ctrl C N 结束 N N 捕获 IP 数据包 Y 9 2 4 实验环境 本实验采用 Windows 操作系统平台 利用 Windows 提供的 Windows Sockets API 实现 IP 数据包的捕获与分析 采用 WinSock 2 2 版本 编程语言选用 C 编 程工具采用 Visual Studio 2010 旗舰版 第三章 系统总体框架 整个系统可以分为四个模块 分别为套接字模块 捕获 IP 数据包模块 解析 IP 数据包模块和输出模块 下面分别作简要介绍 3 1 套接字模块 套接字模块主要包括原始套接字的创建和原始套接字的设置 此模块先创建一 个原始套接字 然后将此套接字绑定到一个本机的网络接口 再设置套接字使其能 捕获经过此网络接口的所有 IP 数据包 3 2 IP 数据包的捕获模块 此模块主要负责捕获 IP 数据包 然后将捕获的数据包提交给 IP 数据包解析模 块 此模块利用设置好的原始套接字捕获 IP 数据包 然后将数据包提交给解析模 块 直到键盘输入 ctrl c 时结束 3 3 IP 数据包分析模块 此模块主要负责对 IP 数据包进行分析 即根据 IP 数据包的格式把信息从捕获 到的 IP 数据包中提取出来 然后再提交给输出模块 3 4 输出模块 此模块负责输出 IP 数据包信息的输出 包括输出到标准输出和日志文件 10 第四章 详细设计与实现 4 1 数据结构的定义 本程序主要用到了两个数据结构 一个是 IP 头的结构体 一个是常用 IP 协议 号与协议名的映射 1 IP 头结构体 根据 IP 数据包的格式 定义 IP 头结构体如下 struct IPHead u char ihl 4 头长度 u char version 4 版本 u char tos 服务类型 u short len IP 包的总长度 u short id 标识 u short off 分段偏移量 u char ttl 生存期 u char protocol 协议 u short cksum 头校验和 struct in addr saddr 源 IP 地址 struct in addr daddr 目的 IP 地址 2 常用 IP 协议号与协议名的映射 为了通过协议号得到协议名 于是定义了一些常见的协议号与其协议 名的映射关系 如下 pair common ip make pair 1 ICMP make pair 2 IGMP make pair 3 GGP make pair 4 IP in IP 11 make pair 6 TCP make pair 8 EGP make pair 17 UDP make pair 35 IDPR make pair 45 IDRP make pair 46 RSVP make pair 47 GRE make pair 54 NHRP make pair 88 IGRP make pair 89 OSPF 常见的 IP 协议编号和名称 const map IP PROTOCOL common ip common ip 14 4 2 初始化工作 1 命令行参数检查 if argc 2 cerr 命令行参数错误 endl return 1 如果命令行参数的数目不是 2 的话 说明输入有误 需打印错误信息 然后退 出 2 初始化动态链接库 WSADATA wsa data if WSAStartup MAKEWORD 2 2 return 1 如果初始化失败 则退出程序 4 3 套接字的创建和设置 12 1 套接字的创建 创建一个原始套接字 用来捕获数据包 SOCKET s socket AF INET SOCK RAW IPPROTO IP if s INVALID SOCKET WSACleanup cerr socket error endl return 1 如果创建失败 则退出程序 2 绑定本机地址 将刚刚建立的套接字与本机 IP 地址绑定 struct sockaddr in hostaddr hostaddr sin family AF INET hostaddr sin port htons 0 hostaddr sin addr s addr gethostid if bind s sockaddr WSACleanup cerr bind error endl exit 1 WinSock 提供的 bind 函数用于将一个套接字与一个地址绑定 绑定 之后 原始套接字就能接收流经该 IP 地址所属网络接口的全部 IP 数据包 3 设置套接字为 SIO RCVALL DWORD in buffer 1 n returned int ret WSAIoctl s SIO RCVALL if ret 0 13 closesocket s WSACleanup cerr WSAIoctl error 0 IPHead lp iphead IPHead buf char buf 20 sprintf buf 02d 02d 02d 03d cur time wHour cur time wMinute cur time wSecond cur time wMilliseconds 输出到标准输出 cout 捕包时间 t buf endl output ip lp iphead cout cout endl endl 14 输出到文件 fout 捕包时间 t buf endl output ip lp iphead fout fout endl endl fout flush 其中 output ip 是一个自定义函数 该函数 将 lp iphead 所向的 IP 信息输 出到输出流 fout 4 5 信息的输出 信息的输出用函数 output ip 函数完成 其定义如下 将 IP 数据包信息输出到 out 流 ip iphead 为指向 IPHead 类型的指针 void output ip IPHead lp iphead ostream out 头长度 t t ihl 4 endl out 服务类型 t tos endl out 总长度 t t len endl out 标识 t t id off 15 u short DF lp iphead off 14 u short MF lp iphead off 13 out 标志位 t t unserved DF MF endl out 偏移量 t t off out 生存期 t t ttl endl out 协议 t t protocol map const iterator it IP PROTOCOL find lp iphead protocol 15 if it IP PROTOCOL end out second endl out 校验和 t t cksum endl out 源 IP 地址 t saddr endl out 目的 IP 地址 t daddr endl 第五章 程序运行结果与分析 5 1 程序运行结果截图 标准输出截图 日志文件截图 16 通过对大量输出数据的分析 发现程序的输出是正确的 5 2 程序中有待改进的地方 这个程序只能捕获 IPv4 数据包 不能捕获 IPv6 数据包 可以通过修改程序 让这个程序既能捕获 IPv4 数据包 又能捕获 IPv6 数据包 那么这个程序就会更加 的完善 还可以为这个程序设计一个图形用户界面 使程序更加美观 更加易于使用 还可以为程序增加一个功能 让程序能获取数据包中的内容 可就需要对各种 应用程协议进行解析 例如 TCP UDP 总之 只要多花点功夫 这个程序可以做的更好 第六章 总结 17 本次课程设计让我学会了很多的东西 其中 最值得一提的是 对 IP 协议 有了比较深入的了解 学习了 Windows socket 我选择的课题是 IP 数据包的捕获与分析 所以需要对 IP 数据包有非常深入的 了解 这次实验中 我把 IP 协议学了好多遍 知道了 IP 头中每一个字段的意思 对 IP 数据包的捕获 我使用的是原始套接字 在 Windows 操作系统中实现的 在做实验的过程中 我把 Windows socket 大概学了一遍 重点学习了其中的原始 套接字 在学习的过程中 对 OSI 七层模型有了更深的了解 对 Windows socket 的学习 让我对网络编程的基本方法和步骤有了一定的了解 相信这次的学习对我 以后网络编程的学习会很有帮助 我感觉 Windows socket 确实是一个很强大的工 具 但是由于是 C 语言的接口 用起来也有一些的繁琐 在学习 计算机网络 这门课程的时候 我感觉这门课一点意思都没有 全部 都是理论知识 感觉学了也没有一点用 但是 在做课程设计的时候 我才发现上 课学的那些理论知识也是非常有用的 如果没有那些理论知识的支撑 要完成这次 的课程设计 不知道还有花多少时间 所以 这次课程设计的经历有一次告诉我 理论和实际相结合是非常重要的 每个学期课程设计的这段时间都是我收获最多的一段时间 我享受这段时间 也感激这段时间 最后 感谢实验老师这两个星期的陪伴和指导 参考文献 1 Andrew S Tanenbaum David J Wetherall 计算机网络 第五版 M 北 京 清华大学出版社 2012 3 2 Bob Quinn Dave Shute Windows Sockets 网络编程 M 北京 机械工业出 版社 2012 8 3 MSDN TCP IP 原始套接字 us library windows desktop ms740548 v vs 85 aspx 附录 程序源代码 18 头文件 文件名 header h ifndef HEADER H define HEADER H include include include include include using namespace std int const MAX IP LEN 65535 pair common ip make pair 1 ICMP make pair 2 IGMP make pair 3 GGP make pair 4 IP in IP make pair 6 TCP make pair 8 EGP make pair 17 UDP make pair 35 IDPR make pair 45 IDRP make pair 46 RSVP make pair 47 GRE make pair 54 NHRP make pair 88 IGRP make pair 89 OSPF const map IP PROTOCOL common ip common ip 14 常见的 IP 协议编号和名称 struct IPHead 19 u char ihl 4 头长度 u char version 4 版本 u char tos 服务类型 u short len IP 包的总长度 u short id 标识 u short off 分段偏移量 u char ttl 生存期 u char protocol 协议 u short cksum 头校验和 struct in addr saddr 源 IP 地址 struct in addr daddr 目的 IP 地址 u long gethostid 获取本机地址 void output ip IPHead lp iphead std ostream 把 IP 信息输出 到流 out void set socket SOCKET s 设置套接字 endif 源文件 文件名 main cpp include include include include include header h pragma comment lib ws2 32 lib using namespace std int main int argc char argv 20 if argc 2 cerr 命令行参数错误 endl return 1 初始化 winsock 的动态链接库 WSADATA wsa data if WSAStartup MAKEWORD 2 2 return 1 建立一个原始套接字 SOCKET s socket AF INET SOCK RAW IPPROTO IP if s INVALID SOCKET WSACleanup cerr socket error endl return 1 设置套接字 set socket s 打开日志文件 ofstream fout argv 1 if fout cerr fout open error 0 IPHead lp iphead IPHead buf char buf 20 sprintf buf 02d 02d 02d 03d cur time wHour cur time wMinute cur time wSecond cur time wMilliseconds 输出到标准输出 cout 捕包时间 t buf endl output ip lp iphead cout cout endl endl 输出到文件 fout 捕包时间 t buf endl output ip lp iphead fout fout endl endl fout flush WSACleanup return 0 22 set socket 完成对原始套接字 s 的设置 以使 s 能接收到所用的 IP 数据包 void set socket SOCKET s 将 s 绑定到本机地址上 struct sockaddr in hostaddr hostaddr sin family AF INET hostaddr sin port htons 0 hostaddr si

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论