网络协议分析课程设计IP协议文档格式.docx
- 文档编号:16319381
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:15
- 大小:338.90KB
网络协议分析课程设计IP协议文档格式.docx
《网络协议分析课程设计IP协议文档格式.docx》由会员分享,可在线阅读,更多相关《网络协议分析课程设计IP协议文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
1.1.关于题目
1.1.1.题目要求
(1)捕获网络中的IP数据包,解析数据包的内容,显示结果,并将结果写入日志文件。
(2)显示的内容包括:
捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
(3)设置停止标志,当程序接收到停止命令时即停止。
1.1.2.选题背景
IP数据包是网络协议学习过程中容易接触到的,选择这个题目一是为了将自己的所学知识加以运用,二是希望通过探索实践去实现题目,在实践和实际的项目中提高自己的编程能力。
因此我选定了这个题目。
1.2.关于编译软件
本程序使用C#语言,MicrosoftVisualStudio2005进行编译。
VisualStudio是微软公司推出的开发环境,VisualStudio可以用来创建Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和Office插件。
1.3.关于稳定性
经测试,本程序可以在windows操作系统中稳定运行,较为稳定。
要求至少安装.NetFramework2.0。
第二章程序设计
2.主要功能设计
根据分析,这个程序要实现如下几个功能,初始化、捕获数据包、显示、导出日志。
其中捕获数据包是程序的核心部分,是后续操作的基础。
程序结构如图2-1所示。
图2-1程序结构图
2.1.程序流程
根据分析后的程序结构图设计出相应的流程图。
内容主要包括初始化,获得主机IP列表,绑定Socket,开始捕获数据,分析数据,显示数据项,导出日志文件,根据用户操作退出程序。
图2-2流程图
第三章程序实现
3.类设计声明
根据程序的结构,将程序需要实现的功能细化为相应的类属性和成员函数。
程序有两个类,一个RawSocket类,用于数据包相关捕获和处理。
一个EventArgs类,用于类间传递信息。
同时还有一个公共结构体,对应IP数据包的格式。
3.1.RawSocket类
publicclassRawSocket
{
privateboolerror_occurred;
//是否产生错误
publicboolKeepRunning;
//是否继续进行
privatestaticintlen_receive_buf;
//得到的数据流的长度
byte[]receive_buf_bytes;
//收到的字节
privateSocketsocket=null;
//声明套接字
publicvoidRun()//开始接收
publicvoidCreateAndBindSocket(stringIP)//建立并绑定套接字
publicvoidShutdown()//停止接收
privateboolSetSocketOption()//设置套接字
privatevoidReceive(byte[]buf,intlen)//解析接收的数据包
};
3.2.EventArgs类
classsquar
privatestringip_version;
//版本
privateuintheader_length;
//首部长度
privatestringservice_type;
//服务类型
privateuinttotal_packet_length;
//总长度
privatestringidentification;
//标识
privatestringflags;
//标志
privatestringfragment_offset;
//片偏移量
privatestringtime_to_live;
//寿命
privatestringprotocol;
//协议
privatestringchecksum;
//校验和
privatestringdestination_address;
//目的IP地址
privatestringorigination_address;
//源IP地址
privateuintmessage_length;
//数据长度
3.3.Header结构
publicstructIPHeader
publicbyteip_verlen;
publicbyteip_tos;
publicushortip_totallength;
publicushortip_id;
publicushortip_offset;
publicbyteip_ttl;
publicbyteip_protocol;
publicushortip_checksum;
publicuintip_srcaddr;
publicuintip_destaddr;
}
3.4.主要功能的实现
3.4.1.程序界面
菜单栏及工具栏包含了基本操作按钮,包括退出程序,关于信息,选择IP,开始捕获和导出日志。
窗体主要为显示报文信息的列表区和具体字段区,分别用树视图显示。
具体界面如图3-1所示。
图3-1
3.4.2.获得主机IP
通过System的Net类函数,容易获得主机的所有IP。
代码如下:
privatevoidGetHostIP()
stringhostName=Dns.GetHostName();
IPHostEntryipEntry=Dns.GetHostEntry(hostName);
IPAddress[]addr=ipEntry.AddressList;
foreach(IPAddressipinaddr)
{
toolStripComboBox1.Items.Add(ip.ToString());
}
具体结果如图3-2所示。
图3-2
3.4.3.显示列表
捕获数据后,触发事件,在事件处理函数里,将传递的参数信息添加到主窗体信息列表里。
voidrawSocket_PacketArrival(objectsender,RawSocket.PacketArrivedEventArgsargs)
TreeNoderootNode=newTreeNode();
TreeNodeipNode=MakeIPTreeNode(args);
rootNode.Nodes.Add(ipNode);
rootNode.Text=args.OriginationAddress+"
->
"
+args.DestinationAddress;
AddTreeNodeaddTreeNode=newAddTreeNode(OnAddTreeNode);
reeView1.Invoke(addTreeNode,newobject[]{rootNode});
结果如图3-3所示。
图3-3
3.4.4.详细信息
点击列表项,该项对应数据包的详细信息会显示在窗体右侧树形显示。
privatevoidtreeView1_NodeMouseClick(objectsender,TreeNodeMouseClickEventArgse)
TreeNodecurr=e.Node;
if(curr.Level==0)
treeView2.Nodes.Clear();
TreeNoderoot=(TreeNode)curr.Nodes[0].Clone();
treeView2.Nodes.Add(root);
treeView2.ExpandAll();
结果如图3-4所示。
图3-4
3.4.5.导出日志
程序可以将当前列表的所有数据保存在日志文件里,默认路径为程序运行目录,以导出时间命名。
privatevoidtoolStripButton2_Click(objectsender,EventArgse)
stringlogName=DateTime.Now.ToString("
yyyyMMddhhmmss"
)+"
.log"
;
fs=new(logName,,);
StreamWritersw=newStreamWriter(fs);
foreach(TreeNodetr1intreeView1.Nodes)
sw.Write(tr1.Text+Environment.NewLine);
TreeNodetemp=tr1.Nodes[0];
sw.Write("
+temp.Text+Environment.NewLine);
foreach(TreeNodetr2intemp.Nodes)
+tr2.Text+Environment.NewLine);
sw.Write(Environment.NewLine);
sw.Close();
fs.Close();
MessageBox.Show("
日志保存成功!
"
);
结果如图3-5所示。
图3-5
图3-6
第四章程序测试
4.程序测试
经过调试和修改,程序完全实现设计要求,成功抓取了IP数据包,并分析显示了数据包各字段的信息,达到了这次实训的要求和目的。
程序正常运行,能够捕获IP数据包,显示数据列表和数据项的详细信息,并且成功导出到日志文件。
程序欢迎界面如图4-1所示。
图4-1
总结与体会
通过这次课程设计,我收获了很多。
首先把所学知识加以利用和巩固,其次在实践中遇到问题去探索和学习,更增加了新知识。
在程序设计编写过程中,使用异步来处理数据包的接受和处理,异步线程要添加数据项到主线程创建的界面,这就需要处理两个线程间的数据交换。
使用托管函数调用主线程的控件,添加数据项,实践证明达到了预期的目的,积累了经验。
这次的课程设计使我掌握了一定的网络编程知识,同时也掌握了探索问题解决问题的方法。
更好的理解课本的知识,为以后的进一步学习和考试打下良好的基础。
附录:
程序主要代码
//解析接收的数据包,形成PacketArrivedEventArgs时间数据类对象,并引发PacketArrival事件
unsafeprivatevoidReceive(byte[]buf,intlen)
bytetemp_tos=0;
bytetemp_protocol=0;
uinttemp_version=0;
ushorttemp_identification=0;
inttemp_flags=0;
inttemp_fragmentOffset=0;
bytetemp_ttl=0;
ushorttemp_check=0;
uinttemp_ip_srcaddr=0;
uinttemp_ip_destaddr=0;
IPAddresstemp_ip;
PacketArrivedEventArgse=newPacketArrivedEventArgs();
fixed(byte*fixed_buf=buf)
IPHeader*head=(IPHeader*)fixed_buf;
temp_version=(uint)(head->
ip_verlen&
0xF0)>
>
4;
e.IPVersion=temp_version.ToString();
e.HeaderLength=(uint)(head->
0x0F)<
<
2;
temp_tos=head->
ip_tos;
e.TypeOfService=string.Format("
0x{0:
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)&
0x1FFF;
e.FragmentOffset=temp_fragmentOffset.ToString();
temp_ttl=head->
ip_ttl;
e.TimeToLive=temp_ttl.ToString();
temp_protocol=head->
ip_protocol;
switch(temp_protocol)
case1:
e.Protocol="
ICMP"
break;
case2:
IGMP"
case6:
TCP"
case17:
UDP"
default:
UNKNOWN"
temp_check=head->
ip_checksum;
e.Checkum=string.Format("
x2}"
temp_check);
temp_ip_srcaddr=head->
ip_srcaddr;
temp_ip_destaddr=head->
ip_destaddr;
temp_ip=newIPAddress(temp_ip_srcaddr);
e.OriginationAddress=temp_ip.ToString();
temp_ip=newIPAddress(temp_ip_destaddr);
e.DestinationAddress=temp_ip.ToString();
e.PacketLength=(uint)len;
e.MessageLength=(uint)len-e.HeaderLength;
OnPacketArrival(e);
//添加数据项
privateTreeNodeMakeIPTreeNode(RawSocket.PacketArrivedEventArgsarg)
TreeNodeipNode=newTreeNode();
ipNode.Text="
IP数据包"
ipNode.Nodes.Add("
版本:
+arg.IPVersion);
首部长度:
+arg.HeaderLength);
服务类型:
+arg.TypeOfService);
总长度:
+arg.PacketLength);
标识:
+arg.Identification);
标志:
+arg.Flags);
片偏移量:
+arg.FragmentOffset);
寿命:
+arg.TimeToLive);
协议:
+arg.Protocol);
首部校验和:
+arg.Checkum);
源IP地址:
+arg.OriginationAddress);
目的IP地址:
+arg.DestinationAddress);
returnipNode;
//保存日志文件
StreamWritersw=newStreamWriter(fs);
MessageBox.Show("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 协议 分析 课程设计 IP