2. NETCONF协议基础:协议栈、Hello消息交换、能力集协商、会话建立流程
好,咱们今天聊聊NETCONF协议的基础。说实话,我在光通信网管这行干了十几年,NETCONF算是这些年里让我眼前一亮的东西。以前配设备,要么靠CLI一条条敲,要么靠SNMP去读那些晦涩的MIB库,累得慌。NETCONF的出现,说白了就是让设备跟网管之间能「好好说话」。
你想想看,一个光传输设备,可能有几百个端口,每个端口又有几十个参数。用传统方式去配置,简直就是噩梦。NETCONF不一样,它把配置数据当成XML文档来处理,结构清晰,操作也规范。我个人习惯,现在但凡新上的设备,只要支持NETCONF,我肯定优先用。
2.1 NETCONF协议栈:四层架构
NETCONF的协议栈分四层,我画个图给你看,这样更直观。
这四层从下往上分别是:
- 传输层:默认走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 会话建立流程
整个会话建立流程,我总结成五步走:
- 建立传输连接:客户端通过SSH连接到设备的830端口。
- 交换Hello:双方互发Hello消息,交换能力集。
- 能力协商:双方取能力集的交集,确定后续可用的操作。
- 会话确认:服务器返回session-id,表示会话建立成功。
- 开始交互:客户端可以发送RPC请求了。
画个流程图,看得更清楚:
嗯,这里要注意一点。会话建立后,如果长时间没有操作,设备可能会主动断开连接。我一般会在客户端做个心跳机制,每隔几分钟发个<get>操作,保持会话活跃。
小技巧:调试NETCONF会话时,可以用
ssh -p 830 user@device -s netconf命令手动登录。这样你能看到原始的XML交互过程,对理解协议非常有帮助。
好了,NETCONF协议的基础就这些。说白了就是四层结构、Hello握手、能力协商、会话建立。把这些搞明白,后面学YANG模型和具体操作就轻松多了。
公众号:蓝海资料掘金营,微信deep3321