2022年网络协议分析课程设计IP协议 .pdf
郑州轻工业学院网络协议分析课程设计设计题目:解析IP 数据包姓名:院 (系) :专业班级:学号:指导教师:成绩:时间:2011 年 6 月 12 日至 2011年 6 月 17 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - 2 郑州轻工业学院课 程 设 计 任 务 书题目解析 IP 数据包专业、班级学号姓名程序在 Windows窗口环境下捕获IP 数据报,并解析出各个字段信息,显示在窗口中。选定本机 IP 后,程序捕获经过对应网卡的IP 数据报,根据 IP 数据报的结构, 拆分获得各字段的值, 显示在窗口上。 同时程序可以将捕获的所有数据信息导出到日志文件。参考资料:网络协议分析寇晓蕤罗军勇 蔡延荣 机械工业出版社完成期限:2011.6.13-2010.6.17 指 导教 师签 名:课程负责人签名:2010 年 6 月 17 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - 3 目录第一章引言 .41.1.关于题目 .41.1.1.题目要求 .41.1.2.选题背景 .41.2.关于编译软件.41.3.关于稳定性 .5第二章程序设计 .52.主要功能设计 .52.1.程序流程 .5第三章程序实现 .63.类设计声明 .63.1.RawSocket 类.73.2.EventArgs 类.73.3.Header 结构 .83.4.主要功能的实现 .83.4.1.程序界面 .83.4.2.获得主机IP .93.4.3.显示列表 . 103.4.4.详细信息 . 113.4.5.导出日志 . 12第四章程序测试 . 144.程序测试 . 14总结与体会 . 15附录:. 15名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - 4 第一章引言1.1. 关于题目1.1.1. 题目要求(1) 捕获网络中的IP 数据包,解析数据包的内容,显示结果,并将结果写入日志文件。(2) 显示的内容包括:捕获的 IP 包的版本、 头长度、 服务类型、 数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源 IP 地址和目的IP 地址等内容。(3) 设置停止标志,当程序接收到停止命令时即停止。1.1.2. 选题背景IP 数据包是网络协议学习过程中容易接触到的,选择这个题目一是为了将自己的所学知识加以运用,二是希望通过探索实践去实现题目,在实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。1.2. 关于编译软件本程序使用C#语言, Microsoft Visual Studio 2005 进行编译。 Visual Studio 是微软公司推出的开发环境,Visual Studio 可以用来创建 Windows 平台下的Windows 应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office 插件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 18 页 - - - - - - - - - 5 1.3. 关于稳定性经测试,本程序可以在windows 操作系统中稳定运行,较为稳定。要求至少安装.Net Framework 2.0 。第二章程序设计2. 主要功能设计根据分析,这个程序要实现如下几个功能,初始化、捕获数据包、显示、导出日志。其中捕获数据包是程序的核心部分,是后续操作的基础。程序结构如图2-1 所示。图 2-1 程序结构图2.1. 程序流程根据分析后的程序结构图设计出相应的流程图。内容主要包括初始化,获得主机 IP 列表,绑定Socket ,开始捕获数据,分析数据,显示数据项,导出日志文件,根据用户操作退出程序。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 18 页 - - - - - - - - - 6 图 2-2 流程图第三章程序实现3. 类设计声明根据程序的结构, 将程序需要实现的功能细化为相应的类属性和成员函数。程序有两个类,一个RawSocket 类,用于数据包相关捕获和处理。一个EventArgs 类,用于类间传递信息。同时还有一个公共结构体,对应IP 数据包的格式。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - 7 3.1. RawSocket类public class RawSocket private bool error_occurred;/ 是否产生错误public bool KeepRunning;/ 是否继续进行private static int len_receive_buf;/ 得到的数据流的长度byte receive_buf_bytes;/ 收到的字节private Socket socket = null; /声明套接字public void Run()/ 开始接收public void CreateAndBindSocket(string IP)/建立并绑定套接字public void Shutdown()/ 停止接收private bool SetSocketOption()/ 设置套接字private void Receive(byte buf, int len) /解析接收的数据包; 3.2. EventArgs类class squar private string ip_version;/ 版本private uint header_length;/ 首部长度private string service_type;/ 服务类型private uint total_packet_length;/ 总长度private string identification;/ 标识private string flags;/ 标志private string fragment_offset;/ 片偏移量private string time_to_live;/ 寿命private string protocol;/ 协议private string checksum;/ 校验和private string destination_address;/ 目的 IP 地址private string origination_address;/ 源 IP 地址private uint message_length; /数据长度; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 18 页 - - - - - - - - - 8 3.3. Header 结构public struct IPHeader public byte ip_verlen; public byte ip_tos; public ushort ip_totallength; public ushort ip_id; public ushort ip_offset; public byte ip_ttl; public byte ip_protocol; public ushort ip_checksum; public uint ip_srcaddr; public uint ip_destaddr; 3.4. 主要功能的实现3.4.1. 程序界面菜单栏及工具栏包含了基本操作按钮,包括退出程序,关于信息,选择IP,开始捕获和导出日志。窗体主要为显示报文信息的列表区和具体字段区,分别用树视图显示。具体界面如图3-1 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 18 页 - - - - - - - - - 9 图 3-1 3.4.2. 获得主机IP 通过 System 的 Net 类函数,容易获得主机的所有IP。代码如下:private void GetHostIP() string hostName = Dns.GetHostName(); IPHostEntry ipEntry = Dns.GetHostEntry(hostName); IPAddress addr = ipEntry.AddressList; foreach (IPAddress ip in addr) toolStripComboBox1.Items.Add(ip.ToString(); 具体结果如图3-2 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 18 页 - - - - - - - - - 10 图 3-2 3.4.3. 显示列表捕获数据后,触发事件,在事件处理函数里,将传递的参数信息添加到主窗体信息列表里。void rawSocket_PacketArrival(object sender, RawSocket.PacketArrivedEventArgs args) TreeNode rootNode = new TreeNode(); TreeNode ipNode = MakeIPTreeNode(args); rootNode.Nodes.Add(ipNode); rootNode.Text = args.OriginationAddress + - + args.DestinationAddress; AddTreeNode addTreeNode = new AddTreeNode(OnAddTreeNode); reeView1.Invoke(addTreeNode, new object rootNode ); 结果如图3-3 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 18 页 - - - - - - - - - 11 图 3-3 3.4.4. 详细信息点击列表项,该项对应数据包的详细信息会显示在窗体右侧树形显示。private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) TreeNode curr = e.Node; if (curr.Level = 0) treeView2.Nodes.Clear(); TreeNode root = (TreeNode)curr.Nodes0.Clone(); treeView2.Nodes.Add(root); treeView2.ExpandAll(); 结果如图3-4 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 18 页 - - - - - - - - - 12 图 3-4 3.4.5. 导出日志程序可以将当前列表的所有数据保存在日志文件里,默认路径为程序运行目录,以导出时间命名。代码如下:private void toolStripButton2_Click(object sender, EventArgs e) string logName = DateTime.Now.ToString(yyyyMMddhhmmss) + .log;FileStream fs = new FileStream(logName, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); foreach (TreeNode tr1 in treeView1.Nodes) sw.Write(tr1.Text + Environment.NewLine); TreeNode temp = tr1.Nodes0; sw.Write( + temp.Text + Environment.NewLine); foreach (TreeNode tr2 in temp.Nodes) sw.Write( + tr2.Text + Environment.NewLine); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 18 页 - - - - - - - - - 13 sw.Write(Environment.NewLine); sw.Close(); fs.Close(); MessageBox.Show( 日志保存成功!); 结果如图3-5 所示。图 3-5 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 18 页 - - - - - - - - - 14 图 3-6 第四章程序测试4. 程序测试经过调试和修改,程序完全实现设计要求,成功抓取了IP 数据包,并分析显示了数据包各字段的信息,达到了这次实训的要求和目的。程序正常运行,能够捕获IP 数据包,显示数据列表和数据项的详细信息,并且成功导出到日志文件。程序欢迎界面如图4-1 所示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 18 页 - - - - - - - - - 15 图 4-1 总结与体会通过这次课程设计,我收获了很多。 首先把所学知识加以利用和巩固,其次在实践中遇到问题去探索和学习,更增加了新知识。在程序设计编写过程中,使用异步来处理数据包的接受和处理,异步线程要添加数据项到主线程创建的界面,这就需要处理两个线程间的数据交换。使用托管函数调用主线程的控件,添加数据项,实践证明达到了预期的目的,积累了经验。这次的课程设计使我掌握了一定的网络编程知识,同时也掌握了探索问题解决问题的方法。 更好的理解课本的知识,为以后的进一步学习和考试打下良好的基础。附录:程序主要代码/解析接收的数据包,形成PacketArrivedEventArgs时间数据类对象,并引名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 18 页 - - - - - - - - - 16 发 PacketArrival 事件unsafe private void Receive(byte buf, int len) byte temp_tos = 0; byte temp_protocol = 0; uint temp_version = 0; ushort temp_identification = 0; int temp_flags = 0; int temp_fragmentOffset = 0; byte temp_ttl = 0; ushort temp_check = 0; uint temp_ip_srcaddr = 0; uint temp_ip_destaddr = 0; IPAddress temp_ip; PacketArrivedEventArgs e = new PacketArrivedEventArgs(); fixed (byte* fixed_buf = buf) IPHeader* head = (IPHeader*)fixed_buf; temp_version = (uint)(head-ip_verlen & 0 xF0) 4; e.IPVersion = temp_version.ToString(); e.HeaderLength = (uint)(head-ip_verlen & 0 x0F) ip_tos; e.TypeOfService = string.Format(0 x0:x2 (1),temp_tos,temp_tos); temp_identification = head-ip_id; e.Identification = temp_identification.ToString(); temp_flags = (head-ip_offset) 13; e.Flags = temp_flags.ToString(); temp_fragmentOffset = (head-ip_offset) & 0 x1FFF; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 18 页 - - - - - - - - - 17 e.FragmentOffset = temp_fragmentOffset.ToString(); temp_ttl = head-ip_ttl; e.TimeToLive = temp_ttl.ToString(); temp_protocol = head-ip_protocol; switch (temp_protocol) case 1: e.Protocol = ICMP; break; case 2: e.Protocol = IGMP; break; case 6: e.Protocol = TCP; break; case 17: e.Protocol = UDP; break; default: e.Protocol = UNKNOWN; break; temp_check = head-ip_checksum; e.Checkum = string.Format(0 x0:x2, temp_check); temp_ip_srcaddr = head-ip_srcaddr; temp_ip_destaddr = head-ip_destaddr; temp_ip = new IPAddress(temp_ip_srcaddr); e.OriginationAddress = temp_ip.ToString(); temp_ip = new IPAddress(temp_ip_destaddr); e.DestinationAddress = temp_ip.ToString(); e.PacketLength = (uint)len; e.MessageLength = (uint)len - e.HeaderLength; OnPacketArrival(e); /添加数据项private TreeNode MakeIPTreeNode(RawSocket.PacketArrivedEventArgs arg) TreeNode ipNode = new TreeNode(); ipNode.Text = IP 数据包 ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 18 页 - - - - - - - - - 18 ipNode.Nodes.Add( 版本 : + arg.IPV ersion); ipNode.Nodes.Add( 首部长度 : + arg.HeaderLength); ipNode.Nodes.Add( 服务类型 : + arg.TypeOfService); ipNode.Nodes.Add( 总长度 : + arg.PacketLength); ipNode.Nodes.Add( 标识 : + arg.Identification); ipNode.Nodes.Add( 标志 : + arg.Flags); ipNode.Nodes.Add( 片偏移量 : + arg.FragmentOffset); ipNode.Nodes.Add( 寿命 : +arg.TimeToLive); ipNode.Nodes.Add( 协议 : + arg.Protocol); ipNode.Nodes.Add( 首部校验和 : + arg.Checkum); ipNode.Nodes.Add( 源 IP 地址 : + arg.OriginationAddress); ipNode.Nodes.Add( 目的 IP 地址 : + arg.DestinationAddress); return ipNode; /保存日志文件private void toolStripButton2_Click(object sender, EventArgs e) string logName = DateTime.Now.ToString(yyyyMMddhhmmss) + .log; FileStream fs = new FileStream(logName, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); foreach (TreeNode tr1 in treeView1.Nodes) sw.Write(tr1.Text + Environment.NewLine); TreeNode temp = tr1.Nodes0; sw.Write( + temp.Text + Environment.NewLine); foreach (TreeNode tr2 in temp.Nodes) sw.Write( + tr2.Text + Environment.NewLine); sw.Write(Environment.NewLine); sw.Close(); fs.Close(); MessageBox.Show( 日志保存成功!); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 18 页 - - - - - - - - -