SNMP Trap的session问题

news2024/11/24 12:30:07

1、前言

最近遇到了个问题,SNMPv3 Trap上报,在snmp agent侧修改了用户密码,管理站mibbroswer上没有修改trap用户的密码,仍然可接收到trap上报消息。通过Wireshark抓包,(编辑–首选项–Protocols–SNMP–Users Table编辑填写Engine ID、Username、Authentication model、Password、Privacy protocol、Privacy password),可以在抓包的时候将SNMP包解析出来,发现使用旧密码可以解析,但是新密码却无法解析,说明上报的trap消息SNMP报文是用旧密码加密的。<–c语言开发发送trap–>分析trap消息组包过程,可以发现用户信息及加密密钥是填写在session中,说明在用户配置改变时,会清理掉之前session然后重新打开一个新session(在项目中的方式)的流程没有生效,也即是旧session没有关掉仍然在使用。

以上就是遇到问题的简单分析过程,记录此文主要是想梳理一下snmp agent trap上报的过程,是怎么把trap消息发送出去的,以及接收端如何解包接收。(查询了很多文档,算是一点归纳记录)

2、SNMPv3安全传输机制

相关博客:
SNMP开发过程中的一些积累:https://blog.csdn.net/yyw794/article/details/78091545
SNMPv3的加密和认证:https://www.lmlphp.com/user/57883/article/item/600007/

3、SNMP Trap发送

3.1、使用 snmptrap 发送 SNMP Trap

本部分内容为摘自其他博客,本人并没有亲自测试,主要目的是表达如何利用snmptrap发送和接收trap报文,大致知道原理即可,如果要用snmptrap来进行trap发收,可以在查查其他博客详细学习。

(1)一台机器接收trap
利用 Net-snmp 提供的 snmptrapd 应用程序作为后台 SNMP Trap 服务器,负责接收被管理设备发送过来的 Trap 消息。
命令行窗口中输入以下命令:

 snmptrapd – c mysnmptrad.conf udp:162

该命令启动了一个 snmptrapd 进程,守候在 UDP 端口 162上,侦听 SNMP Trap 消息。-c 命令行指定了名为 mysnmptrapd.conf 的配置文件。文件内容如下:

$cat mysnmptrapd.conf 
 traphandle default lognotify IBM-DW-SAMPLE::nodeDown 
 authCommunity log,execute,net public

其中,以 traphandle 开头的一行定义了 snmptrapd 进程接收到 Trap 消息后应该执行的动作。在本例中,lognotify 是一个 shell 脚本,功能是将接收到的 Trap 信息写入文件 checkfile。
以 authCommunity 开头的一行配置了 snmptrapd 的安全设置,表示可以接收 community 为”public”的 SNMP Trap,并且本进程可以有 log,net 和 execute 的权限。

Log 权限表明收到 Trap 之后 snmptrapd 可以记录日志;execute 表明收到 Trap 之后可以执行 traphandle 中所指定的操作。Net 表示 snmptrapd 可以将接收到的 Trap 信息转发到其他的 Receiver 去。(假如需要转发,还需要对给定的 OID 指定以 forward 为开始的处理细节:forward OID|default DESTINATION)

Lognotify 脚本

 $cat lognotify 
 #!/bin/sh 
 
 read host 
 read ip 
 vars= 
 
 while read oid val 
 do 
   if [ "$vars" = "" ] 
   then 
     vars="$oid = $val"
   else 
     vars="$vars, $oid = $val"
   fi 
 done 
 
 echo trap: $1 $host $ip $vars >checkfile

————————————————
原文链接:https://blog.csdn.net/LANGGUANGCHENG/article/details/88948727

(2)另一台机器发送trap
假定 Trap 定义在文件 sample-trap.mib 中,可以使用命令行:

snmptrap -m ./sample- trap.mib  -v 2c -c public 16.157.76.227:1622 \ 
"" IBM-DW-SAMPLE::nodeDown     IBM-DW-SAMPLE::nodeDown.1 s "M1"

定义了一个 Trap 消息:nodeDown

Trap nodeDown 的 MIB 定义:
 nodeDown NOTIFICATION-TYPE 
    STATUS          current 
    DESCRIPTION     "node down notification"
 ::= { notification 1 }

nodeDown 被定义为 Notification 类型,即 SNMPv2 类型的 Trap。NodeDown 对象位于 notification 节点下,子 OID 为 1。字母 s 表示该 OID 的类型为 string。“M1”为该 OID 变量的值。

打开文件 checkfile,应该能够看到如下信息:
Trap: IBM-DW-SAMPLE::nodeDown UDP: [16.157.76.221]:
54329->[16.157.76.227]:1622 DISMAN-EVENT-MIB::sysUpTimeInstance=
5:2:22:26.99, SNMPv2-MIB::snmpTrapOID.0 = SNMPv2-SMI::
enterprises.10234.100.1 SNMPv2-SMI::enterprises.10234.100.1.1 =
“M1”
表示已经能够用 snmptrap 发送 Trap;并且能够使用 snmptrapd 来接收 Trap 消息了。此例虽然简单,但却是 SNMP Trap 的典型应用。实际生产环境中的 SNMP Trap 应用的基本模型和本例是类似的。

snmptrapd使用类似博客:
SNMP Trap (V1,V2, V3)总结:https://blog.csdn.net/Java_Vicky/article/details/120518497

3.2、C语言 SNMP Trap开发

有时可能不仅需要 net-snmp 所提供的现成工具,还需要在自己开发的应用程序中编码发送 Trap。Net-snmp 不仅提供了现成的工具,也提供了开发库,下面看看如何在 C 程序中调用 net-snmp 的库函数进行 SNMP Trap 的开发。
一次trap消息上报大致的流程为: 包含必要的netsnmp库头文件、初始化(主要是session)、创建pdu(填充信息内容)、发送trap、结束清理。
Note:项目中遇到的bug,就在于trap发送线程作为订阅者,while一直等待观察者是否有消息需要上报,如果有就组包发送。trap发送线程会去检查snmpv3 trap用户配置(包括用户名、鉴权加密算法、密码、EngineID等)是否改变,如果有改变则需要关闭之前的session,新建session。正是这个过程没有使新session生效,才导致开头提到的问题出现。

3.2.1 头文件

C 语言直接调用 API 进行 SNMP Trap 处理,所需要的头文件为了使用 netsnmp 的 API,必须 include 以下这些头文件:

#include <net-snmp/net-snmp-config.h> 
#include <net-snmp/net-snmp-includes.h>

3.2.2 初始化

在使用 netsnmp 库之前,先要做一些必要的初始化工作。函数 init_snmp 初始化 SNMP Library。假如在调用 init_snmp 函数时指定了文件名,init_snmp 函数将读取配置文件,设置诸如 Access Control 等具体配置。否则会使用默认的 /etc 下面的配置文件。

– init_snmp(“snmpapp”);没有太理解初始化SNMP Library的实质是啥,反正snmp_close(session)没有解决清除旧session的问题,就使用了snmp_shutdown( “snmpapp” );关闭之前的初始化, 然后使用新session之前再重新init_snmp(“snmpapp”);。有时间再研究一下…
//对 snmp 协议栈进行初始化,init_snmp();

初始化 SNMP 库之后,就可以打开一个会话 session。此后所有和 NMS 的信息交互都在该 session 内进行,因为可能在同一台机器上运行多个 SNMP 进程,每个进程都需要自己独立的 session 来和 NMS 进行信息交互。

调用函数 snmp_sess_init 成功后将返回一个 session 数据结构。用该数据结构来设置 session 的属性,比如 peer 的 IP 信息。还可以设置其它的必要信息,比如 Community,即用于 SNMP 安全的社区设置,前面 snmptrapd 设置为 public,因此这里也设置为 public。这类似于通行密码,不过安全性的确比较弱。(snmpv3 初始化session过程,可参考另一篇博客:https://blog.csdn.net/chengwenyao18/article/details/7319732)
Session 属性设置好之后便可以使用函数 snmp_open 打开 session。示例代码如下:

init_snmp("myexample");
struct snmp_session session;
snmp_sess_init(&session);

session.version = SNMP_VERSION_2c;
strcpy(peername,"16.157.76.227:1622");
strcpy(commu,"public");
session.peername = peername;
session.community = (unsigned char*)commu;
session.community_len = strlen(commu);
ss = snmp_open(&session);

打开一个会话之后,程序可以通过该会话发送 Trap 给 NMS,也可以从 NMS 接受 SNMP get/set 操作。

3.2.3 创建pdu报文

每个 Trap 都由 PDU 承载,PDU 有固定的格式。 为了简化描述,本文只描述 SNMPv2 的 Trap 发送方法。SNMP v2c 和 v1 、v3的 Trap 有所不同。
SNMPv2 的 Trap PDU 定义如下:
在这里插入图片描述
详情见“TCP/IP详解 卷一 --------SNMP”:https://blog.csdn.net/yao_fairy/article/details/51325698

各个组成部分的解释如下: sysUpTime– 被管理设备上一次初始化网络到本 Trap 发送以来的累积时间。 snmpTrapOID– 表示本 PDU 是一个 Trap,有固定的值。对于一般的 Trap,RFC1907 给出了通用的定义。用户自定义的 Trap 通常是由以下几个部分连接而成:SNMPv1 Enterprise parameter + ‘0’ + SNMPv1 Specific trap code。 VarBindList– 变量列表,所谓变量就是 Trap 消息中所携带的信息单元。

//下面的代码片断用来填充如图三所示的一个 PDU。
  oid objid_sysuptime[] = { 1, 3, 6, 1, 2, 1, 1, 3, 0 }; 
  oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; 
  netsnmp_pdu * pdu = NULL; 
  oid tmpOID[MAX_OID_LEN]; 
  size_t tmpOID_len; 
  in_addr_t addr; 

  pdu = snmp_pdu_create(SNMP_MSG_TRAP2); 
  long sysuptime; 
  char tempbuf[128]; 
  memset(tempbuf,128,0); 
  sprintf(tempbuf,"%ld",sysuptime); 
  sysuptime = get_uptime(); 
  oid tmpOID[MAX_OID_LEN]; 
  size_t tmpOID_len; 
  tmpOID_len = MAX_OID_LEN; 
  if(!snmp_parse_oid(TRAP_NAME_1, tmpOID, &tmpOID_len)) 
 snmp_error(“snmp_parse_oid”); 
  snmp_add_var(pdu, objid_sysuptime, sizeof(objid_sysuptime)/sizeof(oid), 't', tempbuf); 
  snmp_add_var(pdu, objid_snmptrap, sizeof(objid_snmptrap)/sizeof(oid),'o', 
               “IBM-DW-SAMPLE::nodeDown”);

首先调用函数 snmp_pdu_create 创建一个 SNMPv2 的 Trap PDU。然后调用 snmp_add_var 向该 PDU 中添加图三所示的三个部分。 sysUpTime 在 SNMPv2-MIB 中定义,其 OID 为”1.3.6.1.2.1.1.3.0”。我们只需要通过 get_uptime() 函数获得该值,然后调用 snmp_add_var 将该变量加入刚才创建的 PDU 中。

同理,snmpTrapOID 也是固定的 :” 1.3.6.1.6.3.1.1.4.1.0”。同样利用 snmp_add_var 函数将我们定义的 OID 为“IBM-DW-SAMPLE::nodeDown”的 Trap 加入该 PDU。稍稍留意一下,您应该可以发现,sysUpTime 的类型为’t’,即 timestamp;而 snmpTrapOID 的类型为’ o ’,即 OID 类型。PDU 内的每一个元素都拥有自己的类型。在该 Trap 中,我们还打算携带两个变量:IBM-DW-SAMPLE::host 和 IBM-DW-SAMPLE::ip。表示一些真正有趣的信息。添加这两个变量的代码如下所示:

HP-DW-SAMPLE::ip",varId,&varIdLen)) 
    { 
      snmp_perror("ip"); 
    } 
    else 
    { 
       printf("Success snmp_parse_oid\n"); 
       snmp_add_var(pdu, varId, sizeof(varId)/sizeof(oid),'s',"2.2.2.2"); 
    } 
    if(!snmp_parse_oid("HP-DW-SAMPLE::host",varId,&varIdLen)) 
    { 
      snmp_perror("host"); 
    } 
    else 
    { 
       retv =  snmp_add_var(pdu, varId, sizeof(varId)/sizeof(oid),'s',”M1”); 
 }

用 snmp_parse_oid 解析相应变量的 OID,然后就可以调用 snmp_add_var 将您想设置的值加入 PDU 中了。假如您直接在代码中使用”HP-DW-SAMPLE::ip”的 OID,(即 1.3.6.1.4.1.10234.10.2),那么可以不需要调用 snmp_parse_oid。该函数只是把一个好记的字符串翻译为一串数字的 OID。不过这就好比用 16.157.1.2 而不使用 www.ibm.com 一样。

3.2.4 发送Trap

至此,一个 SNMP Trap PDU 就创建成功了。将该 PDU 发送出去即可:

  if( !snmp_send(session, pdu) ) 
  { 
    snmp_error("Send pdu error \n"); 
  }

3.2.5 结束清理

程序结束之前需要做清理工作,代码如下:
snmp_close(sptr);
snmp_shutdown( “myexample” );
SOCK_CLEANUP;

3.2.6 小结

利用netsnmp开发,就是调用snmp api库函数实现即可,参照标准的流程,可实现set、get、trap等开发。没有仔细梳理,把看过有用的都记录下来了,反正核心思想就是 参考流程 一步步开发就是了,类似于建立 socket 发送数据道理一样。有时间再仔细整理一下…

流程:https://www.cnblogs.com/YBhello/articles/5465507.html
SNMPv3 Get报文构建可参考:https://blog.csdn.net/chengwenyao18/article/details/7319732
net-snmp配置开发:https://dandelioncloud.cn/article/details/1572239455459438593
net-snmp简单例子:https://blog.csdn.net/wangcg123/article/details/52949285

介绍头文件#include<net-snmp-includes.h>库函数:https://www.cnblogs.com/cqx6388/p/17306491.html

其他使用netsnmp库开发的博客:
Qt 使用 net-snmp 包的过程记录:https://www.cnblogs.com/pied/p/7501248.html
snmp学习笔记:https://www.cnblogs.com/beautifullife4e/p/4760361.html
学习笔记 trap部分:https://blog.csdn.net/weixin_39897267/article/details/115988004
snmptrap动作学习:
与snmpget动作相差无几,只不过调用函数时参数不同。参考:net-snmp-5.5/apps/snmptrap.c
只需要将open_session换为snmp_add和netsnmp_transport_open_client即可。

netsnmp_session *snmp_add(netsnmp_session *, struct netsnmp_transport_s *, int (*fpre_parse) (netsnmp_session *, struct netsnmp_transport_s*, void *, int), int (*fpost_parse) (netsnmp_session *,netsnmp_pdu *, int));

将一些设置添加到session中,

netsnmp_transport* netsnmp_transport_open_client(const char* application, const char* str);

打开trap的客户端,产生netsnmp_transport结构体用于trap。
void snmp_shutdown(const char *type);
关闭应用程序,保存任何需要持久性存储,并进行适当的清理。参数:config文件中的"type"使用的类型标签

snmptarp和snmptarpd的基本流程为:
1.初始化session(snmp_sess_init)
2.打开session(snmp_open)
3.打开trap客户端或者服务端(netsnmp_transport_open_client or netsnmp_transport_open_server)
4.客户端发送trap pdu。服务端等待接收trap
5.关闭应用程序(snmp_shutdown)

Trap报文解析:https://javaforall.cn/171446.html

SNMPv2原始报文内容:
00 23 5a 9e 58b9 00 4c 41 49 50 55 08 00 45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a01 c0 a8 0a05 0c01 00 a2 0067 04 bb 305d 02 01 01 04 06 70 75 62 6c 69 63a7 50 02 04 1773 2c fb 02 01 00 02 01 00 30 42 30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 30 17 060a 2b 06 01 06 03 01 01 04 01 00 06 09 2b 06 01 0603 01 01 05 01 3018 06 0a2b 06 01 06 03 01 01 04 0300 06 0a2b 06 01 04 01 bf 08 03 02 0a

目的MAC:00 23 5a 9e 58 b9
源MAC:00 4c 41 49 50 55
协议类型:08 00,IP报文
IP头:45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a80a 01 c0 a80a 05
UDP头:0c01 00 a2 00 67 04 bb
余下部分全为SNMP报文内容,这里我们做一下简单的约定:
xx 标注类型;xx 标注长度;xx 标注真正的数据。
这样一来上面这串原始数据就好分析多了J
n  30 5d 整个SNMP报文的编码方式为30,即SEQUENCE类型,报文长度93(0x5d)字节;
n  02 01 01 版本号01即v2版本;
n  04 06 70 75 62 6c 69 63 团体名70 75 62 6c69 63  即英文的“public”;
n  a7 50 a7表示trap类型为7,即厂商自定义trap;50表示PDU区段占80(0x50)字节;
n  02 04 17 73 2c fb 请求ID为17 73 2c fb 十进制的393424123;
n  02 01 00 错误状态0;
n  02 01 00 错误索引0;
n  30 42 “变量名-值”对编码类型30 即SEQUENCE类型;“变量名-值”所占总字节0x42,即66字节;
n  30 0d 06 08 2b 06 01 02 01 01 03 00 43 01 0e 第一个“名-值”对区段编码方式30 即SEQUENCE类型;第一个“名-值”对总长度0x0d13字节;第一个变量名的编码类型0x06,时间标签;第一个变量名占0x08个字节;第一个变量名2b 06 01 02 01 01 03 00,为1.3.6.1.2.1.1.3.0;第一个变量值为0x0e,即14;
n  30 17 06 0a2b 06 01 06 03 01 01 04 0100 06 09 2b 06 01 06 03 01 01 05 01 第二个“名-值”对;变量名1.3.6.1.6.3.1.1.4.1.0;变量值1.3.6.1.6.3.1.1.5.1;
n  30 18 06 0a2b 06 01 06 03 01 01 04 0300 06 0a2b 06 01 04 01 bf 08 03 02 0a 第三个“名-值”对;变量名1.3.6.1.6.3.1.1.4.3.0;变量值1.3.6.1.4.1.8072.3.2.10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

证照之星7.0下载安装教程及老版本升级说明

随着社会的发展&#xff0c;人们的证件照需求越来越多&#xff0c;很多人为了节省时间和成本&#xff0c;选择自己拍摄证件照&#xff0c;并进行后期制作。而证照之星是一款功能强大的证件照后期制作软件&#xff0c;能够帮助用户对证件照进行快速美化和处理。本文将为大家详细…

【SpringBoot】自从集成spring-security-oauth2后,实现统一认证授权so easy!

文章目录 一.前言1.principal和credential的区别2.生成私钥公钥3.用户认证分析4.认证解决方案4.1.单点登录4.2.第三方账号登录4.3.单token系统和双token系统业务逻辑 二.Spring Security1.快速入门2.基本原理FilterSecurityInterceptorExceptionTranslationFilterUsernamePassw…

Vue3+Three.js+antvG2实战项目 智慧城市(四)

前言 在网上找了很久都没有找到使用Three.js开发智慧城市的免费文章或者免费视频,自己花了一点时间做了一个纯前端的智慧城市项目。 技术栈都是最新的:vue3vitetypeScriptThreeantv G2 源码分享 源码 模型,天空图盒子链接分享(不想下载源码可以只用下这个)提取码1234 20230424_…

在时间序列预测中使用 FRFT

RNN Encoder–Decoder 每一个时刻都有一个隐藏状态向量 S_t&#xff0c;当这个向量传递到最后的一个 token 时&#xff0c;即 S_n (n为输入序列的最大长度)&#xff0c;它就是语义编码向量 C C 参与了Decoder过程中每一时刻隐藏状态和输出的计算. 最大的局限性就在于编码和解码…

美国访学J类签证费涨价15%|5月30日生效

2023年5月30日起&#xff0c;美国签证费用开始上调&#xff0c;其中访问学者的J类签证将由160美元调整至185美元&#xff0c;涨价15%。届时美国驻华大使馆将依据汇率做出调整&#xff0c;并公布具体的人民币数额。知识人网小编提醒相关签证人员提前做好准备。 美国国务院发布的…

手撕二叉树(图解+代码)

二叉树 &#x1f333;1.树的概念&#x1f333;2.二叉树的概念及性质&#x1f34e;2.1 二叉树的概念&#x1f34e;2.2 二叉树的性质 &#x1f333;3.二叉树的基本操作&#x1f34e;3.1 二叉树的遍历&#x1f34e;3.2 获取树中节点的个数&#x1f34e;3.3 获取叶子节点的个数&…

Python学习5:计算弓形的面积

类型&#xff1a;数值运算 描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ …

大数据学习初级入门教程(十七) —— Elasticsearch 8.7.0 完全分布式集群的安装、配置、启动和测试

好久没用 Elasticsearch 集群了&#xff0c;参考以前写的《大数据学习初级入门教程&#xff08;八&#xff09; —— Elasticsearch 7.6.2 单节点的安装、启动和测试_elasticsearch 7.6.2需要专属网络_孟郎郎的博客-CSDN博客》、《大数据学习初级入门教程&#xff08;九&#x…

面向对象与面向过程的区别

“劳累一天回到家中“ ”对象赶忙问我想吃些什么&#xff1f;“ “望着窗外淅淅沥沥的小雨 蛋炒饭吧” “雨声洗涤了心灵 炒饭温暖了肚子” “我没有问她炒饭是怎么做的&#xff0c;他也没有管我吃相有多难看” “我面向对象&#xff0c;她也面向对象” 面向对象和面向过程的区…

Unity3D:编辑场景模板

场景模板 Inspector 场景模板 Inspector 包含以下部分&#xff1a; Details&#xff1a;指定模板使用哪个场景&#xff0c;并包含模板的描述&#xff0c;该内容将出现在 New Scene 对话框中。Thumbnail&#xff1a;提供用于为模板创建预览图像的选项。Scene Template Pipelin…

ajax的介绍及使用

ajax的介绍 开发流程 前端 ajax:前后端沟通的桥梁 后端 ajax介绍 ajax叫做异步的Javascript和xml ajax通过浏览器与服务器&#xff08;后端&#xff09;进行少量数据交互&#xff0c;进行页面异步更新&#xff08;网页不会重新加载&#xff09; 优点&#xff1a; 减轻服务器负…

Java基础1

一、标识符 给类、接口、方法、变量等取名时用的字符序列 如&#xff1a; public class 类名-标识符{public static void 方法名-标识符(String[] args){int 变量或标识符 1000;} } 二、标识符的命名规范 组成部分 英文大小写字母、数字字符、美元($)符号、下划线(_)、中文…

「ChatGPT」十分钟学会如何在本地调用API_KEY(最新版 | 附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

1.2 行列式的性质和计算

学习目标&#xff1a; 当学习行列式性质和计算时&#xff0c;以下是一些具体的学习目标&#xff1a; 理解行列式的定义和计算方法&#xff0c;能够准确计算给定的行列式。&#xff08;最基本的&#xff09;熟练掌握行列式的基本性质&#xff0c;包括交换行列式的两行或两列、…

VRP开源的算例资源

VRP开源的算例资源 开源的算例资源 开源的MIP算例网址 1. MISOCP网址 Benchmark instances&#xff1a;多种问题的算例数据 TSP算例网址 VRP标杆算例网址 1. Networking and Emerging Optimization发布的VRP算例 2. PRP算例 3. 一个学者的主页上的算例 4. Chair in L…

Linux学习笔记(3)一些数据类型

1&#xff09;_u32 是一个无符号的32位整数类型&#xff0c;它在 Linux 内核中定义为 typedef unsigned int __u32。其中&#xff0c;__u32 是为了避免名称冲突而定义的特殊类型。无符号整数是一种表示正整数的数据类型&#xff0c;其取值范围为 0 到 4294967295&#xff08;2…

docker容器:本地私有仓库、harbor私有仓库部署与管理

目录 一、本地私有仓库 1、本地私有仓库简介 2、搭建本地私有仓库 3、容器重启策略介绍 二、harbor私有仓库部署与管理 1、什么是harbor 2、Harbor的特性 3、Harbor的构成 4、harbor部署及配置 ①部署docker-compose ②部署Harbor服务 ③登录创建项目 ④登录仓库并…

对话到行动:通过行动级生成构建面向任务的对话系统

目录 对话到行动:通过行动级生成构建面向任务的对话系统 1介绍 2框架描述 2.1概述 2.2第一步:对话动作构造 2.3步骤2:响应标准化响应标准化 2.4步骤3:动作序列预测 2.5步骤4:生成响应 3实验 3.1实验设置 3.2主要结果 3.3深度分析 4结论 5主持人简介 6公司简介 对…

V-Ray渲染教程:又快又好的V-Ray渲染参数!

Chaos V-Ray 是适用于大部分主流3D设计软件和CAD程序的3D渲染插件&#xff0c;它可以与 3ds Max、Cinema 4D、Houdini、Maya、Nuke、Revit、Rhino、SketchUp、Unreal 无缝协作。借助 V-Ray渲染器强大的功能&#xff0c;艺术家和设计师可以产生出非常逼真的渲染效果。 那么&…

服务提供者 Eureka + 服务消费者(Rest + Ribbon)实战

1、Ribbon背景介绍 Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单来说&#xff0c;就是在配置文件中列出Load B…