3.2 建立连接
3.2.1 CPE 初始化连接
CPE 可以随时使用预先确定的 ACS 地址通过 CWMP endpoint 启动与 ACS 的连接(请参阅第 3.1 节)。在以下情况下,CPE 必须发出Inform RPC 方法与 ACS 建立连接(按照第 3.7.1.1 节中描述的过程):
-
CPE 在初始安装时首次建立与接入网络的连接
-
上电或复位时
-
每到一个 Inform周期(
ManagementServer.PeriodicInformInterval
)一次(例如,每 24 小时一次) -
每当触发定时Inform时(可选的 ScheduleInform 方法)
-
每当 CPE 收到来自 ACS 的有效连接请求(Connection Request)时(请参见第 3.2.2 节)
-
每当 ACS 的 URL 更改时
-
每当修改 需要启动更改通知的 参数时
-
每当 ACS 通过 SetParameterAttribute 方法标记为"Active notification"的参数的值被外部修改时(ACS 本身以外的原因)。ACS 本身通过 SetParameterValues 产生的参数更改不需要致启动新会话。如果某个参数在 CPE 创建会话以前被多次修改,则 CPE 必须只发送一个Inform。
如果在会话进行过程中由外部原因修改了参数,则此更改会导致在当前会话终止后建立新会话(它不得影响当前会话)。
为了避免过多的流量流向 ACS,CPE 可能会对参数更改通知的频率在本地加以限制。应定义好此限制,以便仅能在异常情况下才超过此限制。如果超过此限制,CPE 可能遵照本地定义推迟通知 ACS会话。在此延迟之后,CPE 必须再启动与 ACS 的会话,并指示自上次此类通知以来发生的所有相关参数更改(已标记为通知的参数)。
-
每当下载或上载完成时,不论成功或失败。前提是 CPE 的策略需要将下载或上载完成通知 ACS。
由 ACS 确认请求的下载或上载完成的通知,必须通知到ACS。
不是由 ACS 确认请求的下载或上载,CPE需要有策略明确是否需要通知到ACS。
注意 - 这种CPE策略可以通过可远程修改的
ManagementServer.AutonomousTransferCompletePolicy
参数来配置的。比如CPE可以配置为在非ACS请求的下载和上传任务中,只有失败时,才需要通知ACS。 -
根据第 3.2.1.1 节中指定的会话重试策略,每当重建未成功终止的会话时。
Kevin:这其实就是失败重连。
当 CPE 或 ACS 上不存在未发完的消息时,CPE 不得保持与 ACS 的开放连接。有关 CPE 会话终止条件的详细信息,请参阅第 3.7.1.4 节。
3.2.1.1 会话重连机制
CPE 必须重试失败的会话,以尝试重新传递以前无法传递的事件,并允许 ACS 及时发出其他请求。第 3.7.1.5 节详细介绍了成功传递事件、重试事件传递以及在传递失败后丢弃事件的规则。CPE 必须记录它尝试重试失败会话的次数。
当 CPE 无法建立会话时,有可能是因为 CPE 支持 CPE WAN 管理协议 v1.1(或更高版本),而 ACS 仅支持 v1.0。如果怀疑是这种情况(请参见第 3.7.2.1 节),则CPE在重试时 必须恢复使用v1.0会话。
CPE 必须在等待 表 3 中指定的时间间隔或者发生新事件之后(以先到者为准)再重试失败的会话。CPE 必须通过从(表3指定的)重连等待范围内随机选择秒数做为等待间隔。在会话失败后重连时,CPE 必须重置它选择的等待间隔,就像它正在进行第一次重建会话时一样。换言之,如果在启动以外的新事件发生时重试会话,则不会重置等待间隔,尽管新事件的持续发生可能会导致会话的启动频率高于表中所示。无论上一个会话失败的原因是什么,或者提示会话重试的条件是什么,CPE必须将会话重试计数告知ACS。
Kevin:这里想说的是,如果会话失败了,CPE要重建会话。有种情况有机会重建会话:1有新事件,2到达重建会话间隔时间。重建会话间隔时间是随机选择的,重启时会重置这个随机数。
等待间隔范围由两个参数控制,最小等待间隔和间隔乘数,每个参数对应一个数据模型参数,如下表所述。
描述 | 代号 | 默认值 | 参数名 |
---|---|---|---|
最小等待间隔 | m | 5秒 | ManagementServer.CWMPRetryMinimumWaitInterval |
间隔乘数 | k | 2000 | ManagementServer.CWMPRetryIntervalMultiplier |
这些参数的出厂默认值必须是CPE WAN管理协议之前版本中硬编码的值,即默认列中的值。如第3.1节所述,这些值可能会被通过DHCP获得的值覆盖。ACS也可以随时更改这些参数。
从第十次重启后会话重试尝试开始,CPE必须从下面表3 所示的固定最大范围中进行选择。CPE必须继续重试失败的会话,直到它成功终止,或者直到满足表8中“重试/放弃策略”列中定义的规则。一旦会话成功终止,CPE必须将会话重试计数重置为零,并且不再应用会话重试策略来确定何时启动下一个会话。
表3- 会话重试间隔
重试计数 | 默认等待间隔范围 | 实际等待间隔范围 |
---|---|---|
#1 | 5-10 | m – m.(k/1000) |
#2 | 10-20 | m.(k/1000) – m.(k/1000)2 |
#3 | 20-40 | m.(k/1000)2 – m.(k/1000)3 |
#4 | 40-80 | m.(k/1000)3 – m.(k/1000)4 |
#5 | 80-160 | m.(k/1000)4 – m.(k/1000)5 |
#6 | 160-320 | m.(k/1000)5 – m.(k/1000)6 |
#7 | 320-640 | m.(k/1000)6 – m.(k/1000)7 |
#8 | 640-1280 | m.(k/1000)7 – m.(k/1000)8 |
#9 | 1280-2560 | m.(k/1000)8 – m.(k/1000)9 |
#10及以上 | 2560-5120 | m.(k/1000)9 – m.(k/1000)10 |
3.2.1.2 使用随机源端口
每次CPE在重新启动后首次连接到ACS时,它都应该使用不同的临时TCP源端口,以避免重复使用上次使用的相同端口。如果自上次连接以来经过的时间小于ACS配置的TCP time_WAIT值,重复使用同一端口可能会导致ACS拒绝连接。
为了尽量减少连续使用相同临时端口号的可能性,应使用强随机化机制选择端口。
3.2.2 ACS初始化连接
ACS可以随时请求CWMP端点使用Connection Request机制发起到ACS的连接。CPE需要支持这种机制,建议ACS支持这种机制。
这种机制依赖于ACS可以连接到的CPE。如果CPE位于防火墙后面,或者ACS和CPE之间有NAT设备,ACS可能根本无法访问CPE。附录K定义了一种机制,使ACS可以联系这种无法直接联系到的CPE。
该机制依赖于ACS在CPE发起的交互中至少与CWMP端点进行了一次事先通信。在此交互过程中,如果ACS希望未来允许ACS发起连接,它将使用ManagementServer.ConnectionRequestURL
参数的值。(请参见[27]、[34]和[35])。如果用于管理访问的URL发生变化,CPE必须通过Inform消息通知ACS。
IANA已经为CPE WAN管理协议分配了7547端口(参见[20]),CPE可以在连接请求URL中使用该端口。
3.2.2.1 生成连接请求Generic Connection Request Requirements
连接请求机制具有以下通用要求(意味着这些要求适用于任何独立于正在使用的传输协议的连接请求通信):
-
CPE需要接受任何有正确认证参数的来源所发送的Connection Request
-
CPE应限制特定CWMP端点在给定时间段内能接受的Connection Request数量,以进一步降低“拒绝服务攻击”的可能性。如果CPE因此选择拒绝连接请求,则CPE必须给该Connection Request回复特定错误响应。
-
如果CPE成功验证并响应了特定CWMP端点的Connection Request,并且如果CWMP端点没有正在进行的会话,那么它必须在发送响应的30秒内,尝试使用预先确定的ACS地址(参见第3.1节)建立会话,其中在Inform中包含“6 CONNECTION REQUEST” EventCode。
注意 - 在实践中,可能会出现特殊情况,导致CPE在极少数情况下无法满足这一要求。
-
如果ACS接收到对连接请求的成功响应,但在至少30秒之内,CPE尚未成功建立包括Inform中的“6 CONNECTION REQUEST” EventCode的会话,则ACS可以重试对该CPE的连接请求。
-
如果CPE在成功认证并响应Connection Request后,但在与ACS建立会话之前,接收到同一CWMP端点的一个或多个成功认证的Connection Request,则CPE必须为每个连接请求返回成功响应,但无论在此期间收到多少Connection Request,都不得因这些额外的Connection Request而为同一CWMP端点建立任何会话。
-
如果CPE在接收到一个或多个Connection Request时已经在与至少一个CWMP端点的ACS的会话中,则不得因此提早终止针对任何CWMP端点的任何会话。CPE必须改为采取特定其他代替行动。
该要求适用于在CPE认为自己处于与至少一个CWMP端点的会话期间的任何时间内接收到的连接请求,包括CPE正在建立会话的期间。
-
除上述原因外,CPE不得以任何其他原因拒绝通过认证的Connection Request。如果CPE因上述任何原因拒绝连接请求,则不得因该Connection Request而启动与ACS的会话。
3.2.2.2 HTTP 连接请求
通过HTTP传输时,Connection Request机制还具有以下要求:
-
连接请求端口只能用于TR-069连接请求。不得与任何其他协议共享。
-
连接请求必须使用HTTP 1.1访问CPE指定的特定URL。URL值在CPE上是只读参数。该URL值的路径应由CPE随机生成,以便每个CPE都是唯一的。
-
连接请求必须使用HTTP,而不是HTTPS。关联URL必须是HTTP URL。
-
连接请求HTTP GET中没有传输数据。CPE应忽略可能包含的任何数据。
-
CPE必须使用HTTP身份验证[8]和中定义的HTTP摘要身份验证[9]方案对ACS进行身份验证,然后才能继续。身份验证请求未成功时,CPE不得启动与ACS的连接。
-
CPE对成功认证的连接请求的响应必须使用HTTP状态码:“200(正常)”或“204(无内容)”。CPE必须在成功认证后立即发送此响应,然后再启动产生的会话。HTTP响应中消息正文的长度必须为零(第3.3节/RFC 7230[^6])。
-
CPE应限制特定CWMP端点在给定时间段内接受的连接请求数量,以进一步降低拒绝服务攻击的可能性。如果CPE因此选择拒绝连接请求,则CPE必须使用HTTP 503状态码(服务不可用)响应该连接请求。此外,CPE在响应中不应包含HTTP Retry After header。
-
如果CPE在接收到一个或多个连接请求时已经在与至少一个CWMP端点的ACS的会话中,则不得因此过早终止针对任何CWMP端点的任何会话。CPE必须采取以下HTTP特定的替代措施之一:
通过使用HTTP 503状态代码(服务不可用)进行响应来拒绝每个连接请求。在这种情况下,CPE不应该在响应中包含HTTP Retry After header。
在CWMP Endpoint的当前会话完成后,每次只启动一个新会话(无论在上一个会话中收到了多少连接请求),其中在通知中包含“6 CONNECTION REQUEST” EventCode。必须拒绝未被接受的连接请求(带有HTTP 503状态代码)。如果新会话是针对当前会话中的CWMP端点的,则CPE必须在现有会话完成并应用该会话的所有更改后立即启动会话。
如果连接请求不是针对当前会话中的任何CWMP端点,当现有会话仍处于活动状态时,CPE可以发起与所请求的CWMP端点的新会话。
该要求适用于在CPE认为自己处于与至少一个CWMP端点的会话期间的任何时间内接收到的连接请求,包括CPE正在建立会话的期间。
-
如果ACS通过设置
Device.ManagementServer.HTTPConnectionRequestEnable
参数为“False” 禁用了HTTP连接请求机制,CPE必须关闭用于HTTP连接请求的端口。