# TR-069 网络架构

tr069网络框架

# 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 建立一个通讯会话。

tr069-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 来传送。

SOAPoverHTTP

  • 当在一个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>

# TR-069 通信流程

TR-069-HTTP

# 参考

TR069协议简介课件