付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.目 录1引言.11.1课题背景 .11.2网络流量监控的引入 .11.3课程设计的目的与任务 .12相关的概念与技术 .22.1TCP/IP 体系结构 .22.2原始套接字 .33网络数据的采集技术分析 .43.1Windows 下原始数据包捕获的实现 .43.2原始数据包捕获的关键函数 .54网络流量监控系统各模块的设计与实现.64.1总体结构设计 .64.2流程图设计 .74.3各模块功能概述与实现 .84.3.1数据包采集中各类的关系 .84.3.2数据包捕获与分析模块 .94.3.3流量获取模块 .104.3.4数据统计模块 .135分析工具测试.135.1测试环境 .135.2测试
2、步骤 .135.3测试结果评价 .146结束语 .15参考文献: .16.网络工程课程设计1 引言1.1课题背景随着构建网络基础技术和网络应用的迅速发展以及用户对网络性能要求的提高,使得网络管理成为迫切需要解决的问题,有效的网络管理能够保证网络的稳定运行和持续发展,更重要的是, 随着网络规模的扩大和黑客技术的发展,入侵和攻击的案例日益增多,对稳定的网络服务、 信息安全、 互联网秩序都提出了严峻的挑战,网络安全管理在整个网络管理系统里扮演起更为重要的角色。1.2网络流量监控的引入网络安全管理体系中,流量监控和统计分析是整个管理的基础。流量检测主要目的是通过对网络数据进行实时连续的采集监测网络流量
3、,对获得的流量数据进行统计计算, 从而得到网络主要成分的性能指标。网络管理员根据流量数据就可以对网络主要成分进行性能分析管理,发现性能变化趋势, 并分析出影响网络性能的因素及问题所在。 此外,在网络流量异常的情况下,通过扩展的流量检测报警系统还可以向管理人员报警,及时发现故障加以处理。 在网络流量检测的基础上,管理员还可对感兴趣的网络管理对象设置审查值范围及配置网络性能对象,监控实时轮询网络获取定义对象的当前值,若超出审查值的正常预定值则报警, 协助管理员发现网络瓶颈,这样就能实现一定程度上的故障管理。而网络流量检测本身也涉及到安全管理方面的内容。由此可见, 对于一个有效的网络安全管理系统来说
4、,功能的实现都或多或少的依赖于流量信息的获取。因此网络流量信息的采集可以说是网络安全管理系统得以实现的核心基石。它的应用可以在一定程度上检测到入侵攻击,可以有效地帮助管理人员进行网络性能管理,并利用报警机制协助网管人员采取对应的安全策略与防护措施,从而减少入侵攻击所造成的损失。1.3课程设计的目的与任务该网络流量监控及分析工具主要用途是通过实时连续地采集网络数据并对其进行统计,1网络工程课程设计得到主要成分性能指标,结合网络流量的理论,通过统计出的性能指数观察网络状态,分析出网络变化趋势,找出影响网络性能的因素。课程设计开发的工具实现以下功能:( 1)采用 Winsock 编写原始套接字 So
5、cket-Raw 对数据包进行采集捕获,并可实现分类及自定义范围进行捕获;( 2)对捕获的数据包进行一定的解析;( 3)访问操作系统提供的网络性能参数接口,得到网卡总流量、 输入流量和输出流量;( 4)系统提供了多种方式显示结果,如曲线图、列表等;( 5)使用 IP 帮助 API 获取网络统计信息;( 6)实现对部分常见威胁的预警,可继续开发扩展其报警功能。2 相关的概念与技术2.1TCP/IP 体系结构由于 TCP/IP 比其之前的OSI 模型更具体实现,随着互联网的不断发展,遵循TCP/IP 结构的网络不断普及,因此现在通常采用TCP/IP 代表 Internet体系结构。 TCP/IP
6、的目的是在网络标准不同的情况下解决互联问题,可以说,网络互联是TCP/IP 的核心。 TCP/IP 的体系结构如图1 所示。图 12网络工程课程设计TCP/IP 在设计时重点并没有放在具体通信的实现上,所以对最后两层没有做出具体规定,同时表明它允许不同类型的通信网络参与通信。它的四个层次功能如下。( 1)应用层,提供常用的应用程序及自定义的应用程序,数据传输时用TCP/IP 协议来进行;( 2 )传输层,提供端到端的应用程序之间的通信,可以使用传输控制协议TCP(Transmission Control Protocol )或用户数据报协议 UDP( User Datagram Protoco
7、l )协议,前者提供可靠传输, 传送单位是报文段, 后者提供不可靠服务, 传输单位是数据报, 即分组。此外,传输层另外一个功能就是区别应用程序;( 3)网际层,负责计算机之间的通信,采用的协议是IP 协议,数据传送单位是分组,向上提供不可靠的传输服务;( 4)网络接口层,负责接收数据报,并实现发送,或者接收帧,提取IP 数据报,交给互联网层。2.2原始套接字从用户的角度来看, 标准的流式套接字和数据报套接字这两类套接字似乎涵盖了TCP/IP应用的全部,因为基于TCP/IP 的应用,从协议栈的层次(如图所示)上讲,在传输层的确只可能建立于TCP 或 UDP 协议之上,而流式套接字和数据报套接字又
8、分别对应于TCP和 UDP,所以几乎所有的应用都可以用这两类套接字实现。但是,当需要自定义数据包发送时或者需要分析所有经过网络的数据包的时候,就必须面临一种不同于前两者的方式Raw Socket ,即原始套接字,程序员可以用它来发送和接收IP 层以上的原始数据包, 如ICMP,TCP, UDP 等,不仅这样,它还可以实现如伪装本地IP、发送 ICMP 包等功能 。图协议栈层次Raw Socket 广泛应用于高级网络编程,也是一种广泛的黑客手段。著名的网络sniffer 、3网络工程课程设计拒绝服务攻击(DOS)、 IP 欺骗等都可以以Raw Socket 实现。 Raw Socket 与标准套
9、接字( SOCK_STREAM、 SOCK_DGRAM )的区别在于前者直接置 根 于操作系统网络核心( Network Core ),而 SOCK_STREAM、SOCK_DGRAM 则“悬浮”于TCP 和 UDP 协议外围, 如图所示。3 网络数据的采集技术分析3.1Windows下原始数据包捕获的实现网络上的数据包捕获机制主要依赖于所使用的操作系统,不同的操作系统下有不同的实现途径。在 Windows 环境下,可通过网络驱动程序接口规范(NDIS ),WinSock 的 SOCK_RAW或虚拟设备驱动技术(VxD )等技术实现网络数据包的捕获功能。前面已经介绍到了,使用原始套接字可以绕过
10、Socket 提供的功能,对底层的协议进行使用与开发, 可以根据自己的需要生成想要的数据报文等,下面开始介绍使用原始套接字对数据包捕获进行开发的相关技术知识。第一,使用套接字前,需要了解网卡接收数据的工作原理:在正常情况下, 网络接口只响应两种数据帧,一种是与自己的硬件相匹配的数据帧,另一种四向所有计算机广播的数据帧。在系统中, 数据帧的收发由网卡完成,网卡程序接收从网络发来的数据包,根据其硬件地址去判断是否与本机的硬件地址匹配,若匹配就通知CPU4网络工程课程设计产生中断进行响应,然后调用驱动程序设置的网卡中断程序地址调用驱动程序接收数据,然后放入堆栈进行系统相关处理,若不匹配则直接丢弃该数
11、据包3 。对于网络接口,它一般具有4 种数据接收模式:广播、组播、直接和混杂模式,只有当把接口设置为混杂模式时,网络接口才能接收所有的数据,无论地址是否匹配,所以在做本设计的时候一定要设置为混杂模式才能实现数据的采集。第二,需要了解套接字的工作程序和使用方法:一般来说,采用套接字开发网络程序需要经历以下几个基本步骤:启动、创建、绑定、监听(接受连接) 、连接、发送 / 接收数据、关闭、卸载等。第三,具体到Windows 下利用原始套接字捕获网络数据可以这样设计:( 1)启动套接字;( 2)创建一个原始套接字;( 3)将套接字与本地地址绑定;( 4)设置操作参数;( 5)设置网络接口为混杂模式;
12、( 6)启动监听线程,开始接收数据;( 7)退出关闭套接字。3.2原始数据包捕获的关键函数( 1 )启动函数 WSAStartupint PASCAL FAR WSAStartup (DWORD wVersionRequested , LPWSADATA lpWSAData);每一个套接字应用程序都必须调用该函数进行一系列初始化工作,并且只有调用成功返回后,才能开始使用套接字,其中参数wVersionRequested是版本号,高字节是次版本号、低字节是主版本号,参数lpWSAData 是指向 WSADATA 结构的指针。(2 )套接字创建函数socketSOCKET socket (int
13、af , int type , int protocol);所有的通信在建立之前都必须创建一个套接字,socket 函数的功能就是创建套接字,其中参数 af 指协议地址族(address family ),当建立的套接字是依赖于UDP 或 TCP 的话,需要设置 af 为 AF_INET,表示采用IP 协议。参数 type 是指协议的套接字类型,采用流式套接字时用SOCK_STREAM,采用数据报套接字时用SOCK_DGRAM,采用原始套接字时用SOCK_RAW。参数 protocol是协议字段,默认情况下可直接设置为0 。5网络工程课程设计( 3 )绑定函数 bindint bind ( S
14、OCKET s , struct sockaddr_in* name , int namelen);成功创建套接字后的下一步工作就是将本地网络接口与套接字进行绑定,其中参数s是创建的套接字,参数 name 是需要绑定的通信对象的信息结构体指针,namelen 是该结构的长度。需要注意的是sockaddr_in 结构:struct sockaddr_inshortsin_family;/ 地址族,设置为AF_INETunsigned shortsin_port;/ 指定的端口号struct in_addrsin_addr;/IP 地址charsin_zero8;由于主机序列与网络序列的关系,在程
15、序中需要使用htons 等函数进行转换工作。( 4 )设置接口模式函数 WSAIoctlint WSAAPI WSAIoctl(SOCKET s, DWORDdwIoControlCode, LPVOID lpvInBuffer, DWORDcbInBuffer, LPVOID lpvOutBuffer, DWORDcbOutBuffer, LPDWORD lpcbBytesReturned,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);其中, s 为一个套接口的句柄,dw
16、IoControlCode为操作控制代码,lpvInBuffer 为输入缓冲区的地址,cbInBuffer 为输入缓冲区的大小,lpvOutBuffer为输出缓冲区的地址,cbOutBuffer 为输出缓冲区的大小, lpcbBytesReturned 为输出实际字节数的地址, lpOverlapped 为 WSAOVERLAPPED 结构的地址, lpCompletionRoutine 为一个指向操作结束后调用的例程指针。调用成功后,WSAIoctl函数返回0,否则的话,将返回INVALID_SOCKET 错误,应用程序可通过WSAGetLastError 来获取错误代码。(5 )数据接收函
17、数recvint recv (SOCKET s , char* buf ,int len , int flags);4 网络流量监控系统各模块的设计与实现4.1总体结构设计通过收集与分析简单网络流量监控软件的需求,总结出以下特征:6网络工程课程设计( 1)需要实现对网络接口数据包的尽可能多的捕获,将网卡设置为混杂模式,然后进行数据包的采集;( 2)数据包的内容要进行一定的解析,对数据包的协议类型、源目地址、数据包截获时间、数据包内容需要进行分析;( 3)监视结果输出有实时流量图、列表等显示;( 4)实现日志记录,便于日后分析;( 5)对某些常见的攻击进行发现分析。总合以上要求与综合分析,分析工
18、具总体设计如下,采用VC+6.0编写,分析工具具有三个主要功能部分: 数据捕获与显示模块、 流量信息统计模块、 流量绘制模块, 如图 4.1_1 所示。流量监控分析系统数据采集模块信息统计模块流量绘制模块图 4.1_1系统总体设计结构图数据采集模块: 完成网络接口数据的捕获、解析和显示, 可以根据用户定义条件组合来进行捕获, 如只监视采用TCP 或 UDP 协议的数据包, 也可以监视用户希望关注的相关IP 地址的数据包,同时完成数据封包日志记录,提高了系统的灵活性。同时,在对数据包的解析过程中对一些常见入侵攻击特征进行判断,发出预警。该模块采用编写原始套接字开发。信息统计模块:完成统计功能,如
19、统计IP 要实现统计接收到的数据报数量、接收到的数据中协议出错的数量、正在请求传输的数量、路由表中可用路由数量、丢弃的数量、需要重组 / 成功重组的数量等,统计 ICMP 需要完成发送 / 接收的消息数量、 满足超过 TTL 的数量、重定向数量、时间戳请求/ 应答数量等;采用IP 助手函数完成。流量绘制模块:完成总流量、输入流量、输出流量、瞬时流量值、最高流量值的显示;采用访问注册表网络性能数据完成有关数据的获取,通过流量图显示。4.2流程图设计根据上面对各个功能模块的划分,进行更进一步的分析和设计,得到数据采集、 注册表网络性能块访问大致的工作流程图,如4.2_1 与图 4.2_2 所示。7
20、网络工程课程设计图 4.2_1数据捕获处理流程图 4.2_2网络性能数据块访问流程4.3各模块功能概述与实现数据包采集中各类的关系经过上面的分析与设计, 得到该系统的总体功能结构、 工作流程, 也确定了从编写套接字到最后捕获数据,要经过创建、绑定、设置工作模式、启动线程、接收数据等一系列的处理操作。为了实现处理中的每一步操作,设计了数据捕获的类关系,如图4.3.1 所示 。图数据包采集中各类的关系在上图中CSockSupport ,CSockHelper, CPackInterDlg , CBinDataDlg等是封装了各8网络工程课程设计部分主要处理功能的类。 且这些类中封装了和这些类的操作
21、相关的方法。 将在后面对这些类的功能和实现进行详细介绍 。数据包捕获与分析模块功能实现说明该功能模块主要由封装的 CSockSupport ,CsockHelper , CpackInterDlg , CbinDataDlg 四个类完成,下面将对这些类进行详细说明。CsockSupport 类:主要负责检查 Socket 是否支持 2.0 版本,在该类中封装了 WSAStartup 完成 Socket 的启动;CsockHelper类:主要实现了从获取本机信息结构、Socket 创建、绑定、设置、启动线程、数据接收到协议分析的全部方法,详细处理流程见图所示。GetLocalIP 实现获取本机地
22、址操作的方法, LPHOSTENT lphp 是 定 义 一 个 主 机 信 息 结 构 , 获 取 过 程 由gethostname(szLocname,MAX_HOSTNAME_LAN)与gethostbyname(szLocname)完成;第一个参数是用于放置本机名称的缓冲, 第二个参数是缓冲区长度,最后利用 inet_ntoa将 IP 地址转化为“.”式地址。StartCapture方法完成套接字的创建、绑定、设置操作方式和启动线程;具体完成如下:m_sockCap = socket(AF_INET , SOCK_RAW ,图 4.3.2 CSockHelperIPPROTO_IP);
23、/创建套接字类处理流程bind(m_sockCap, (PSOCKADDR)&sa, sizeof(sa);/绑定setsockopt(m_sockCap, SOL_SOCKET, SO_REUSEADDR, (char*)&bopt, sizeof(bopt) ;/设置操作setsockopt(m_sockCap, IPPROTO_IP, IP_HDRINCL, (char*)&bopt, sizeof(bopt) ;/设置操作WSAIoctl(m_sockCap,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),dwBufferLen,size
24、of(dwBufferLen),&dwBytesReturned,NULL,NULL);/混杂模式m_hCapThread = CreateThread(NULL, 0, CaptureThread, this, 0, NULL);/启动线程线程函数 CaptureThread 主要完成数据的接收。数据接收后,将缓冲区数据转化为IP数据格式后即可以开始解析过程,协议名称获取如下:for(int i=0; ih_lenver & 0xf) /获取数据包长度协议解析:switch(iProtocol)case IPPROTO_TCP :case IPPROTO_UDP :case IPPROTO_
25、ICMP :default :StopCapture 完成关闭线程和套接字操作:if(m_hCapThread)TerminateThread(m_hCapThread, 0);/ 中断进程CloseHandle(m_hCapThread);/ 关闭句柄m_hCapThread = NULL;if(m_sockCap)closesocket(m_sockCap);/ 关闭套接字CbinDataDlg类主要完成对已捕获数据的存储和显示方法;CpackInterDlg类通过建立CbinDataDlg 类和 CsockHelper 类对象实现数据捕获、解析、显示、存储等,同时它完成对捕获条件设置控件
26、、日志记录控件的编写,在这里就不做详细介绍了。流量获取模块设计说明设计思路:实际编程时,Windows系统内提供了一个系统性能的接口,只需要访问这个接口就可以得到网络性能相关的数据,如流量; 根据这个想法, 设计出了本功能模块的子功能模块如下:访问性能数据子模块:负责对注册表进行访问,获取流量数据;显示子模块:负责将数据绘制在窗口中;框架子模块:负责消息映射和消息处理;本模块中, 将使用到一个注册表访问函数 RegQueryValueEx ,它根据开放的注册表键值与名字查找相关的类型和数据。它的函数原型如下:LONG RegQueryValueEx(HKEY hKey , LPCTSTR lp
27、ValueName , LPDWORD lpReserved ,LPDWORD lpType , LPBYTE lpData , LPDWORD lpcbData);参数说明:hKey 为预定的注册表系统键值;lpValueName为需要查询的目标键值的名字;lpReserved 保留,但是必须为NULL;lpType 为键值类型;lpData 输入 / 输出接收键值的数据;lpcbData 输入 / 输出接收键值的缓冲大小标志。在WindowsNT下 , 当 调 用RegQueryValueEx时 , 若hKey被 设 置 为10网络工程课程设计HKEY_PERFORMANCE_DATA返回
28、的数据并不是直接显示被请求的数据对象。所以程序需要遍历整个数据块,数据块中的逻辑结构如图4.3.3 所示。图注册表网络性能数据块逻辑结构从数据块的性能数据结构 PERF_DATA_BLOCK开始, 然后索引到 PERF_OBJECT_TYPE结构 , 而 PERF_COUNTER_DEFINITION 结 构 可 以 通 过 PERF_OBJECT_TYPE的 成 员 HeaderByteLength 找到位置偏移, 每一个 PERF_OBJECT_TYPE的成员 DefinitionLength 都能确定一个对应的 PERF_INSTANCE_DEFINITION结构,PERF_INSTAN
29、CE_DEFINITION结构决定着 PERF_COUNTER_BLOCK结构 3 。下面列出了获得网络接口流量的部分关键代码:/ 得到当前的接口名字InterfaceName = Interfaces.GetAt(pos);/ 开辟性能数据缓冲unsigned char *data = new unsigned char DEFAULT_BUFFER_SIZE;/ 从 RegQueryValueEx 返回的值 :本例中忽略改变量/ 从网络对象 (索引是 510)查询性能数据RegQueryValueEx(HKEY_PERFORMANCE_DATA, 510, NULL, &type, dat
30、a, &size)PERF_DATA_BLOCK *dataBlockPtr = (PERF_DATA_BLOCK *)data;下面详细说明,注册表数据性能块访问过程的实现:/ 枚举链表中第一个对象PERF_OBJECT_TYPE *objectPtr = FirstObject(dataBlockPtr);/ 遍历链表for(int a=0 ; aNumObjectTypes ; a+)char nameBuffer255;/ 判断是否是网络对象索引号是510if(objectPtr-ObjectNameTitleIndex = 510)/ 偏移变量DWORD processIdOffse
31、t = ULONG_MAX;/ 找到第一个计数器PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr);/ 遍历链表for(int b=0 ; bNumCounters ; b+)11网络工程课程设计/ 判断接收的数据类型是否是我们需要的if(int)counterPtr-CounterNameTitleIndex= CurrentTrafficType)processIdOffset = counterPtr-CounterOffset;/ 下一个计数器counterPtr = NextCounter(counterPtr)
32、;/ 数据类型不是我们需要的if(processIdOffset = ULONG_MAX) delete data;return 1;/ 找到第一个实例(instance)PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr);/ 遍历整个实例for(b=0 ; bNumInstances ; b+)wchar_t *namePtr = (wchar_t *) (BYTE *)instancePtr + instancePtr-NameOffset);/ 得到这个实例的PERF_COUNTER_BLOCKPERF_COU
33、NTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr);/ 现在得到了接口的名字char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer); POSITION pos = TotalTraffics.FindIndex(b);if(pos!=NULL)fullTraffic = *(DWORD *) (BYTE *)counterBlockPtr + processIdOffset); TotalTraffics.SetAt(pos,fullTraffic);/
34、 如果当前的接口就是我们选择的接口if(InterfaceName = iName)traffic = *(DWORD *) (BYTE *)counterBlockPtr + processIdOffset);/ 判断处理的接口是否是新的if(CurrentInterface != interfaceNumber) lasttraffic = acttraffic; trafficdelta = 0.0;CurrentInterface = interfaceNumber;else trafficdelta = acttraffic - lasttraffic; lasttraffic =
35、acttraffic;delete data;return(trafficdelta);/ 下一个实例instancePtr = NextInstance(instancePtr);/ 下一个对象12网络工程课程设计objectPtr = NextObject(objectPtr);delete data;return 0;catch(.)return 0;数据统计模块可以利用微软的IP 助手中的API 函数实现 IP 的统计,通过统计的数据可以在一定程度上发现网络性能瓶颈。涉及到的函数有 GetUdpStatistic,GetTcpStatistic,GetIcmpStatistic,Get
36、IStatistic ,需要注意的是工程中要加载IPHelpapi.lib 库。函数调用结果通过列表可以直观显示出来,网络管理人员可以通过其中统计数量的变化监视网络性能。5 分析工具测试5.1测试环境(1) 处理器 P4 2.0 G Mhz 以上;(2) 内存 512M 以上;(3) 多台普通搭载网卡的 PC、经过路由器或交换机互联。(4) 操作系统 Win2000/NT/xp/win7/server2003等;(5) VC+6.0 。5.2测试步骤(1) 首先,用多台 PC 搭建局域网络。(2) 其次,选定一台 PC 进行测试 :数据包捕获 (含设定条件) 、封包日志保存、 流量峰值、数据统计。(3) 确定每个功能模块的测试要求。(4) 对每个功能模块进行数据合法性检查、数据一致性检查。(5) 进行各模块的功能测试后,对关键模块进行回归测试。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多污染物联合暴露下社区慢病的健康风险评价
- 2025年高职无人机应用技术(无人机植保技术)试题及答案
- 2025年大学化工类(化工基础实训)试题及答案
- 2026年电动车维修(电池案例)试题及答案
- 2025年中职计算机应用(数据处理)试题及答案
- 2025年高职(旅游管理综合实训)规划优化实操试题及答案
- 2025年中职第一学年(中医养生保健)中医食疗养生试题及答案
- 2026年污水处理(工业废水处理工艺)试题及答案
- 2025年中职建筑施工(混凝土浇筑)试题及答案
- 2025年中职第二学年(水产养殖实训)鱼塘水质调节实操综合测试试题及答案
- 鲁科版高中化学必修一教案全册
- 提高隧道初支平整度合格率
- 2023年版测量结果的计量溯源性要求
- 建筑能耗与碳排放研究报告
- GB 29415-2013耐火电缆槽盒
- 中国古代经济试题
- 软件定义汽车:产业生态创新白皮书
- 磷石膏抹灰专项施工方案
- 水电水利工程施工质量管理培训讲义
- ArcMap制图-地图版面设计实验报告
- 建设部37号令危大工程标识牌样表
评论
0/150
提交评论