本文档为《计算机网络》课程中的实验指导书,重点介绍如何编写用于捕获和分析IP数据包的程序。通过实践操作,加深学生对TCP/IP协议栈的理解与应用能力。
计算机网络实验二:IP 数据包捕获程序设计
本实验的目的是让学生将所学知识应用于实际操作,并深入掌握 IP 数据报格式、理解 IP 协议的工作原理及工作过程,同时具备捕捉并分析 IP 等数据报的能力。通过实践探索来提升编程技巧。
**环境要求**
- 操作系统:Windows
- 编程语言:C++
- 必要软件:Visual C++
**实验任务**
1. 设计图形化界面程序,允许用户输入需捕获的数据包数量,并输出每个数据包的相关字段值(包括版本、总长度、标志位、片偏移量、协议类型及源地址与目的地址)。
2. 遵循 RFC791 的 IP 协议规范,能够捕捉通过本地网卡传输的 IP 数据包。
3. 通过点击“Capture”按钮实现指定数量数据包的捕获过程。
4. 编写清晰、整洁且注释详尽的代码。
5. 提供详细的文档说明程序的设计思路、工作流程及解决关键问题的方法。
**实验步骤**
1. 创建原始套接字:为获取通过本地网卡传输的所有 IP 数据包,需使用原始套接字进行通信。首先调用 socket()函数创建一个 SOCK_RAW 类型的原始套接字并绑定到指定的网络接口上;随后利用 setsockopt()设置接收超时时间为5000ms。
2. 定义IP头部的数据结构:根据 RFC791 规范定义 IP 数据包中头部的具体格式,包括版本、服务类型、总长度等字段信息。
3. 接收并解析数据包:使用 ioctlsocket()函数将网卡设置为混杂模式以接收所有经过的网络流量;接着调用 recv() 函数读取通过网卡的数据流,并对捕获到的 IP 包头部进行解析,提取需要的信息。
**相关知识点**
- IP 协议
- IP 数据包结构
- 原始套接字操作(如 socket(), bind(), setsockopt(), ioctlsocket())
- 接收函数(recv())
- 版本、总长度、标志位等IP头部字段的含义