NETCONF協議(Network Configration Protocol)
- NETCONF是一個基於XML的交換機配置接口,用於替代CLI、SNMP等配置交換機。
- 本質上來說,NETCONF就是利用XML-RPC的通訊機制實現配置客戶端和配置服務端之間的通信,實現對網絡設備的配置和管理。
NETCONF通過RPC與交換機通信,協議包含四層
i. 安全傳輸層,用於跟交換機安全通信,NETCONF並未規定具體使用哪種傳輸層協議,所以可以使用SSH、TLS、HTTP等各種協議,官方默認使用SSH
進行加密及數據傳輸
ii.消息層,提供一種傳輸無關的消息封裝格式,用於RPC通信,消息層流程如下:
NETCONF中定義了三種消息類型,分別是hello, rpc和rpc-reply, notification。
Ø <hello>
<hello>僅用於回話剛剛建立時netconf-server和netconf-client之間進行能力交換。
server和client需要在回話建立后互相發送<hello>消息,並在<hello>消息中攜帶自身支持的能力,以及支持的netconf協議的版本號,server和client根據自身和對方的能力信息協商使用的netconf版本。
一般來說,C/S雙方互發<hello>且協商版本成功后,認為netconf會話建立成功。操作層,定義了一系列的RPC調用方法,並可以通過Capabilities來擴展
幾種常用能力:
(1) XPath Capability
該能力表示client可以在filter中使用XPath表達式作為過濾條件
Capability Identifier:
urn:ietf:params:netconf:capability:xpath:1.0
(2) Writable-Running Capability
該能力表示server支持直接對<running/>庫進行修改操作。
Capability Identifier:
urn:ietf:params:netconf:capability:writable-running:1.0
(3) Candidate Configuration Capability
該能力表示server具有一個candidate數據庫,並且可以將candidate數據庫中的配置提交生效並更新running數據庫
Capability Identifier:
urn:ietf:params:netconf:capability:candidate:1.0
(4) Rollback-on-Error Capability
該能力表示server在執行client發送的配置數據出錯后可以進行回滾
Capability Identifier:
urn:ietf:params:netconf:capability:rollback-on-error:1.0
(5) Validate Capability
該能力表示server可以校驗client發送的配置數據是否正確
Capability Identifier:
urn:ietf:params:netconf:capability:validate:1.1
(6) Distinct startup Capability
該能力表示server有一個startup數據庫,用於保存啟動配置
Capability Identifier:
urn:ietf:params:netconf:capability:startup:1.0
Ø rpc和rpc-reply,
<rpc>是由netconf-client發起的發送到netconf-server的消息。用於client請求server執行某項具體的操作。
<rpc>包含一個強制屬性”message-id”,這個id是一個單調遞增的正整數,同一會話內不能重復。該id用於<rpc>和<rpc-reply>的配對。
<rpc-reply>是有netconf-server發送給netconf-client的rpc響應。不能主動發起,僅能在收到<rpc>之后回復,切必須攜帶與收到的rpc相同的message-id。
在<rpc-reply>定義了兩種默認的元素分別是<ok>和<rpc-error>。<ok>表示未定義響應內容的rpc執行成功,而<rpc-error>表示rpc執行失敗。
Ø notification
持Notification上報的netconf-server需在能力交換時上報能力:
“urn:ietf:params:netconf:capability:notification:1.0”
1. Netconf的通知采用的是訂閱發布機制,server僅會向發送過訂閱請求的client發送通知。
2. Netconf的通知是以Stream進行分類的,不同類的Stream以不同的stream-name進行區分。netconf-server默認需要支持的stream-name是”NETCONF”。
3. client不能重復下發訂閱,即同一Stream的訂閱不能重復下發,也不能同時訂閱多個Stream,訂閱可以設置定時取消,如果沒有設置終止時間,取消訂閱需要使用close-session或者kill-session。定時取消的訂閱netconf的會話還是激活的,而使用close-session或者kill-session來取消的話,netconf會話會關閉。
iii.操作層,NETCONF提供了九種基本操作:
Ø get-config 用於查詢配置數據
Ø edit-config 用於對指定配置數據庫的內容進行修改,支持以下幾種操作:
merge: 合並操作,此操作為默認操作。
replace: 替換操作,如果對象已經存在則替換,不存在則創建。
create: 創建操作,如果對象已經存在,則報錯誤“data-exists”。
delete: 刪除操作,如果對象存在則刪除,不存在則報錯 “data-missing”。
remove: 刪除操作,如果對象存在則刪除,不存在則忽略。
Ø copy-config 將一個庫的數據復制到另一個庫
Ø delete-config 刪除一個數據庫。但是<running/>庫不能被刪除。
Ø lock 獲取指定數據庫的鎖,當某個client獲得了指定數據庫的鎖之后,在其沒有釋放該鎖之前,其余client均不能獲得該數據庫的鎖,也不能對其進行修改操作。同一client也不能在沒有釋放鎖之前,重復申請鎖。 獲取鎖的主要目的就是避免並發導致數據沖突。
Ø unlock釋放指定數據庫的鎖。client只能釋放自己持有的鎖,不能釋放其它client的鎖。
Ø get 用於查詢狀態數據
Ø close-session 優雅關閉netconf會話,netconf-server將釋放該client持有的鎖和為其分配的資源,並優雅的關閉與該client鏈接。
Ø kill-session 強制關閉netconf會話。
get-config請求報文解析流程B
iv.內容層,定義RPC調用的數據內容,即配置數據庫
NETCONF實現流程:
RPC模型
- NETCONF協議使用基於RPC的通信模型。 NETCONF對等體使用<rpc>和<rpc-reply>元素來提供NETCONF請求和響應的傳輸協議無關幀。
<rpc>元素用於封裝從客戶端發送到服務器的NETCONF請求。
<rpc>元素有一個強制屬性“message-id”,它是由RPC的發送者選擇的一個字符串,它通常編碼一個單調遞增的整數。 RPC的接收者不解碼或解釋這個字符串,只是簡單地保存它在任何生成的<rpc-reply>消息中用作“message-id”屬性。
<rpc-reply>響應<rpc>操作發送<rpc-reply>消息。
<rpc-reply>元素有一個強制屬性“message-id”,它等於這是一個響應的<rpc>的“message-id”屬性。
響應名稱和響應數據被編碼為<rpc-reply>元素的內容。 回復的名字是直接在<rpc-reply>元素中的一個元素,任何數據都在這個元素內編碼。
- 如果在處理<rpc>請求期間發生錯誤,<rpc-error>元素將在<rpc-reply>消息中發送。
如果服務器在處理<rpc>請求期間遇到多個錯誤,<rpc-reply>可能包含多個<rpc-error>元素。但是,如果請求包含多個錯誤,則服務器不需要檢測或報告多個<rpc-error>元素。
服務器不需要按照特定的順序檢查特定的錯誤條件。如果在處理期間出現任何錯誤情況,服務器務必返回一個<rpc-error>元素,並且如果在處理期間出現任何警告條件,應該返回一個<rpc-error>元素。
服務器絕對不能在客戶端沒有足夠訪問權限的<rpc-error>元素中返回應用級或數據模型特定的錯誤信息。
error-type:定義錯誤發生的概念層,下列類型之一。
Ø transport (layer: Secure Transport)
Ø rpc (layer: Messages)
Ø protocol (layer: Operations)
Ø application (layer: Content)
error-tag:包含識別錯誤條件的字符串。
error-severity:包含標識錯誤嚴重性的字符串,由設備確定。 下列之一:
Ø error
Ø warning
error-app-tag:包含標識數據模型特定或特定於實現的錯誤條件(如果存在)的字符串。
error-path:包含絕對XPath表達式,用於標識<rpc-error>元素中報告的錯誤關聯的節點的元素路徑。 如果沒有適當的有效載荷元素或數據存儲節點可以與特定的錯誤條件相關聯,則該元素將不存在。
error-message:包含一個適合人類閱讀的字符串,用於描述錯誤情況
error-info:包含協議或數據模型特定的錯誤內容。