TR-069-again
# TR-069 网络架构
# TR-069 协议栈结构
CPE/ACS Application | 应用程序在 CPE 和 ACS 上使用 CWMP,在本地进行定义,但不是 CWMP 的一部分。 |
---|---|
RPC Methods | CWMP 定义的 RPC 方法,方法包括 CPE 参数,ACS 通过 RPC 方法访问对应参数。 |
SOAP | 基于 XML,对 RPC 进行编码,使用 SOAP 1.1 |
HTTP | 使用 HTTP 1.1 |
SSL/TLS | 可选 |
TCP/IP | TCP/IP |
# 架构目标
在连接模型中提供灵活性
- CPE 和 ACS 都可以发起连接,避免在 CPE 和 ACS 之间维护一个长期的连接。
- ACS 和 CPE 之间的功能交互应当不受这个连接是由哪端发起的这个条件的约束,即使在 ACS 不支持发起连接的情况下,所有的 ACS 发起的业务应当能够在 CPE 发起的连接上正常处理。
- 允许一个或多个 ACS 为全部 CPE 提供服务,即使 CPE 是由多个供应商提供。
支持 ACS 和 CPE 的发现和关联
- 提供让 CPE 去搜寻既定业务提供商的 ACS 的机制。
- 提供允许 ACS 安全地识别一个 CPE 并把它跟用户/客户关联起来的机制。这种关联的机制支持用户交互式和完全自动式两种模型。
允许通过 ACS 控制和监视与 CPE 关联的各种参数。提供访问这些参数的机制设定了如下前提:
- 不同的 CPE 可以拥有不同的能力级别,执行可选功能的不同子集。ACS 必须能够找出某个特定 CPE 多拥有的能力。
- ACS 必须能够控制和检测 CPE 的当前配置。
- 协议应当允许定义和访问厂商自定义参数。
本协议是一个可扩展的协议,它包括支持将来对本标准的扩展的机制,同时也包括供应商特定要求的扩展的机制。
# 假定
以下是 CWMP 定义时所作出的一些假定:
-
所有类型的 CPE(网桥,路由器等),在与 ACS 通信之前要获得 IP 地址。
-
Model
<schema name="ManagementServer" type="object"> <schema name="URL" type="string" constraint="256" write="W"/>
-
Data
<ManagementServer> <URL><Value>http://10.10.68.101:80/acs</Value></URL>
-
-
在某一个时刻,一台 CPE 只能与一台 ACS 进行交互。在任何时候,CPE 需要知道一个它能连接的一台 ACS。
-
只有明确地改变与 ACS 的联系方式和身份鉴别方式,ACS 才能将一台 CPE 转移给另一个 ACS。
# 参数
RPC 方法规范定义了一种通用机制,ACS 可以根据它来读写参数以达到配置 CPE 和监控 CPE 的状态和统计信息。
不同类 CPE 的参数定义在不同的文档中。
-
TR-106:Data Model Template for TR-069-Enabled Devices
-
TR-098:Internet Gateway Device Data Model for TR-069,专为 Internet 网关设备所定义的参数
-
TR-104:Provisioning Parameters for VoIP CPE
每一个参数包括一个“name-value”对,name 用于区分不同的参数,采用与目录文件相似的层次化结构,级与级用“.”分隔开。参数的值可能时多种已定义的数据类型中的一种。
参数可以被设置成只读或只写。只读参数可以让 ACS 用于确定特定 CPE 的特征,观察 CPE 的当前状态,或者收集统计信息。可写参数可以让 ACS 去定制各种 CPE 操作。所有可写参数必须时可读的,虽然那些包含用于机密性的信息,例如密码,可能会在读时返回一个空值。一些可写的参数能够被那些不同于本规范定义的接口所独立的更改(例如,一些参数也可以通过 LAN 侧的自动配置协议所修改)。
# 文件传输
RPC 方法规范定义了一种文件下载或为了各种目的的上载(例如对固件和配置文件的更新)的机制。
ACS 发起文件传输后,CPE 将获得传输文件的位置,使用 HTTP 协议,或者可选地使用 HTTPS、FTP或者TFTP作为传输协议。CPE 接着执行传输,并向 ACS 通告成功或者失败。
可选地,可由 CPE 首先发起下载。
如果 CPE 被 ACS 通过下载或上载请求来要求执行一个文件传输,并且如果这个文件所在的位置跟 ACS 拥有相同 host name 的 HTTP URL,则 CPE 可以选择下面的任一种方法来执行传输:
- CPE 可以在已经建立的连接上发送 HTTP GET/POST。一旦文件传输结束,CPE 可以继续发送其它信息给 ACS 并继续维持该连接。
- CPE 可以打开另一条连接,通过它来传输文件,并同时维持与 ACS 的会话,在该会话中,CPE 可以继续发送报文。
- CPE 可以结束与 ACS 的会话,然后执行传输。
如果文件位置不是 HTTP URL,或者文件不在 ACS 上,则只能使用后面两种方式。
# CPE 发起会话
RPC 方法规范定义了一种允许 CPE 向对应的ACS通报各种状态的机制,同时保证了 CPE-ACS 通信发生的最小频率。
它包括 CPE 初始安装时发起的建立通信的机制,用于“bootsrap”(引导)初始的客户参数到 CPE 中去。也包括在工作过程中和 ACS 周期通信的机制,或者事件发生时必须通知 ACS(例如当 CPE 的宽带 IP 地址发生改变时)。
在任何一种情况下,当通信建立后,CPE 通过制造商及序列号信息来唯一地标识自己,使 ACS 了解正在进行通信的是哪台 CPE,并用恰当的方法来响应它。
# ACS 发起的异步会话
服务自动配置的一个重要方面是ACS能够异步地通知CPE某一配置的改变。这使得自动配置机制可用于需要对CPE进行近于实时配置的服务。比如,这一特性可用来给最终用户立即提供预定服务/特性,而无需等待下一阶段通知的时延。
CWMP 包含一种可以让 ACS 在任何时候向 CPE 发起连接请求的机制,通知 CPE 向 ACS 建立一个通讯会话。
同时 CWMP 也允许用 CPE polling 来代替 ACS 发起连接,CWMP不会依靠 polling 或建立 CPE 的永久连接来提供异步通知。
# CPE 发起连接
CPE 可以在任何时候使用预定的 ACS 地址向 ACS 发起建立连接请求。在下面的情况下,CPE 必须向 ACS 发起建连并发送 Inform RPC method
- CPE 初始安装时第一次向接入网发起建连
- 上电或重启
- 在每一个通知周期间隔(PeriodicInformInterval,例如,每24小时)
- 当可选的 ScheduleInform 方法被要求执行时
- 当 CPE 接收到来自 ACS 的有效连接请求时
- 当 ACS 的 URL 发生变化时
- 当参数发生变化时,而且此参数要求在改变时发送 Inform 报文
- ACS 自己通过SetParameterValue使得参数发生改变时不能引起一个新的会话的发起,但被“active notification“标识的参数由于一个外部的原因(该改变源非 ACS 自身)。
- 会话不正常结束时会发起重新建连
# CPE 中止连接
当 CPE 或 ACS 不存在未传输报文时,CPE 必须不能继续维护这个到 ACS 的连接。
# ACS 发起连接
ACS 可以在任何时候使用连接请求机制请求 CPE 发起一个到 ACS 的连接。CPE 需要支持此机制,同时在 ACS 侧建议支持此机制。
此机制依赖于 CPE 要有一个可被 ACS 路由到的 IP 地址。如果 CPE 在防火墙或 NAT设备后面,ACS 将完全无法连接到这个 CPE,在这种情况下,只能由 CPE 主动发起连接。
- 连接请求是一个到 CPE 指定的 URL 的 HTTP 1.1 GET。这个 URL 在 CPE 上面是一个有效的只读参数。这个 URL 应当由 CPE 随机产生,它唯一对应一个 CPE。
- 连接请求必须使用 HTTP,而不是 HTTPS,对应的 URL 必须是一个 HTTP URL。
- 连接请求的 HTTP GET 里面不应该有数据,CPE 应该忽略里面的所有数据。
- CPE 在执行之前必须使用摘要认证(digest-authentication)来对 ACS 进行认证,如果认证失败,CPE 不能向 ACS 发起连接。
- CPE 必须允许来自任何源地址的连接请求
- CPE 应当限制在某段时间内它能接受的连接请求数,防止拒绝服务攻击。
# HTTP 的使用
CPE 和 ACS 之间的 SOAP 消息承载于 HTTP 1.1 之上,CPE 作为 HTTP 客户端而 ACS 作为 HTTP 服务器端。
注:CWMP 也用 HTTP 来实现连接请求,此时,ACS 作为一个 HTTP 客户端而 CPE 作为一个 HTTP 服务器端。
# SOAP over HTTP
- ACS 到 CPE 的 SOAP 请求通过 HTTP response 来发送,CPE 对这个 ACS 的请求所作出的 SOAP 响应通过紧接着的 HTTP POST 来传送。
- 当在一个HTTP 请求报文中存在一个 SOAP 的响应包(或错误响应包)时,HTTP 请求报文的 SOAPAction头必须为空,即 SOAPAction:
- 如果一个 HTTP 请求报文或响应报文里面包含一个 SOAP 封装(envelope),这个 HTTP 的 content-type 头必须包含一个“text/xml”的类型/子类型。
- 一个空的 HTTP POST 必须不得包含 SOAPAction 头。
- 一个空的 HTTP POST 必须不得包含 content-type 头。
- 一个包含某种 CWMP 承载(一个到 CPE 的 SOAP 请求,一个到 CPE 的成功的 SOAP 响应或错误响应)的HTTP 响应必须使用 HTTP 状态码200(OK)。
下面是一个来自 ACS 的包含一个 SOAP 请求和一个 SOAP 响应的 HTTP 响应的例子:
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: xyz
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:cwmp="urn:dslforum-org:cwmp-1-0">
<soap:Header>
<cwmp:ID soap:mustUnderstand="1">1234</cwmp:ID>
</soap:Header>
<soap:Body>
<cwmp:Response1>
<argument>value</argument>
</cwmp:Response1>
</soap:Body>
</soap:Envelope>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:cwmp="urn:dslforum-org:cwmp-1-0">
<soap:Body>
<cwmp:Request2>
<argument>value</argument>
</cwmp:Request2>
</soap:Body>
</soap:Envelope>
# Transaction Sessions
-
为了把一系列有序的事务处理形成一个单独的会话,CPE 应该在整个会话过程中始终维护着一个 TCP 连接。
-
为适应不能维持持续 TCP 连接的情形,ACS 使用 cookie 来维护会话状态。在事务会话结束后,CPE 结束 TCP 连接,并丢弃所有的标记为 Discard 的 cookie。
# 事件
一个事件即一个指示,即已经发生的我们关心的某事件需要 CPE 通过 Inform 请求来通知 ACS。
事件类型
Event Code | Explanation |
---|---|
0 BOOTSTRAP | 指示此次会话由第一次 CPE 安装或 ACS URL 发生了变化而建立的。 |
1 BOOT | 指示此会话是由 CPE 上电或重启所建立的。 |
2 PERIODIC | 指示此会话的建立时基于周期性的 Inform。 |
3 SCHEDULED | 指示此次会话的建立是由于ScheduleInform 方式呼叫引起的。 |
4 VALUE CHANGE | 指示需要通知的参数值已经发生了变化。 |
5 KICKED | 指示此会话是为了 web identity 管理而建立的。 |
6 CONNECTION REQUEST | 指示了此会话是因为一个来自 ACS 的连接请求而建立的。 |
…… | …… |
# 报文跟踪
CPE –> ACS
CPE 上电,发起不带认证头的 Inform 报文,
内容包括:
- ID:每个请求使用的一个唯一标识符,对应的响应也要使用此标识符。
- 设备信息:制造商、设备类型、OUI、SN
- 事件类型
- 硬件版本、软件版本、协议版本、CPE URL
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap-env:Header>
<cwmp:ID soap-env:mustUnderstand="1">1350490027</cwmp:ID>
</soap-env:Header>
<soap-env:Body>
<!-- 任何时候想要建立与 ACS 的连接,都要发 Inform 信息,来初始化一个传输序列,向 ACS 服务器上报一些事件,具体事件携带在 EventCode 中 -->
<cwmp:Inform>
<!-- 设备描述信息 -->
<DeviceId>
<!-- 设备厂商 -->
<Manufacturer>Foobar Inc.</Manufacturer>
<!-- 设备制造商的唯一标示 -->
<OUI>147AD2</OUI>
<!-- 设备类型 -->
<ProductClass>FooGate 2008</ProductClass>
<!-- 设备序列号 -->
<SerialNumber>022882525200</SerialNumber>
</DeviceId>
<!-- 引起此次会话建立的具体事件 -->
<Event soap-enc:arrayType="cwmp:EventStruct[1]">
<EventStruct>
<EventCode>6 CONNECTION REQUEST</EventCode>
<CommandKey/>
</EventStruct>
</Event>
<!-- 接收响应的允许SOAP信包数目,0表示无限制 -->
<MaxEnvelopes>1</MaxEnvelopes>
<!-- cpe当前的时间 -->
<CurrentTime>2020-07-16T17:49:10+0800</CurrentTime>
<!-- 完成inform调用前尝试的次数每次加1 -->
<RetryCount>8</RetryCount>
<!-- CPE设备参数列表-->
<ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[7]">
<ParameterValueStruct>
<!-- 设备描述信息 -->
<Name>InternetGatewayDevice.DeviceSummary</Name>
<Value xsi:type="xsd:string"/>
</ParameterValueStruct>
<ParameterValueStruct>
<!-- 设备的硬件版本信息 -->
<Name>InternetGatewayDevice.DeviceInfo.HardwareVersion</Name>
<Value xsi:type="xsd:string">1.0</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<!-- 设备的软件版本信息 -->
<Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion</Name>
<Value xsi:type="xsd:string">1.0</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name>
<Value xsi:type="xsd:string">1.0</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name>
<Value xsi:type="xsd:string"/>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.ManagementServer.ParameterKey</Name>
<Value xsi:type="xsd:string"/>
</ParameterValueStruct>
<ParameterValueStruct>
<!-- CPE URL -->
<Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name>
<Value xsi:type="xsd:string">http://10.10.68.236:7547/cpe</Value>
</ParameterValueStruct>
</ParameterList>
</cwmp:Inform>
</soap-env:Body>
</soap-env:Envelope>
ACS –> CPE
NoMoreRequests 为 0,说明 ACS 有后续请求,最后一次请求中发送 1。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 对设备端 inform 消息的响应,即接受连接请求 -->
<SOAP-ENV:Envelope
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
<cwmp:ID SOAP-ENV:mustUnderstand="1">1350490027</cwmp:ID>
<cwmp:NoMoreRequests>0</cwmp:NoMoreRequests>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<cwmp:InformResponse>
<MaxEnvelopes>1</MaxEnvelopes>
</cwmp:InformResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
ACS –> CPE
GetParameterValues
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
<cwmp:ID SOAP-ENV:mustUnderstand="1">ID:intrnl.unset.id.GetParameterValues1594896544585.208248739</cwmp:ID>
<cwmp:NoMoreRequests>0</cwmp:NoMoreRequests>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<cwmp:GetParameterValues>
<ParameterNames SOAP-ENC:arrayType="xsd:string[1]">
<string>InternetGatewayDevice.DeviceInfo.SerialNumber</string>
</ParameterNames>
</cwmp:GetParameterValues>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
CPE –> ACS
GetParameterValuesResponse
<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:cwmp="urn:dslforum-org:cwmp-1-0"
xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap-env:Header>
<cwmp:ID soap-env:mustUnderstand="1">ID:intrnl.unset.id.GetParameterValues1594896544585.208248739</cwmp:ID>
</soap-env:Header>
<soap-env:Body>
<cwmp:GetParameterValuesResponse>
<ParameterList soap-enc:arrayType="cwmp:ParameterValueStruct[1]">
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceInfo.SerialNumber</Name>
<Value xsi:type="xsd:string">022882525200</Value>
</ParameterValueStruct>
</ParameterList>
</cwmp:GetParameterValuesResponse>
</soap-env:Body>
</soap-env:Envelope>