Linux连接跟踪源码分析报告

上传人:痛*** 文档编号:101410667 上传时间:2022-06-05 格式:DOC 页数:30 大小:132KB
收藏 版权申诉 举报 下载
Linux连接跟踪源码分析报告_第1页
第1页 / 共30页
Linux连接跟踪源码分析报告_第2页
第2页 / 共30页
Linux连接跟踪源码分析报告_第3页
第3页 / 共30页
资源描述:

《Linux连接跟踪源码分析报告》由会员分享,可在线阅读,更多相关《Linux连接跟踪源码分析报告(30页珍藏版)》请在装配图网上搜索。

1、.Linux连接跟踪源码分析IP Connection tracking 连接跟踪用来跟踪和记录连接状态,是netfilter的一部份,也是通过在hook点上注册相应的结构来工作的。无论是发送,接收,还是转发的数据包,都要经过两个conntrack模块。第一个conntrack点的优先级是最高的,所有数据包进入netfilter后都会首先被它处理,其作用是创建ip_conntrack结构。而最后一个conntrack的优先级最低,总是在数据包离开netfilter之前做最后的处理,它的作用是将该数据包的连接跟踪结构添加到系统的连接状态表中1. ip_conntarck结构 ip_conntra

2、ck.h内核中用一个ip_conntrack结构来描述一个连接的状态struct ip_conntrack/* nf_conntrack结构定义于include/linux/skbuff.h,Line89,其中包括一个计数器use和一个destroy函数。计数器use对本连接记录的公开引用次数进行计数 */struct nf_conntrack ct_general;/*其中的IP_CT_DIR_MAX是一个枚举类型ip_conntrack_dir位于include/linux/netfilter_ipv4/ip_conntrack_tuple.h,Line65的第3个成员,从这个结构实例在源

3、码中的使用看来,实际上这是定义了两个tuple多元组的hash表项tuplehashIP_CT_DIR_ORIGINAL/0和tuplehashIP_CT_DIR_REPLY/1,利用两个不同方向的tuple定位一个连接,同时也可以方便地对ORIGINAL以及REPLY两个方向进行追溯*/struct ip_conntrack_tuple_hash tuplehashIP_CT_DIR_MAX;/* 这是一个位图,是一个状态域。在实际的使用中,它通常与一个枚举类型ip_conntrack_status位于include/linux/netfilter_ipv4/ip_conntrack.h,L

4、ine33进行位运算来判断连接的状态。其中主要的状态包括:IPS_EXPECTED,表示一个预期的连接IPS_SEEN_REPLY,表示一个双向的连接IPS_ASSURED,表示这个连接即使发生超时也不能提早被删除IPS_CONFIRMED,表示这个连接已经被确认初始包已经发出 */unsigned long status;/*其类型timer_list位于include/linux/timer.h,Line11,其核心是一个处理函数。这个成员表示当发生连接超时时,将调用此处理函数*/struct timer_list timeout;/*所谓预期的连接的链表,其中存放的是我们所期望的其它相关

5、连接*/struct list_head sibling_list;/*目前的预期连接数量*/unsigned int expecting;/*结构ip_conntrack_expect位于ip_conntrack.h,这个结构用于将一个预期的连接分配给现有的连接,也就是说本连接是这个master的一个预期连接*/struct ip_conntrack_expect *master;/* helper模块。这个结构定义于ip_conntrack_helper.h,这个模块提供了一个可以用于扩展Conntrack功能的接口。经过连接跟踪HOOK的每个数据报都将被发给每个已经注册的helper模块

6、注册以及卸载函数分别为ip_conntrack_helper_register以及ip_conntrack_helper_unregister,分别位于ip_conntrack_core.c。这样我们就可以进行一些动态的连接管理了*/struct ip_conntrack_helper *helper;/*一系列的nf_ct_info类型定义于include/linux/skbuff.h ,Line92,实际上就是nf_conntrack结构的结构,每个结构对应于某种状态的连接。这一系列的结构会被sk_buff结构的nfct指针所引用,描述了所有与此连接有关系的数据报。其状态由枚举类型ip_c

7、onntrack_info定义位于include/linux/netfilter_ipv4/ip_conntrack.h,Line12共有5个成员:IP_CT_ESTABLISHED:数据报属于已经完全建立的连接IP_CT_RELATED:数据报属于一个新的连接,但此连接与一个现有连接相关预期连接;或者是ICMP错误IP_CT_NEW:数据报属于一个新的连接IP_CT_IS_REPLY:数据报属于一个连接的回复IP_CT_NUMBER:不同IP_CT类型的数量,这里为7,NEW仅存于一个方向上 */struct nf_ct_info infosIP_CT_NUMBER;/* 为其他模块保留的部

8、分 */union ip_conntrack_proto proto;union ip_conntrack_help help;#ifdef CONFIG_IP_NF_NAT_NEEDEDstruct struct ip_nat_info info;union ip_conntrack_nat_help help;#if defined | definedint masq_index;#endif#if defined | defined struct ip_nat_rtsp_info rtsp_info;#endif nat;#endif /* CONFIG_IP_NF_NAT_NEEDED

9、 */#if definedunsigned long mark;#endif;struct ip_conntrack_tuple_hash结构描述链表中的节点,这个数组包含初始和应答两个成员tuplehashIP_CT_DIR_ORIGINAL和tuplehashIP_CT_DIR_REPLY,所以,当一个数据包进入连接跟踪模块后,先根据这个数据包的套接字对转换成一个初始的tuple,赋值给tuplehashIP_CT_DIR_ORIGINAL,然后对这个数据包取反,计算出应答的tuple,赋值给tuplehashIP_CT_DIR_REPLY,这样,一条完整的连接已经跃然纸上了。enum

10、ip_conntrack_dirIP_CT_DIR_ORIGINAL,IP_CT_DIR_REPLY,IP_CT_DIR_MAX;2. 连接跟踪表Netfilter用来源地址/来源端口+目的地址/目的端口,即一个tuple,来唯一标识一个连接。用一张连接跟踪表来描述所有的连接状态,该表用了hash算法。hash表用一个全局指针来描述struct list_head *ip_conntrack_hash;表的大小,即hash节点的个数由ip_conntrack_htable_size全局变量决定,默认是根据内存计算出来的。而每个hash节点又是一条链表的首部,所以,连接跟踪表就是一个由ip_co

11、nntrack_htable_size 条链表构成的一个hash表,整个连接跟踪表大小使用全局变量ip_conntrack_max描述,与hash表的关系是ip_conntrack_max = 8 * ip_conntrack_htable_size。链表的每个节点,都是一个ip_conntrack_tuple_hash结构:struct ip_conntrack_tuple_hash/* 用来组织链表 */struct list_head list;/* 用来描述一个tuple */struct ip_conntrack_tuple tuple;/* this = &ctrack-tuple

12、hashDIRECTION. */struct ip_conntrack *ctrack;实际描述一个tuple的是ip_conntrack_tuple结构 ip_conntrack_tuple.hstruct ip_conntrack_tuple/* 源 */struct ip_conntrack_manip src;/* These are the parts of the tuple which are fixed. */struct /* 目的地址 */u_int32_t ip;union /* Add other protocols here. */u_int64_t all;str

13、uct u_int16_t port; tcp;struct u_int16_t port; udp;struct u_int8_t type, code; icmp;struct u_int16_t protocol;u_int8_t version;u_int32_t key; gre;struct u_int16_t spi; esp; u;/* 协议类型 */u_int16_t protonum; dst;对于所有IP协议,协议类型、源地址、目的地址这三个参数是识别连接所必须的,具体到各个协议,就要提取出各协议的唯一特征数据,如TCP、UDP的源端口、目的端口,ICMP的ID、TYPE

14、、CODE等值,这些值就是tuple结构要处理的数据。各协议相关数据是以联合union形式定义在tuple结构中的,netfilter缺省支持TCP、UDP和ICMP协议,如果还要支持其他IP协议,如GRE、ESP、AH、SCTP等,需要在联合中添加相应的协议参数值。ip_conntrack_manip和ip_conntrack_manip_proto ip_conntrack_tuple.hstruct ip_conntrack_manipu_int32_t ip;union ip_conntrack_manip_proto u;union ip_conntrack_manip_proto/

15、* Add other protocols here. */u_int32_t all;struct u_int16_t port; tcp;struct u_int16_t port; udp;struct u_int16_t id; icmp;struct u_int32_t key; gre;struct u_int16_t spi; esp;Netfilter将每一个数据包转换成tuple,再根据tuple计算出hash值,这样,就可以使用ip_conntrack_hashhash_id找到hash表中链表的入口,并组织链表;找到hash表中链表入口后,如果链表中不存在此tuple,则

16、是一个新连接,就把tuple插入到链表的合适位置;两个节点tupleORIGINAL和tupleREPLY虽然是分开的,在两个链表当中,但是如前所述,它们同时又被封装在ip_conntrack结构的tuplehash数组中3.连接跟踪初始化初始化函数init调用init_or_cleanup函数 ip_conntrack_standalone.cstatic int _init initreturn init_or_cleanup;3.1 init_or_cleanup函数int init_or_cleanup函数,ip_conntrack_standalone.c参数为1则执行init,为0

17、则执行clean,它主要做三件工作:1调用ip_conntrack_init初始化连接跟踪表的相关变量,见3.2 2初始化proc文件系统节点3为连接跟踪注册hookstatic int init_or_cleanupstruct proc_dir_entry *proc;int ret = 0;if goto cleanup;/* 初始化连接跟踪的一些变量和数据结构,如连接跟踪表的大小,Hash表的大小等 */ret = ip_conntrack_init;if ret goto cleanup_nothing;/* 初始化proc文件系统 */proc = proc_net_create;

18、proc = proc_net_create;if goto cleanup_init;proc-owner = THIS_MODULE;/* 为连接跟踪注册hook,一共六个,所在的hook点、注册的hook函数和优先级分别如下和最开始的图是一致的:NF_IP_PRE_ROUTING:ip_conntrack_defrag NF_IP_PRI_CONNTRACK_DEFRAGip_conntrack_in NF_IP_PRI_CONNTRACKNF_IP_LOCAL_OUT:ip_conntrack_defrag NF_IP_PRI_CONNTRACK_DEFRAGip_conntrack_

19、local NF_IP_PRI_CONNTRACKNF_IP_POST_ROUTING:ip_refrag NF_IP_PRI_LASTNF_IP_LOCAL_IN:ip_confirm NF_IP_PRI_LAST-1优先级的顺序为:NF_IP_PRI_FIRST 最高NF_IP_PRI_CONNTRACK_DEFRAGNF_IP_PRI_CONNTRACK NF_IP_PRI_MANGLENF_IP_PRI_NAT_DSTNF_IP_PRI_FILTER NF_IP_PRI_NAT_SRCNF_IP_PRI_LAST 最低我们知道,LOCAL_OUT和PRE_ROUTING点可以看作是ne

20、tfilter的入口,而POST_ROUTING和LOCAL_IN可以看作是出口。也就是说,在每个数据包刚一进入netfilter之后首先都会调用ip_conntrack_defrag做分片处理,紧接着就是对收到的和发出的数据包分别进行ip_conntrack_in和ip_conntrack_loaclip_conntrack_loacl里还是调用了ip_conntrack_in。而在数据包即将离开netfilter之前,会对进入主机的数据包进行ip_confirm处理,对发出的数据包进行ip_refrag处理ip_refrag里也会调用ip_confirm。这就是整个连接跟踪模块在netfi

21、lter中的分布情况。另外,我们分析的是的内核,在中,这个地方还增加了两个hook,分别是ip_conntrack_helper_out_ops和ip_conntrack_helper_in_ops。将helper模块相关的处理提前了。 */ret = nf_register_hook;if ret printk;goto cleanup_proc;ret = nf_register_hook;if ret printk;goto cleanup_defragops;ret = nf_register_hook;if ret printk;goto cleanup_defraglocalops

22、;ret = nf_register_hook;if ret printk;goto cleanup_inops;ret = nf_register_hook;if ret printk;goto cleanup_inandlocalops;ret = nf_register_hook;if ret printk;goto cleanup_inoutandlocalops;#ifdef CONFIG_SYSCTLip_ct_sysctl_header = register_sysctl_table;if printk;goto cleanup;#endifreturn ret; cleanup

23、:#ifdef CONFIG_SYSCTL unregister_sysctl_table;#endifnf_unregister_hook; cleanup_inoutandlocalops:nf_unregister_hook; cleanup_inandlocalops:nf_unregister_hook; cleanup_inops:nf_unregister_hook; cleanup_defraglocalops:nf_unregister_hook; cleanup_defragops:nf_unregister_hook; cleanup_proc:proc_net_remo

24、ve;proc_net_remove; cleanup_init:ip_conntrack_cleanup; cleanup_nothing:return ret;3.2 ip_conntrack_init 函数ip_conntrack_init 函数ip_conntrack_core.c用于初始化连接跟踪的包括hash表相关参数在内一些重要的变量:int _init ip_conntrack_initunsigned int i;int ret;/* Idea from tcp.c: use 1/16384 of memory. On i386: 32MB * machine has 256

25、 buckets. = 1GB machines have 8192 buckets. */* 如果指定hash表的大小则用制定值,否则根据内存计算 */ if ip_conntrack_htable_size = hashsize; else ip_conntrack_htable_size= num_physpages / 16384 / sizeof;if ip_conntrack_htable_size = 8192;if ip_conntrack_htable_size ip_conntrack_htable_size = 16;ip_conntrack_max = 8 * ip_c

26、onntrack_htable_size;#ifdef CONFIG_MIPS_BRCMip_conntrack_max=0;#endifprintkip_conntrack version %s - %Zd bytes per conntrackn, IP_CONNTRACK_VERSION, ip_conntrack_htable_size, ip_conntrack_max, sizeof;/*注册socket选项*/ret = nf_register_sockopt;if printk;return ret;/* 为hash表分配连续内存页 */ip_conntrack_hash =

27、vmallocsizeof * ip_conntrack_htable_size;if printk;goto err_unreg_sockopt;/* 分配高速缓存 */ip_conntrack_cachep = kmem_cache_createip_conntrack, sizeof, 0, SLAB_HWCACHE_ALIGN,NULL, NULL;if printk;goto err_free_hash;/* Dont NEED lock here, but good form anyway. */WRITE_LOCK;/* netfilter中对每个要进行跟踪的IP协议定义了一个i

28、p_conntrack_protocol结构,每个IP协议的连接跟踪处理就是要填写这样一个结构,这里的ip_conntrack_protocol_tcp,ip_conntrack_protocol_udp等都是这个结构,用list_append将这些需要跟踪的协议组织成链表 */list_append;list_append;list_append;list_append;WRITE_UNLOCK;/* 初始化hash表 */for i = 0; i INIT_LIST_HEAD;/* For use by ipt_REJECT */ip_ct_attach = ip_conntrack_at

29、tach;/* Set up fake conntrack: - to never be deleted, not in any hashes */atomic_set;/* - and look it like as a confirmed connection */set_bit;/* - and prepare the ctinfo field for REJECT & NAT. */ip_conntrack_untracked.infosIP_CT_NEW.master =ip_conntrack_untracked.infosIP_CT_RELATED.master =ip_conn

30、track_untracked.infosIP_CT_RELATED + IP_CT_IS_REPLY.master = &ip_conntrack_untracked.ct_general;return ret;err_free_hash:vfree;err_unreg_sockopt:nf_unregister_sockopt;return -ENOMEM;4协议的扩展,ip_conntrack_protocol结构各种协议使用一个全局的协议列表存放,即protocol_listip_conntrack_core.h,使用结构ip_conntrack_protocol来表示ip_connt

31、rack_protocol.hstruct ip_conntrack_protocol/* Next pointer. */struct list_head list;/* Protocol number. */u_int8_t proto;/* Protocol name */const char *name;/* 其指向函数的作用是将协议加入到ip_conntrack_tuple的dst子结构中*/int ;/* 其指向函数的作用是将源和目的多元组中协议部分的值进行互换,包括IP地址、端口等 */int ;/* 打印多元组中的协议信息*/unsigned int ;/* 打印整个连接记录*

32、/unsigned int ;/* 判断数据包是否合法,并调整相应连接的信息,也就是实现各协议的状态检测,对于UDP等本身是无连接的协议的判断比较简单,netfilter建立一个虚拟连接,每个新发包都是合法包,只等待回应包到后连接都结束;但对于TCP之类的有状态协议必须检查数据是否符合协议的状态转换过程,这是靠一个状态转换数组实现的。返回数据报的verdict值 */int ;/* 当此协议的一个新连接发生时,调用其指向的这个函数,调用返回true时再继续调用packet函数*/int ;/* 删除一个连接状态*/void ;/* 判断是否有数据报匹配预期的连接*/int ;/ * 指向模块本

33、身,统计模块是否被使用 */struct module *me;要编写自己的IP协议跟踪模块,先要分析这些协议头中哪些信息可以用来唯一识别连接,作NAT时要修改哪些信息,把这些信息添加到ip_conntrack_tuple结构的联合中;然后填写该协议的ip_conntrack_protocol结构,实现结构中的内部函数;最后在ip_conntrack_init函数中用list_append将此结构挂接到协议跟踪链表中,也可以在各自的模块初始化时用ip_conntrack_protocol_register和ip_conntrack_protocol_unregister来添加/删除协议。5两个

34、主要的连接跟踪函数: ip_conntrack_in和ip_confirmip_conntrack_in函数ip_conntrack_core.c接收倒的数据包进入Netfilter后,首先进行分片处理,然后就会调用ip_conntrack_in函数, ip_conntrack_in 主要完成的工作就是判断数据包是否已在连接跟踪表中,如果不在,则为数据包分配ip_conntrack,并初始化它,然后,为这个数据包设置连接状态。unsigned int ip_conntrack_inunsigned int hooknum, struct sk_buff *pskb, const struct

35、net_device *in, const struct net_device *out, int struct ip_conntrack *ct;enum ip_conntrack_info ctinfo;struct ip_conntrack_protocol *proto;int set_reply;int ret;/* 分片包会在前一个Hook中被处理,事实上,并不会触发该条件 */if -nh.iph-frag_off & htons return NF_ACCEPT;if net_ratelimit printkKERN_ERR ip_conntrack_in: Frag of p

36、roto %u n, -nh.iph-protocol, hooknum;return NF_DROP;/* 将当前数据包设置为未修改 */-nfcache |= NFC_UNKNOWN;/* 判断当前数据包是否已被检查过了 */if -nfctreturn NF_ACCEPT;/* 根据当前数据包的协议,查找与之相应的struct ip_conntrack_protocol结构 */proto = ip_ct_find_proto-nh.iph-protocol;/* 如果是icmp错误报文 */if -nh.iph-protocol = IPPROTO_ICMP & icmp_error_

37、trackreturn NF_ACCEPT;/* 在全局的连接表中,查找与当前包相匹配的连接结构,返回的是struct ip_conntrack *类型指针,它用于描述一个数据包的连接状态 */if !ct = resolve_normal_ctreturn NF_ACCEPT;if IS_ERRreturn NF_DROP;IP_NF_ASSERT-nfct;/* 如果注册了相应的协议的ip_conntrack_protocol结构,则在这里调用其中的packet函数做一些检查 */ret = proto-packet;if /* Invalid */nf_conntrack_put-nfc

38、t;-nfct = NULL;return NF_ACCEPT;/* 如果注册了相应协议的ip_conntrack_helper结构,则在这里调用其help函数 */if helper ret = ct-helper-help;if /* Invalid */nf_conntrack_put-nfct;-nfct = NULL;return NF_ACCEPT;if set_bitstatus;return ret;连接跟踪模块将所有支持的协议,都使用struct ip_conntrack_protocol 结构封装,注册至全局链表中,这里首先调用函数ip_ct_find_proto根据当前数

39、据包的协议值,找到协议注册对应的模块。然后调用resolve_normal_ct 函数进一步处理。5.12 resolve_normal_ct函数 ip_conntrack_core.c 函数判断数据包在连接跟踪表是否存在,如果不存在,则为数据包分配相应的连接跟踪节点空间并初始化,然后设置连接状态。static inline struct ip_conntrack *resolve_normal_ctstruct ip_conntrack_tuple tuple;struct ip_conntrack_tuple_hash *h;IP_NF_ASSERTnh.iph-frag_off & ht

40、ons = 0;/* 将数据包转换成tuple */if !get_tuplenh.iph, skb, skb-nh.iph-ihl*4, &tuple, protoreturn NULL;/* 查找对应的tuple在连接跟踪表中是否存在 */h = ip_conntrack_find_get;/* 如果不存在,初始化该连接 */if h = init_conntrack;if return NULL;if IS_ERRreturn h;/* 判断连接方向 */if DIRECTION = IP_CT_DIR_REPLY *ctinfo = IP_CT_ESTABLISHED + IP_CT_

41、IS_REPLY;/* Please set reply bit if this packet OK */*set_reply = 1; else /* Once weve had two way comms, always ESTABLISHED. */if test_bitctrack-status DEBUGPctrack; *ctinfo = IP_CT_ESTABLISHED; else if test_bitctrack-status DEBUGPctrack;*ctinfo = IP_CT_RELATED; else DEBUGPctrack;*ctinfo = IP_CT_NE

42、W;*set_reply = 0;/* 设置skb的对应成员,如使用计数器、数据包状态标记 */skb-nfct = &h-ctrack-infos*ctinfo;return h-ctrack;获取tuple结构 ip_conntrack_core.cget_tuple函数将数据包转换成tuple结构int get_tuple/* Never happen */if frag_off & htons printkprotocol;return 0;/* 设置来源、目的地址和协议号 */tuple-src.ip = iph-saddr;tuple-dst.ip = iph-daddr;tupl

43、e-dst.protonum = iph-protocol;tuple-src.u.all = tuple-dst.u.all = 0;/* 这里根据协议的不同调用各自的函数 */return protocol-pkt_to_tuple;以tcp协议为例,ip_conntrack_proto_tcp.c :static int tcp_pkt_to_tuplestruct tcphdr hdr;/* Actually only need first 8 bytes. */if skb_copy_bits != 0return 0;/* 根据报头的端口信息,设置tuple对应成员 */tuple

44、-src.u.tcp.port = hdr.source;tuple-dst.u.tcp.port = hdr.dest;return 1;搜索hash表要对Hash表进行遍历,首要需要找到hash表的入口,然后来遍历该入口指向的链表。每个链表的节点是struct ip_conntrack_tuple_hash,它封装了tuple,所谓封装,就是把待查找的tuple与节点中已存的tuple相比较。struct ip_conntrack_tuple_hash *ip_conntrack_find_getstruct ip_conntrack_tuple_hash *h;READ_LOCK;/*

45、查找整个hash表,返回一个节点 */h = _ip_conntrack_find;/* 找到则累加计数器 */if atomic_incctrack-ct_general.use;READ_UNLOCK;return h;计算hash值,是调用hash_conntrack函数,根据数据包对应的tuple实现的:static struct ip_conntrack_tuple_hash *_ip_conntrack_findstruct ip_conntrack_tuple_hash *h;/* 计算tuple的hash值,这样,tuple对应的hash表入口即为ip_conntrack_hashhash,也就是链表的首节点 */unsigned int hash = hash_conntrack;MUST_BE_READ_LOCKED;/* 找到链表入口后遍历链表,返回一个节点。比较函数是conntrack_tuple_cmp */h = LIST_FIND;return h;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!