2. NETCONF协议基础:协议栈、Hello消息交换、能力集协商、会话建立流程

好,咱们今天聊聊NETCONF协议的基础。说实话,我在光通信网管这行干了十几年,NETCONF算是这些年里让我眼前一亮的东西。以前配设备,要么靠CLI一条条敲,要么靠SNMP去读那些晦涩的MIB库,累得慌。NETCONF的出现,说白了就是让设备跟网管之间能「好好说话」。

你想想看,一个光传输设备,可能有几百个端口,每个端口又有几十个参数。用传统方式去配置,简直就是噩梦。NETCONF不一样,它把配置数据当成XML文档来处理,结构清晰,操作也规范。我个人习惯,现在但凡新上的设备,只要支持NETCONF,我肯定优先用。

2.1 NETCONF协议栈:四层架构

NETCONF的协议栈分四层,我画个图给你看,这样更直观。

内容层 (Content Layer) 配置数据、状态数据、通知数据(XML编码) 操作层 (Operations Layer) <get>、<get-config>、<edit-config>、<copy-config>、<lock>、<unlock> 消息层 (Message Layer) <hello>、<rpc>、<rpc-reply>、<notification> 传输层 (Transport Layer) SSH (默认)、TLS、SOAP/HTTP

这四层从下往上分别是:

  • 传输层:默认走SSH,端口830。我遇到过有些厂商也支持TLS,但SSH还是最通用的。
  • 消息层:负责封装RPC调用。说白了就是客户端发个<rpc>,服务器回个<rpc-reply>
  • 操作层:定义你能对设备做什么。比如查配置、改配置、锁配置。
  • 内容层:具体的数据模型,通常用YANG模型来定义。
我的经验:刚开始学NETCONF时,别急着看YANG模型。先把消息层和操作层搞明白,后面自然就通了。我当年就是一头扎进YANG里,结果绕了不少弯路。

2.2 Hello消息交换

NETCONF会话建立的第一步,就是交换Hello消息。这个过程很有意思,有点像两个人见面先握手自我介绍。

客户端连上设备后,双方会各自发一个<hello>消息。里面包含两样东西:

  • 会话ID:服务器会给客户端分配一个唯一的ID。
  • 能力集:双方各自支持哪些功能。

来看个实际的例子。这是客户端发的Hello:

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <capabilities>
    <capability>urn:ietf:params:netconf:base:1.0</capability>
    <capability>urn:ietf:params:netconf:capability:writable-running:1.0</capability>
  </capabilities>
</hello>

这是服务器回的Hello:

<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
  <capabilities>
    <capability>urn:ietf:params:netconf:base:1.0</capability>
    <capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
    <capability>urn:ietf:params:netconf:capability:validate:1.0</capability>
  </capabilities>
  <session-id>1024</session-id>
</hello>
注意:Hello消息必须在其他任何操作之前发送。如果没发Hello就发RPC,服务器会直接拒绝。我曾经在测试环境里犯过这个错,排查了半天才发现是顺序问题。

2.3 能力集协商

能力集协商,说白了就是双方互相亮底牌。你支持什么,我支持什么,咱们取个交集。

NETCONF定义了一些标准能力,比如:

能力标识 含义 我遇到过的情况
base:1.0 基础能力,必须支持 所有设备都支持,没得商量
writable-running:1.0 可以直接修改running配置 有些老设备不支持,得先copy到candidate
candidate:1.0 支持候选配置 我习惯用这个,改错了还能回滚
validate:1.0 提交前校验配置 这个功能救过我好几次,避免了下发错误配置
rollback-on-error:1.0 出错时自动回滚 生产环境强烈建议开启

协商的规则很简单:

  • 双方都支持的能力,才能用。
  • 如果客户端发了个操作,服务器不支持对应的能力,服务器会返回错误。
避坑指南:我曾经遇到过一个设备,它声称支持candidate:1.0,但实际commit时总是报错。后来发现是固件版本有bug。所以,能力集协商只是「声称支持」,实际能不能用,还得靠测试验证。

2.4 会话建立流程

整个会话建立流程,我总结成五步走:

  1. 建立传输连接:客户端通过SSH连接到设备的830端口。
  2. 交换Hello:双方互发Hello消息,交换能力集。
  3. 能力协商:双方取能力集的交集,确定后续可用的操作。
  4. 会话确认:服务器返回session-id,表示会话建立成功。
  5. 开始交互:客户端可以发送RPC请求了。

画个流程图,看得更清楚:

客户端 服务器 ① SSH连接 ② 发送Hello ③ 回复Hello + session-id ④ 能力协商完成 会话建立成功 ⑤ 开始RPC交互

嗯,这里要注意一点。会话建立后,如果长时间没有操作,设备可能会主动断开连接。我一般会在客户端做个心跳机制,每隔几分钟发个<get>操作,保持会话活跃。

小技巧:调试NETCONF会话时,可以用ssh -p 830 user@device -s netconf命令手动登录。这样你能看到原始的XML交互过程,对理解协议非常有帮助。

好了,NETCONF协议的基础就这些。说白了就是四层结构、Hello握手、能力协商、会话建立。把这些搞明白,后面学YANG模型和具体操作就轻松多了。


公众号:蓝海资料掘金营,微信deep3321