Skip to content

Commit

Permalink
📝 docs(1.0): 添加netconfig的详细描述
Browse files Browse the repository at this point in the history
Signed-off-by: Tony Deng <wolf.deng@gmail.com>
  • Loading branch information
tonydeng committed Nov 21, 2017
1 parent ebbea5c commit 211f7bf
Show file tree
Hide file tree
Showing 8 changed files with 164 additions and 0 deletions.
Binary file removed graffle/scp-resource-monitor-process.png
Binary file not shown.
28 changes: 28 additions & 0 deletions puml/netconf-get-config-flow.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
@startuml
start

:入口 :get-config类;
: 依次判断get-config的子元素 ;

if (是否是source元素?) then (yes)
if (是否是规定源数据库?) then (no)
: 按照定义的错误报文\n构造方式生成错误报文;
endif
else (no)
if (是否是filter元素) then (yes)
if(filter元素的type属性) then (subtree)
:提取subtree内容;
:通过子树过滤方式\n获取相应数据库的\n相应数据;
else(xpath)
:提取xpath内容;
:通过xpath过滤方式\n获取相应数据库的\n相应数据;
endif
:将得到的内容封装为操作层报文;
else (no)
: 按照定义的错误报文\n构造方式生成错误报文;
endif
endif

:出口: 交给RPC模块封装RPC报文;
stop
@enduml
23 changes: 23 additions & 0 deletions puml/netconf-implementation-process.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
@startuml
start

:入口 :启动SrverSocket主线程;
: SSH与Socket绑定 ;
: 监听等待 ;
: 建立子线程 ;
: 建立Hello报文 ;
: 发送Hello报文 ;
if (等待接受报文?) then (收到报文)
if (报文正确?) then (yes)
: 接受请求报文;
: 提取RPC报文;
: 进入RPC模块处理,\n得到响应报文;
: 发送响应报文;
if (会话是否有标识关闭?) then (y)
else (no)
endif
endif

:出口: 交给RPC模块封装RPC报文;
stop
@enduml
30 changes: 30 additions & 0 deletions puml/netconf-messages-layer-flow.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@startuml

start

:入口 :从应用协议层\n模块得到**RPC报文头**和\n**Session**;
if (判断RPC\n是否符合NETCONF协议\n的Schema?) then (yes)
if (循环判断RPC元素的属性?) then (yes)
if (Message-id是否在范围内?) then (yes)
if (命名空间名字是否正确?) then (yes)
if (命名空间内容是否徐正确?) then (yes)
: 保存名字空间列表;
: 得到操作层报文;
: 根据操作名实例化该操作;
if(判断是否实例化成功?) then (yes)
: 根据得到的**session**,命名空间,\n操作块内容执行相应操作,\n得到操作层返回报文;
:根据操作返回报文来封装RPC返回报文;
endif
endif
endif
endif
endif
endif
if(上述任意流程有错误?) then(yes)
: 按定义的错误报文构造方式生成错误报文;
endif
: 出口:交由应用协议层模块处理 ;

stop

@enduml
File renamed without changes.
Binary file added sdn/images/netconf-get-config-flow.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
83 changes: 83 additions & 0 deletions sdn/sbi/netconf.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

NETCONF是一个基于XML的交换机配置接口,用于替代CLI、SNMP等配置交换机。

> 本质上来说,NETCONF就是利用XML-RPC的通讯机制实现配置客户端和配置服务端之间的通信,实现对网络设备的配置和管理。
## 协议

NETCONF通过RPC与交换机通信,其协议包含四层
Expand Down Expand Up @@ -34,6 +36,87 @@ NETCONF通过RPC与交换机通信,其协议包含四层
- (3) 操作层,定义了一系列的RPC调用方法,并可以通过Capabilities来扩展
- (4) 内容层,定义RPC调用的数据内容

## NETCONF技术规范

### 安全传输层

可以使用多种传输协议来进行数据传输,官方默认使用`SSH`进行加密及数据传输。

### 消息层

![消息层流程](http://www.plantuml.com/plantuml/png/ZLJDRjf04BxxANnCBFK5mg6HelRMj6fwv88QqrXgdAgcXzwI1XD3J71R2wVy1GGaRbLiaAWKVW8luzarfxn21zOaRWgbUrZDxiutFz_CxAQIYBrFVDX_ot4pYUCsG6r2hixV3WlUu0pw9ZLjoEPynu7EfwXCx1gKBHXPeBK5uUMBBP9falm9DBg205_qg2m8EwAYI0SeH3Wfpg-1rY3v5ceY-Dm5uvB-l0H3stxoQklvzbDcEYhJGdBdzPwu7tkypYVsH9bV-oWgwnoFQsPaz8EUkNUcG3sctIfYe5CXXrT_O-QuPnXBx8tuIDfblg5a-_en5BkGKXUZxZn-lW4ZIx_t9rON1MXPp09frMdDMOvTY4-fuFI224R6_vYOhWtU6vUXTSxS1wOqow_PaINwh2xaQzQxAM6vM6sMAPDgZsITG1bTE1LlT0fwtdURx78nK8e79GtocSE8Pa3cOdLMOUSiNgoZ82ZphhaTwc7ky8YDmuB4ncDCfg_ycawBrzYUx6cczI1xVsn2iV8l3cQXX6a8GqYv2UqZlwvYlwqs9SgxKfnRVVldpVs9IMn7XhthZ3zkUuC1IUR8hoDgdv9IUc9-yrqtOFYUO2HJJuDJy7ffP98f1IbKafF3AidtO9YZvWLMAFmQ2TnXsvpqSUId4zzlKBFpOEY3aMyagP7Y8zEFuk0TnsqYUFfl_0O0)

> 消息层流程PlantUML请查看[netconf-messages-layer-flow.puml](https://raw.githubusercontent.com/tonydeng/sdn-handbook/master/puml/netconf-messages-layer-flow.puml)
上面的流程图看起来比较多,其实总结起来也主要是六步

1. 通过传输协议层模块得到`NETCONF`的请求报文后,就应交由`RPC`模块处理如果`NETCONF`报文经过了压缩或加密的话,先进行解压和解密
1. 然后将`RPC`请求报文,用`RFC4741``XML Schema`文件进行验证
1. 如果符合`NETCONF`的报文格式则解析文档中的`RPC`元素部分,进行`RPC`元素中`message—id`和命名空间属性的检查和保存
1. 然后将内部的操作层元素取出传给操作层模块
1. 如果操作层模块处理成功,返回正确的报文
1. RPC模块再将返回的响应报文进行`RPC`层的封装,然后发送给对应的客户端。如果中途在某个环节检查错误或操作层模块错误,则统一封装成错误处理报文,发送给客户端

### 操作层

NETCONF提供了[九种基本操作](https://tools.ietf.org/html/rfc6241#section-7)

1. [get-config](https://tools.ietf.org/html/rfc6241#section-7.1)
2. [edit-config](https://tools.ietf.org/html/rfc6241#section-7.2)
3. [copy-config](https://tools.ietf.org/html/rfc6241#section-7.3)
4. [delete-config](https://tools.ietf.org/html/rfc6241#section-7.4)
6. [lock](https://tools.ietf.org/html/rfc6241#section-7.5)
7. [unlock](https://tools.ietf.org/html/rfc6241#section-7.6)
5. [get](https://tools.ietf.org/html/rfc6241#section-7.7)
8. [close-session](https://tools.ietf.org/html/rfc6241#section-7.8)
9. [kill-session](https://tools.ietf.org/html/rfc6241#section-7.9)

> 这些操作的参数都各不相同,因此每种操作都有自己的处理流程
`get-config`为例,我们来看看`get-config`请求报文的解析流程:

![get-config请求报文解析流程](../images/netconf-get-config-flow.jpg)

> get-config请求报文解析流程PlantUML请查看[netconf-get-config-flow.puml](https://raw.githubusercontent.com/tonydeng/sdn-handbook/master/puml/netconf-get-config-flow.puml)
### 内容层

内容层即配置数据库


## NETCONF实现流程



## NETCONF实现的关键技术

关键的环节包括:**安全认证****建立加密传输通道****rpc-xml消息收发****rpc-xml文件解析****rpc-reply消息** 的生成。

### 安全认证实现

使用`ssh`密钥认证方法,在`Client`端生成一对密钥,将公钥传给`Server`相关目录进行备份,借助`libssh2`函数库的相关函数完成安全认证。


### 加密通道建立

借助`SSHv2`本地端口转发功能分别在`Client`端和`Server`端建立一个`SSH隧道`,实现`Client``12500端口``Server` `830端口`的数据经过`SSH`传输。

命令:`ssh -2 –N–C –f –L 12500:172.16.15.213:830` (Client端执行)
命令:`ssh -2 –N–C –f –L 830:172.16.15.213:12500` (Server端执行)


### xml-rpc消息收发

`Client`端需要将`rpc-xml`文件转换为内容为`rpc`请求的`xml`化的字符,`send()``Server``Server`端在`recv()`收到字符之后利用`libxml2`库函数生成`rpc-xml`文件的指针,借助`xpath`搜索原理进行相关数据定位,如果检索到相关操作关键字再调用相关函数生成`rpc-reply`文件并转换为字符格式`send()``Client`

### xml消息的解析

`NETCONF`中有9种操作每一种操作的元素各不一样,因此要建立很多个流程来处理每一个操作,对`rpc-xml`请求的合法性以及想要获得的数据等进行定位,这个是`RPC`层需要实现的核心内容。

### xml消息的生成

原则上需要调用配置数据库的相关数据,执行并返回`rpc-xml`请求的结果。

## 参考文档

1. [RFC6241](https://tools.ietf.org/html/rfc6241)
Expand Down

0 comments on commit 211f7bf

Please sign in to comment.