• SNMP Walk 中的 maxRepetitions 详解


    一、什么是 maxRepetitions?

    maxRepetitions 是 SNMP GETBULK 操作中的一个重要参数,它指定了在单个 SNMP 请求报文中,最多可以返回多少个变量绑定(Variable Bindings)。

    在 snmpwalk 中的体现

    snmpwalk -v2c -c public 60.83.221.36 1.3.6.1.2.1.1
    

    snmpwalk 默认使用 GETBULK 操作,其 maxRepetitions 默认值通常为 10-50(取决于实现)。

    您可以通过 -Cr 参数自定义:

    # 设置 maxRepetitions 为 5
    snmpwalk -v2c -c public 60.83.221.36 -Cr5 1.3.6.1.2.1.1
    
    # 设置 maxRepetitions 为 100
    snmpwalk -v2c -c public 60.83.221.36 -Cr100 1.3.6.1.2.1.1
    

    二、GETBULK 操作原理

    SNMP 操作类型对比

    操作 用途 返回数量 说明
    GET 获取单个 OID 1 个 精确查询
    GETNEXT 获取下一个 OID 1 个 遍历时逐个获取
    GETBULK 批量获取多个 OID N 个 高效遍历,使用 maxRepetitions

    GETBULK 工作流程

    客户端(snmpwalk)                    目标设备(SNMP Agent)
         │                                      │
         │  1. GETBULK Request                   │
         │     maxRepetitions = 10               │
         │     OID = 1.3.6.1.2.1.1.1            │
         │  ─────────────────────────────────>   │
         │                                      │
         │                                      │  查找 OID 树
         │                                      │  从指定位置开始
         │                                      │  返回最多 10 个
         │                                      │  连续的叶子节点
         │                                      │
         │  2. GETBULK Response                  │
         │     返回 10 个 OID+Value 对           │
         │  <─────────────────────────────────   │
         │                                      │
         │  3. 继续下一轮                        │
         │     从最后一个 OID 开始               │
         │     maxRepetitions = 10               │
         │  ─────────────────────────────────>   │
         │                                      │
         │  4. 重复直到结束                      │
         │  <─────────────────────────────────   │
         │                                      │
    

    关键区别:GETNEXT vs GETBULK

    特性 GETNEXT GETBULK
    每次请求返回 1 个 OID N 个 OID(maxRepetitions)
    网络往返次数 多(等于 OID 数量) 少(约 OID 数量/N)
    性能 慢 快
    适用场景 GET 操作、精确查询 walk 遍历

    三、maxRepetitions 的作用

    1. 控制单次请求的数据量

    maxRepetitions 单次请求返回 适用场景
    1 1 个 OID 等同于 GETNEXT,逐条遍历
    10(默认) 10 个 OID 平衡性能和带宽
    50 50 个 OID 快速遍历大型 MIB
    100+ 100+ 个 OID 高速网络,但可能引发超时

    2. 性能影响

    示例:遍历 1000 个 OID

    maxRepetitions 请求次数 网络往返次数 总耗时估算
    1 1000 次 1000 次 ~10 秒
    10 100 次 100 次 ~1 秒
    50 20 次 20 次 ~0.2 秒
    100 10 次 10 次 ~0.1 秒

    3. 网络带宽影响

    maxRepetitions 单次请求大小 总流量
    10 ~1.5 KB ~150 KB
    50 ~7 KB ~140 KB
    100 ~14 KB ~140 KB

    虽然单次请求变大,但总流量变化不大,因为返回的数据总量是相同的。


    四、maxRepetitions 的副作用

    1. 可能导致超时

    如果 maxRepetitions 设置过大:

    # 可能超时
    snmpwalk -v2c -c public 60.83.221.36 -Cr1000 1.3.6.1.2.1.1
    

    原因:

    • Agent 需要收集 1000 个 OID 的数据
    • 如果 MIB 树庞大,Agent 可能处理时间过长
    • 超过 -t(timeout)设置的值

    解决方案:

    # 减小 maxRepetitions,增加 timeout
    snmpwalk -v2c -c public 60.83.221.36 -Cr50 -t 30 1.3.6.1.2.1.1
    

    2. 可能产生重复数据

    如果 maxRepetitions 过大,返回的数据量可能超过一个数据包的最大传输单元(MTU),导致 IP 分片或丢包。

    建议值:

    • 局域网:50-100
    • 广域网/慢速链路:10-20
    • 不稳定的网络:5-10

    五、在 snmpwalk 中使用 maxRepetitions

    基本用法

    # 默认 maxRepetitions(通常是 10-50)
    snmpwalk -v2c -c public 60.83.221.36 1.3.6.1.2.1.1
    
    # 自定义 maxRepetitions
    snmpwalk -v2c -c public 60.83.221.36 -Cr5 1.3.6.1.2.1.1
    
    # 增加 timeout 以适应较大的 maxRepetitions
    snmpwalk -v2c -c public 60.83.221.36 -Cr100 -t 60 1.3.6.1.2.1.1
    

    SNMPv3 示例

    snmpwalk -v3 -l AuthPriv -u xjdl-sdn -a SHA -A 'Xjepc_xjdl_2025' -x DES -X 'Xjepc_xjdl_2025' -Cr20 -t 30 60.83.221.36 1.3.6.1.2.1.1
    

    六、针对之前超时问题的建议

    问题回顾

    您之前的 snmpwalk 命令:

    snmpwalk -v3 -l AuthPriv -u xjdl-sdn -a SHA -A 'Xjepc_xjdl_2025' -x DES -X 'Xjepc_xjdl_2025' 60.83.221.36 1.3.6.1.2.1.1.1 -t 30
    

    问题分析

    虽然您设置的 -t 30 是超时时间,但如果 maxRepetitions 太大,可能导致:

    1. Agent 处理时间超过 30 秒 → 超时
    2. 响应数据包过大 → IP 分片或丢包 → 超时
    3. 网络延迟高 → 30 秒内未完成 → 超时

    优化建议

    1. 使用 snmpget 先测试单个 OID

    snmpget -v3 -l AuthPriv -u xjdl-sdn -a SHA -A 'Xjepc_xjdl_2025' -x DES -X 'Xjepc_xjdl_2025' 60.83.221.36 1.3.6.1.2.1.1.1.0 -t 10
    

    2. 使用较小的 maxRepetitions

    snmpwalk -v3 -l AuthPriv -u xjdl-sdn -a SHA -A 'Xjepc_xjdl_2025' -x DES -X 'Xjepc_xjdl_2025' -Cr5 -t 30 60.83.221.36 1.3.6.1.2.1.1
    

    3. 增加 timeout

    snmpwalk -v3 -l AuthPriv -u xjdl-sdn -a SHA -A 'Xjepc_xjdl_2025' -x DES -X 'Xjepc_xjdl_2025' -Cr20 -t 60 60.83.221.36 1.3.6.1.2.1.1
    

    七、总结

    参数 作用 影响
    maxRepetitions 控制单次 GETBULK 返回的 OID 数量 影响性能和超时
    较小值(1-10) 慢但稳定 适用于不稳定网络
    中等值(20-50) 平衡性能和稳定性 推荐默认值
    较大值(100+) 快但可能超时 适用于高速稳定网络
  • 相关阅读:
    2023陇剑杯
    maven重新加载后Target bytecode version总是变回1.8
    python mongodb数据查询
    【LeetCode第366场周赛】8028. 执行操作使两个字符串相等 | 线性DP | 中等
    创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究
    .NET应用国际化支持-葡萄牙语下如何不区分重音的模糊查询
    淘宝商品销量接口/淘宝商品销量监控接口/商品累计销量接口代码对接分享
    实现JSONP请求
    MySQL聚簇索引与非聚簇索引
    基于Java+MySQL的三维模型素材交易平台设计
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/22520803