(一)洞悉linux下的Netfilter&iptables:什么是Netfilter?

LINUX环境编程 专栏收录该内容
46 篇文章 0 订阅

    本人研究linux的防火墙系统也有一段时间了,由于近来涉及到的工作比较纷杂,久而久之怕生熟了。趁有时间,好好把这方面的东西总结一番。一来是给自己做个沉淀,二来也欢迎这方面比较牛的前辈给小弟予以指点,共同学习,共同进步。

    能在CU上混的人绝非等闲之辈。因此,小弟这里说明一下:本系列博文主要侧重于分析Netfilter的实现机制,原理和设计思想层面的东西,同时从用户态的iptables到内核态的Netfilter其交互过程和通信手段等。至于iptables的入门用法方面的东西,网上随便一搜罗就有一大堆,我这里不浪费笔墨了。

    很多人在接触iptables之后就会这么一种感觉:我通过iptables命令配下去的每一条规则,到底是如何生效的呢?内核又是怎么去执行这些规则匹配呢?如果iptables不能满足我当下的需求,那么我是否可以去对其进行扩展呢?这些问题,都是我在接下来的博文中一一和大家分享的话题。这里需要指出:因为NetfilterIP协议栈是无缝契合的,所以如果你要是有协议栈方面的基础,在阅读本文时一定会感觉轻车熟路。当然,如果没有也没关系,因为我会在关键点就协议栈的入门知识给大家做个普及。只是普及哦,不会详细深入下去的,因为涉及的东西太多了,目前我还正在研究摸索当中呢。好了,废话不多说,进入正题。

备注:我研究的内核版本是2.6.21iptables的版本1.4.0

 

什么是Netfilter

    为了说明这个问题,首先看一个网络通信的基本模型:

    在数据的发送过程中,从上至下依次是“加头”的过程,每到达一层数据就被会加上该层的头部;与此同时,接受数据方就是个“剥头”的过程,从网卡收上包来之后,在往协议栈的上层传递过程中依次剥去每层的头部,最终到达用户那儿的就是裸数据了。

那么,“栈”模式底层机制基本就是像下面这个样子:

对于收到的每个数据包,都从“A”点进来,经过路由判决,如果是发送给本机的就经过“B”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地是不本机,那么就经过“C”点,然后顺着“E”点将该包转发出去。

对于发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然后经过“D”点,最后也是顺着“E”点将该包发送出去。

协议栈那五个关键点ABCDE就是我们Netfilter大展拳脚的地方了。

NetfilterLinux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。Netfilter在内核中位置如下图所示:

这幅图,很直观的反应了用户空间的iptables和内核空间的基于Netfilterip_tables模块之间的关系和其通讯方式,以及Netfilter在这其中所扮演的角色。

回到前面讨论的关于协议栈那五个关键点“ABCDE”上来。Netfilternetfilter_ipv4.h中将这个五个点重新命了个名,如下图所示,意思我就不再解释了,猫叫咪咪而已:

在每个关键点上,有很多已经按照优先级预先注册了的回调函数(后面再说这些函数是什么,干什么用的。有些人喜欢把这些函数称为“钩子函数”,说的是同一个东西)埋伏在这些关键点,形成了一条链。对于每个到来的数据包会依次被那些回调函数“调戏”一番再视情况是将其放行,丢弃还是怎么滴。但是无论如何,这些回调函数最后必须向Netfilter报告一下该数据包的死活情况,因为毕竟每个数据包都是Netfilter从人家协议栈那儿借调过来给兄弟们Happy的,别个再怎么滴也总得“活要见人,死要见尸”吧。每个钩子函数最后必须向Netfilter框架返回下列几个值其中之一:

n  NF_ACCEPT 继续正常传输数据报。这个返回值告诉 Netfilter:到目前为止,该数据包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段。

n  NF_DROP 丢弃该数据报,不再传输。

n  NF_STOLEN 模块接管该数据报,告诉Netfilter“忘掉”该数据报。该回调函数将从此开始对数据包的处理,并且Netfilter应当放弃对该数据包做任何的处理。但是,这并不意味着该数据包的资源已经被释放。这个数据包以及它独自的sk_buff数据结构仍然有效,只是回调函数从Netfilter 获取了该数据包的所有权。

n  NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)

n  NF_REPEAT 再次调用该回调函数,应当谨慎使用这个值,以免造成死循环。

为了让我们显得更专业些,我们开始做些约定:上面提到的五个关键点后面我们就叫它们为hook点,每个hook点所注册的那些回调函数都将其称为hook函数。

Linux 2.6版内核的Netfilter目前支持IPv4IPv6以及DECnet等协议栈,这里我们主要研究IPv4协议。关于协议类型,hook点,hook函数,优先级,通过下面这个图给大家做个详细展示:

对于每种类型的协议,数据包都会依次按照hook点的方向进行传输,每个hook点上Netfilter又按照优先级挂了很多hook函数。这些hook函数就是用来处理数据包用的。

Netfilter使用NF_HOOK(include/linux/netfilter.h)宏在协议栈内部切入到Netfilter框架中。相比于2.4版本,2.6版内核在该宏的定义上显得更加灵活一些,定义如下:

#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \

         NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, INT_MIN)

关于宏NF_HOOK各个参数的解释说明:

1)         pf:协议族名,Netfilter架构同样可以用于IP层之外,因此这个变量还可以有诸如PF_INET6PF_DECnet等名字。

2)         hookHOOK点的名字,对于IP层,就是取上面的五个值;

3)         skb:不解释;

4)         indev:数据包进来的设备,以struct net_device结构表示;

5)         outdev:数据包出去的设备,以struct net_device结构表示;

(后面可以看到,以上五个参数将传递给nf_register_hook中注册的处理函数。)

6)         okfn:是个函数指针,当所有的该HOOK点的所有登记函数调用完后,转而走此流程。

NF_HOOK_THRESH又是一个宏:

#define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh)                \

({int __ret;                                                                                \

if ((__ret=nf_hook_thresh(pf, hook, &(skb), indev, outdev, okfn, thresh, 1)) == 1)\

         __ret = (okfn)(skb);                                                       \

__ret;})

我们发现NF_HOOK_THRESH宏只增加了一个thresh参数,这个参数就是用来指定通过该宏去遍历钩子函数时的优先级,同时,该宏内部又调用了nf_hook_thresh函数:

static inline int nf_hook_thresh(int pf, unsigned int hook,

                            struct sk_buff **pskb,

                            struct net_device *indev,

                            struct net_device *outdev,

                            int (*okfn)(struct sk_buff *), int thresh,

                            int cond)

{

if (!cond) 

return 1;

#ifndef CONFIG_NETFILTER_DEBUG

if (list_empty(&nf_hooks[pf][hook]))

         return 1;

#endif

return nf_hook_slow(pf, hook, pskb, indev, outdev, okfn, thresh);

}

这个函数又只增加了一个参数cond,该参数为0则放弃遍历,并且也不执行okfn函数;为1则执行nf_hook_slow去完成钩子函数okfn的顺序遍历(优先级从小到大依次执行)

net/netfilter/core.h文件中定义了一个二维的结构体数组,用来存储不同协议栈钩子点的回调处理函数。

struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS];

其中,行数NPROTO32,即目前内核所支持的最大协议簇;列数NF_MAX_HOOKS为挂载点的个数,目前在2.6内核中该值为8nf_hooks数组的最终结构如下图所示。

include/linux/socket.hIP协议AF_INET(PF_INET)的序号为2,因此我们就可以得到TCP/IP协议族的钩子函数挂载点为:

PRE_ROUTING     nf_hooks[2][0]

LOCAL_IN        nf_hooks[2][1]

FORWARD      nf_hooks[2][2]

LOCAL_OUT      nf_hooks[2][3]

POST_ROUTING          nf_hooks[2][4]

同时我们看到,在2.6内核的IP协议栈里,从协议栈正常的流程切入到Netfilter框架中,然后顺序、依次去调用每个HOOK点所有的钩子函数的相关操作有如下几处:

       1)、net/ipv4/ip_input.c里的ip_rcv函数。该函数主要用来处理网络层的IP报文的入口函数,它到Netfilter框架的切入点为:

NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,ip_rcv_finish)

根据前面的理解,这句代码意义已经很直观明确了。那就是:如果协议栈当前收到了一个IP报文(PF_INET),那么就把这个报文传到NetfilterNF_IP_PRE_ROUTING过滤点,去检查[R]在那个过滤点(nf_hooks[2][0])是否已经有人注册了相关的用于处理数据包的钩子函数。如果有,则挨个去遍历链表nf_hooks[2][0]去寻找匹配的match和相应的target,根据返回到Netfilter框架中的值来进一步决定该如何处理该数据包(由钩子模块处理还是交由ip_rcv_finish函数继续处理)

[R]:刚才说到所谓的“检查”。其核心就是nf_hook_slow()函数。该函数本质上做的事情很简单,根据优先级查找双向链表nf_hooks[][],找到对应的回调函数来处理数据包:

struct list_head **i;

list_for_each_continue_rcu(*i, head) {

struct nf_hook_ops *elem = (struct nf_hook_ops *)*i;

if (hook_thresh > elem->priority)

                  continue;

         verdict = elem->hook(hook, skb, indev, outdev, okfn);

         if (verdict != NF_ACCEPT) { … … }

    return NF_ACCEPT;

}

上面的代码是net/netfilter/core.c中的nf_iterate()函数的部分核心代码,该函数被nf_hook_slow函数所调用,然后根据其返回值做进一步处理。

2)、net/ipv4/ip_forward.c中的ip_forward函数,它的切入点为:

NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, rt->u.dst.dev,ip_forward_finish);

在经过路由抉择后,所有需要本机转发的报文都会交由ip_forward函数进行处理。这里,该函数由NF_IP_FOWARD过滤点切入到Netfilter框架,在nf_hooks[2][2]过滤点执行匹配查找。最后根据返回值来确定ip_forward_finish函数的执行情况。

3)、net/ipv4/ip_output.c中的ip_output函数,它切入Netfilter框架的形式为:

NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev,ip_finish_output,

                                !(IPCB(skb)->flags & IPSKB_REROUTED));

这里我们看到切入点从无条件宏NF_HOOK改成了有条件宏NF_HOOK_COND,调用该宏的条件是:如果协议栈当前所处理的数据包skb中没有重新路由的标记,数据包才会进入Netfilter框架。否则直接调用ip_finish_output函数走协议栈去处理。除此之外,有条件宏和无条件宏再无其他任何差异。

如果需要陷入Netfilter框架则数据包会在nf_hooks[2][4]过滤点去进行匹配查找。

4)、还是在net/ipv4/ip_input.c中的ip_local_deliver函数。该函数处理所有目的地址是本机的数据包,其切入函数为:

NF_HOOK(PF_INET, NF_IP_LOCAL_IN, skb, skb->dev, NULL,ip_local_deliver_finish);

发给本机的数据包,首先全部会去nf_hooks[2][1]过滤点上检测是否有相关数据包的回调处理函数,如果有则执行匹配和动作,最后根据返回值执行ip_local_deliver_finish函数。

5)、net/ipv4/ip_output.c中的ip_push_pending_frames函数。该函数是将IP分片重组成完整的IP报文,然后发送出去。进入Netfilter框架的切入点为:

NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output);

对于所有从本机发出去的报文都会首先去Netfilternf_hooks[2][3]过滤点去过滤。一般情况下来来说,不管是路由器还是PC中端,很少有人限制自己机器发出去的报文。因为这样做的潜在风险也是显而易见的,往往会因为一些不恰当的设置导致某些服务失效,所以在这个过滤点上拦截数据包的情况非常少。当然也不排除真的有特殊需求的情况。

 

小节:整个Linux内核中Netfilter框架的HOOK机制可以概括如下:

在数据包流经内核协议栈的整个过程中,在一些已预定义的关键点上PRE_ROUTINGLOCAL_INFORWARDLOCAL_OUTPOST_ROUTING会根据数据包的协议簇PF_INET到这些关键点去查找是否注册有钩子函数。如果没有,则直接返回okfn函数指针所指向的函数继续走协议栈;如果有,则调用nf_hook_slow函数,从而进入到Netfilter框架中去进一步调用已注册在该过滤点下的钩子函数,再根据其返回值来确定是否继续执行由函数指针okfn所指向的函数。

未完,待续

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

&lt;p style=";margin: 0cm; background: white;";>;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;本课程使用&lt;span lang=";EN-US";>;YOLOv5&lt;/span>;和&lt;span lang=";EN-US";>;DeepSORT&lt;/span>;对视频中的行人、车辆做多目标跟踪和计数,开展&lt;span lang=";EN-US";>;YOLOv5&lt;/span>;目标检测和&lt;span lang=";EN-US";>;DeepSORT&lt;/span>;多目标跟踪强强联手的应用。&lt;/span>;&lt;/p>; &lt;p style=";margin: 0cm; background: white;";>;&lt;span lang=";EN-US"; style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>; ;&lt;/span>;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;课程分别在&lt;/span>;&lt;span lang=";EN-US";>;&lt;span style=";box-sizing: border-box;";>;Windows&lt;/span>;和&lt;/span>;&lt;span lang=";EN-US"; style=";font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-color-alt: windowtext;";>;Ubuntu&lt;/span>;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;系统上做项目演示,并对&lt;span lang=";EN-US";>;DeepSORT&lt;/span>;原理和代码做详细解读(使用&lt;span lang=";EN-US";>;PyCharm&lt;/span>;单步调试讲解)。&lt;/span>;&lt;/p>; &lt;p style=";margin: 0cm; background: white;";>;&lt;span lang=";EN-US"; style=";font-size: 10.5pt; font-family: ';Arial';,sans-serif; color: black; mso-themecolor: text1;";>; ;&lt;/span>;&lt;/p>; &lt;p style=";margin: 0cm; background: white; box-sizing: border-box; font-variant-ligatures: normal; font-variant-caps: normal; orphans: 2; widows: 2; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; word-spacing: 0px;";>;&lt;span style=";box-sizing: border-box;";>;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;课程包括:&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;基础篇、实践篇、原理篇和代码解析篇。&lt;/span>;&lt;/span>;&lt;/span>;&lt;/p>; &lt;p style=";text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;";>;&lt;!-- [if !supportLists]-->;&lt;span lang=";EN-US"; style=";font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;";>;&lt;span style=";mso-list: Ignore;";>;Ÿ&lt;span style=";font: 7.0pt ';Times New Roman';;";>; ; &lt;/span>;&lt;/span>;&lt;/span>;&lt;!--[endif]-->;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;基础篇包括多目标跟踪任务介绍、数据集和评估指标;&lt;/span>;&lt;/p>; &lt;p style=";text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;";>;&lt;!-- [if !supportLists]-->;&lt;span lang=";EN-US"; style=";font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;";>;&lt;span style=";mso-list: Ignore;";>;Ÿ&lt;span style=";font: 7.0pt ';Times New Roman';;";>; ; &lt;/span>;&lt;/span>;&lt;/span>;&lt;!--[endif]-->;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;实践篇包括&lt;/span>;&lt;span lang=";EN-US"; style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;Win10&lt;/span>;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;和&lt;span lang=";EN-US";>;Ubuntu&lt;/span>;系统上的&lt;span lang=";EN-US";>;YOLOv5+DeepSORT&lt;/span>;的多目标跟踪和计数具体的实践操作步骤演示,特别是对行人、车辆的&lt;span lang=";EN-US";>;ReID&lt;/span>;数据集讲解了训练方法;&lt;/span>;&lt;/p>; &lt;p style=";text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;";>;&lt;!-- [if !supportLists]-->;&lt;span lang=";EN-US"; style=";font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;";>;&lt;span style=";mso-list: Ignore;";>;Ÿ&lt;span style=";font: 7.0pt ';Times New Roman';;";>; ; &lt;/span>;&lt;/span>;&lt;/span>;&lt;!--[endif]-->;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;原理篇中讲解了马氏距离、匈牙利算法、卡尔曼滤波器的原理,并解读了&lt;span lang=";EN-US";>;SORT&lt;/span>;和&lt;span lang=";EN-US";>;DeepSORT&lt;/span>;论文;&lt;/span>;&lt;/p>; &lt;p style=";text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;";>;&lt;!-- [if !supportLists]-->;&lt;span lang=";EN-US"; style=";font-size: 14.0pt; mso-bidi-font-size: 12.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;";>;&lt;span style=";mso-list: Ignore;";>;Ÿ&lt;span style=";font: 7.0pt ';Times New Roman';;";>; ; &lt;/span>;&lt;/span>;&lt;/span>;&lt;!--[endif]-->;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;代码解析篇中使用&lt;span lang=";EN-US";>;PyCharm&lt;/span>;单步调试对&lt;span lang=";EN-US";>;DeepSORT&lt;/span>;的代码逐个文件进行讲解。课程提供注释后的代码。&lt;/span>;&lt;/p>; &lt;p style=";text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;";>;&lt;span style=";font-size: 10.5pt; font-family: ';微软雅黑';,sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;";>;&lt;img src=";https://img-bss.csdnimg.cn/202105101512471836.jpg"; alt=";课程内容"; />;&lt;/span>;&lt;/p>; &lt;p>;&lt;img src=";https://img-bss.csdnimg.cn/202105101513384587.jpg"; alt=";行人多目标跟踪"; />;&lt;/p>; &lt;p>;&lt;img src=";https://img-bss.csdnimg.cn/202105101514053124.jpg"; alt=";车辆计数"; />;&lt;/p>;
参与评论 您还未登录,请先 登录 后发表或查看评论
密码:看注释 解压密码146359085 《excel服务器2017程序v3.9》使用说明: 1、本程序支持《excel服务器2017、excel服务器2016、excel服务器2015、excel服务器2013、excel服务器2010》等最新版本版本,不支持excel服务器2019。 2、MSSQL请不要使用空密码,否则注册程序可能失效。 2、本程序没有注册的话,为试用版,用户数最大为10用户,注册后没有限制。 3、安装和装卸本程序时请先停止excel服务器2017的服务。 4、使用本程序时请先删除本软件以前的旧版本补丁。 5、如果载完整版的升级程序升级,前请先装卸本软件,更新升级后再使用用本软件安装解密。 6、本程序正式版分为标准版及加强版两个版本,标准版只能在你注册的电脑上生效,加强版可以通过面的操作为其他的excel服务器授权。 7、本程序及其相关内容信息只作为学习、测试使用,严禁用于其它用途!!!、 由于使用本程序而产生的任何后果,请您自已负责!  当您使用了本程序及其相关内容信息后,都将视为接受本警告并自愿承担所有责任!!! 3.9更新说明: 1、修改软件的解密方法,避免后期官方对本软件的检测。 2、修复已知BUG。 3、修复硬件码会变动失效的Bug。 4、新增加对聚表2.6.7的支持。 3.8更新说明: 1、支持《excel服务器2017》。 其他说明: 《excel服务器2016注册程序v3.9加强版》可以用面步骤为其他服务器授权: 1、在其他安装excel服务器的电脑上运行本软件及安装,并记硬件码; 2、到安装有正式注册版的那台电脑上运行本软件,把步骤1得到的硬件码填入软件界面上的硬件码位置,设置好选项,然后安装; 3、安装后,打开勤哲安装目录,在目录找到ESWint12.ini这个文件,把他复制出来。 4、回到步骤1的那台电脑上,把ESWint12.ini覆盖到勤哲的安装目录,停止excel服务器的服务并从新启动,如果以上步骤没有错误,那这时这台电脑上的excel服务器就是正式注册了。 5、注册时两台电脑要安装同版本的excel服务器。 《聚表企业版2.6.7》的使用方法: 1、找作者开通聚表权限。 2、在《nxcells服务器配置》复制出机器码,把机器码填入本软件《硬件码》中,版本选择《聚表企业版2.6.7》按安装即可生成授权。 3、把server.nks复制到聚表企业版2.6.7的server目录,从新启动服务即可。
&lt;span>; &lt;/span>; &lt;div>; 以通俗简介的方式,从浅入深介绍SVM原理和代码流程 让你从此不再惧怕SVM &lt;br />; &lt;/div>; &lt;div>; &lt;p>; &lt;br />; &lt;/p>; &lt;p>; &lt;br />; &lt;/p>; &lt;p>; &lt;strong>;&lt;span style=";color:#E53333;";>;视频部分:&lt;/span>;&lt;/strong>; &lt;/p>; &lt;/div>; 01_SVM之回顾梯度降原理&lt;br />; 02_SVM之回顾有约束的最优化问题&lt;br />; 03_SVM之回顾有约束的最优化问题-KKT几何解释&lt;br />; 04_SVM之回顾有约束的最优化问题-KKT数学解释&lt;br />; 05_SVM之回顾距离公式和感知器模型&lt;br />; 06_SVM之感知器到SVM的引入&lt;br />; 07_SVM之线性可分时损失函数的表示&lt;br />; 08_SVM之线性可分时损失函数的求解-对w,b变量求偏导&lt;br />; 09_SVM之线性可分时损失函数的求解-对&beta;变量求解.&lt;br />; 10_SVM之线性可分时算法整体流程&lt;br />; 11_SVM之线性可分时案例&lt;br />; 12_SVM之线性不可分时软间隔介绍&lt;br />; 13_SVM之线性不可分时软间隔优化目标&lt;br />; 14_SVM之线性不可分时软间隔算法整体流程&lt;br />; 15_SVM之线性不可分时数据映射高维解决不可分问题&lt;br />; 16_SVM之线性不可分时核函数引入&lt;br />; 17_SVM之线性不可分时核函数讲解&lt;br />; 18_SVM代码之线性可分时和Logistic回归比较&lt;br />; 19_SVM代码之基于鸢尾花数据多分类参数解释&lt;br />; 20_SVM代码之基于鸢尾花数据网格搜索选择参数&lt;br />; 21_SVM代码之不同分类器,核函数,C值的可视化比较&lt;br />; &lt;p>; 22_SVM之回归方式SVR &lt;/p>; &lt;p>; 23_SVM代码之SVR解决回归问题 &lt;/p>; 24_SVM之SMO思想引入&lt;br />; &lt;p>; 25_SVM之SMO案列讲解 &lt;/p>; &lt;p>; &lt;br />; &lt;/p>; &lt;p>; &lt;strong>;&lt;span style=";color:#E53333;";>;代码部分:&lt;/span>;&lt;/strong>; &lt;/p>; &lt;p>; &lt;img src=";https://img-bss.csdn.net/202005090648425294.png"; alt=";"; />; &lt;/p>; &lt;p>; &lt;br />; &lt;/p>; &lt;p>; &lt;strong>;&lt;span style=";color:#E53333;";>;资料部分:&lt;/span>;&lt;/strong>; &lt;/p>; &lt;p>; &lt;img src=";https://img-bss.csdn.net/202005090649458459.png"; alt=";"; />; &lt;/p>;
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

习惯就好zz

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值