7. 测试激活请求和响应 (Test Activation Request and Response)
本节按照客户端和服务器的发送与处理过程划分, 然后再次回到客户端处理流程.
7.1. 客户端生成测试激活请求 (Client Generates Test Activation Request)
成功完成建立交换后, 客户端应 (SHALL) 组合并发送 Test Activation Request 到服务器在 Test Setup Response 中传达的 UDP 端口号, 即新的临时端口, 而不是标准 UDPSTP 端口.
UDP PDU 格式布局如下 (big-endian AB):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| txInterval1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| udpPayload1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| burstSize1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| txInterval2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| udpPayload2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| burstSize2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| udpAddon2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| pduId | protocolVer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| cmdRequest | cmdResponse | lowThresh |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| upperThresh | trialInt |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| testIntTime | reserved1 | dscpEcn |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| srIndexConf | useOwDelVar |highSpeedDelta |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| slowAdjThresh | seqErrThresh |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ignoreOooDup |modifierBitmap | rateAdjAlgo | reserved2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. srStruct (28 octets) .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| subIntPeriod | reserved3 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| reserved4 | reserved5 | authMode |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| authUnixTime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. authDigest (32 octets) .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| keyId | reservedAuth1 | checkSum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
图 6: Test Activation PDU 布局.
字段根据默认值或命令行选项填充. authentication 和 checkSum 字段采用与 Setup Request 和 Response 相同的方法.
pduId: IANA 已分配十六进制值 0xACE2 (第 12.3.1 节).
cmdRequest: 设置为 CHTA_CREQ_TESTACTUS 表示上行测试激活, 或者设置为 CHTA_CREQ_TESTACTDS 表示下行测试激活. 注意, CHTA_CREQ_NONE 仍未使用. 见第 12.3.6 节.
cmdResponse: 定义了 3 个 CHTA_CRSP_<Indication> 值; 见图 7.
lowThresh: 一个 2 octets 字段. Round-Trip Time (RTT) 变化范围的下限阈值 (该范围由高于最小 RTT 的值组成); 另见 [TR-471] 表 3.
upperThresh: 一个 2 octets 字段. RTT 变化范围的上限阈值 (该范围由高于最小 RTT 的值组成); 另见 [TR-471] 表 3.
trialInt: 一个 2 octets 字段, 表示 Status Feedback/trial interval, 单位为 ms. 测试间隔 Delta_t 被细分为若干 Sub-Intervals dt, 每个 Sub-Interval 又进一步划分为若干 trial intervals (见 [TR-471]). 它从 1 开始, 并在单个测试间隔 (testIntTime) 内连续递增.
testIntTime: 一个 2 octets 字段. 使用搜索算法时测试 (下行或上行) 的持续时间, 作为搜索过程的最大持续时间, 单位为 seconds (另见 [TR-471] 表 3 中的 TestInterval).
dscpEcn: Diffserv code point 和 ECN 字段; 另见 [TR-471] 指定的 DSCP 字段. 本规范不提供支持 ECN 的传输; 因此, 发送方应 (SHALL) 将 ECN 字段设置为 not_ECT.
srIndexConf: 一个 2 octets 字段. 请求的 Configured Sending Rate Table 索引, 用于 Test Activation Request, 表示期望的固定发送速率或起始发送速率 (分别取决于 CHTA_SRIDX_ISSTART 是清除还是设置). 因为 0 是有效的固定发送速率索引或起始发送速率索引, 在请求服务器默认行为时 (即以所选负载速率调整算法的最小/零索引开始), 该字段应 (SHALL) 设置为其最大值 (CHTA_SRIDX_DEF). 这应 (SHALL) 等价于将 srIndexConf 设置为 0 并设置 CHTA_SRIDX_ISSTART bit.
useOwDelVar: 一个 1 octet 字段. Boolean, 默认值为 True (如果为 False, 在负载速率调整算法中使用 RTT=round-trip delay variation; 如果为 True, 使用 EnableIPDV, 即在负载速率调整算法中使用单向延迟变化). 见 [TR-471] 表 1 中的 EnableIPDV.
highSpeedDelta: 一个 1 octet 字段; 见 [RFC9097] 附录 A.
slowAdjThresh 和 seqErrThresh: 两个 2 octets 字段; 见 [RFC9097] 附录 A.
ignoreOooDup: 一个 1 octet 字段. 忽略乱序重复项, Boolean. 当为 True 时, 只有丢包计入接收数据包序列号错误. 当为 False 时, 丢包, 乱序和重复总数都计为序列号错误. 默认值为 True (另见 [TR-471] 表 3).
modifierBitmap: 一个 1 octet 字段. 本文档只在此 bitmap 中分配 2 个 bits; 见第 12.3.7 节:
CHTA_SRIDX_ISSTART(0x01): 将srIndexConf视为负载速率调整算法要使用的起始发送速率.CHTA_RAND_PAYLOAD(0x02): 随机化 Load PDU 头部之后的负载内容.
本文档将其他 bit 位置保留为未分配.
rateAdjAlgo: 一个 1 octet 字段. 应用的负载速率调整算法; 见第 12.3.8 节.
srStruct: 发送速率结构 (Sending Rate structure). 服务器在上行测试的 Test Activation Response 中使用它, 向客户端传达客户端应 (SHALL) 使用的 (初始) Load PDU 传输参数. 对于 Test Activation Request 或下行测试, 此结构应 (SHALL) 置零. 可用两组周期性传输参数, 从而允许两个独立发送器 (以支持很高的速率粒度). 字段定义如下:
txInterval1和txInterval2: 两个 4 octets 字段, 表示负载速率发送间隔, 单位为 us (microseconds). 为获得最佳速率选择, 建议采用 100 us 粒度.udpPayload1和udpPayload2: 两个 4 octets 字段, 表示负载速率下的 UDP 负载, 单位为 bytes.burstSize1和burstSize2: 两个 4 octets 字段, 以无量纲数 (数据报数量) 表示负载速率下的 burst size.udpAddon2: 一个 4 octets 字段, 表示在txInterval2发送序列末尾发送的单个 Load PDU 的大小, 即使udpPayload2或burstSize2为 0 并因此自身不产生任何传输, 也会发送该 PDU.
subIntPeriod: 一个 2 octets 字段. Test Sub-Interval 周期, 单位为 ms (另见 [TR-471] 表 3). 对 subIntPeriod 位于 100 到 10000 ms 范围内的试验得到默认值 1000 ms.
authMode: 与第 6.1 节相同.
authUnixTime: 与第 6.1 节相同.
authDigest: 与第 6.1 节相同.
keyId: 与第 6.1 节相同.
reservedAuth1: 与第 6.1 节相同.
checkSum: 与第 6.1 节相同.
Test Activation Request/Response 消息 PDU (以及包含的 Sending Rate 结构) 应 (SHALL) 按如下方式组织:
<CODE BEGINS>
//
// Sending Rate structure for a single row of transmission parameters
//
struct sendingRate {
uint32_t txInterval1; // Transmit interval (us)
uint32_t udpPayload1; // UDP payload (bytes)
uint32_t burstSize1; // UDP burst size per interval
uint32_t txInterval2; // Transmit interval (us)
uint32_t udpPayload2; // UDP payload (bytes)
uint32_t burstSize2; // UDP burst size per interval
uint32_t udpAddon2; // UDP add-on (bytes)
};
//
// Control header for UDP payload of Test Act. Request/Response PDUs
//
struct controlHdrTA {
#define CHTA_ID 0xACE2
uint16_t pduId; // PDU ID
uint16_t protocolVer; // Protocol version
#define CHTA_CREQ_NONE 0
#define CHTA_CREQ_TESTACTUS 1 // Test activation upstream
#define CHTA_CREQ_TESTACTDS 2 // Test activation downstream
uint8_t cmdRequest; // Command Request
#define CHTA_CRSP_NONE 0 // (used with request)
#define CHTA_CRSP_ACKOK 1 // Acknowledgment
#define CHTA_CRSP_BADPARAM 2 // Bad/invalid test params
uint8_t cmdResponse; // Command Response
uint16_t lowThresh; // Low delay variation threshold (ms)
uint16_t upperThresh; // Upper delay variation threshold (ms)
uint16_t trialInt; // Status Feedback/trial interval (ms)
uint16_t testIntTime; // Test interval time (sec)
uint8_t reserved1; // (reserved for alignment)
uint8_t dscpEcn; // Diffserv and ECN field for testing
#define CHTA_SRIDX_DEF UINT16_MAX // Request default server search
uint16_t srIndexConf; // Configured Sending Rate Table index
uint8_t useOwDelVar; // Use one-way delay, not RTT (BOOL)
uint8_t highSpeedDelta; // High-speed row adjustment delta
uint16_t slowAdjThresh; // Slow rate adjustment threshold
uint16_t seqErrThresh; // Sequence error threshold
uint8_t ignoreOooDup; // Ignore out-of-order/Dup (BOOL)
#define CHTA_SRIDX_ISSTART 0x01 // Use srIndexConf as starting index
#define CHTA_RAND_PAYLOAD 0x02 // Randomize payload
uint8_t modifierBitmap; // Modifier bitmap
#define CHTA_RA_ALGO_B 0 // Algorithm B
#define CHTA_RA_ALGO_C 1 // Algorithm C
uint8_t rateAdjAlgo; // Rate adjust. algorithm
uint8_t reserved2; // (reserved for alignment)
struct sendingRate srStruct; // Sending Rate structure
uint16_t subIntPeriod; // Sub-Interval period (ms)
uint16_t reserved3; // (reserved for alignment)
uint16_t reserved4; // (reserved for alignment)
uint8_t reserved5; // (reserved for alignment)
// ========== Integrity Verification ==========
uint8_t authMode; // Authentication mode
uint32_t authUnixTime; // Authentication timestamp
uint8_t authDigest[AUTH_DIGEST_LENGTH];
uint8_t keyId; // Key ID in shared table
uint8_t reservedAuth1; // (reserved for alignment)
uint16_t checkSum; // Header checksum
};
<CODE ENDS>
图 7: Test Activation PDU.
7.2. 服务器处理测试激活请求并生成响应 (Server Processes Test Activation Request and Generates Response)
服务器在新连接上收到 Test Activation Request 后, 会选择接受, 忽略或修改任意测试参数. 当服务器回复 Test Activation Request 消息时, Test Activation Response PDU 与 Request PDU 具有完全相同的结构, 并且应 (SHALL) 保留其中收到的原始值, 除非这些值被显式强制改为服务器可接受的值.
服务器收到 Test Activation Request 消息时, 应 (SHALL) 首先遵循第 6.2 节第 2 段列出的消息验证过程 (Message Verification Procedure).
7.2.1. 服务器拒绝或修改请求 (Server Rejects or Modifies Request)
评估 Test Activation Request 时, 服务器可以 (MAY) 允许客户端通过 srIndexConf 指定自己的固定发送速率或起始发送速率.
或者, 服务器可以 (MAY) 对客户端可成功请求的固定发送速率或起始发送速率实施最大限制. 如果客户端的 Test Activation Request 超过服务器配置的最大值, 服务器必须 (MUST) 拒绝该请求, 或者将该值强制改为配置的最大 bit rate, 并在 Test Activation Response 中将该最大值传达给客户端. 客户端当然可以酌情选择结束测试.
服务器可选择 (OPTION) 强制客户端使用不同于 Test Activation Request 中值的其他参数如下 (按作用分组):
- 负载速率调整算法:
lowThresh,upperThresh,useOwDelayVar,highSpeedDelta,slowAdjThresh,seqErrThresh,highSpeedDelta,ignoreOooDup和rateAdjAlgo. - 测试持续时间/间隔:
trialInt,testIntTime和subIntPeriod. - 数据包标记:
dscpEcn.
强制修改是朝着使用服务器配置值执行测试迈出的一步; 即使客户端可能偏好某些值, 服务器也会给客户端一个机会, 让其使用不同于偏好集合的值运行测试. 在这些情况下, Command Response 值应 (SHALL) 为 CHTA_CRSP_ACKOK.
注意, 服务器也可以选择完全拒绝请求, 并返回适当的 cmdResponse 字段值 (目前只有 CHTA_CRSP_BADPARAM; 见第 12.3.9 节).
是否发送此错误响应取决于操作的安全模式以及 authDigest 验证结果.
如果 Test Activation Request 必须被拒绝 (由于 Command Response 值为 CHTA_CRSP_BADPARAM), 并且:
- 如果
authDigest有效, 应 (SHALL) 向客户端发回 Test Activation Response, 并带有对应的 Command Response 值以指示拒绝原因. - 如果
authDigest无效, Test Activation Request 应该 (SHOULD) 静默失败. 例外情况是操作支持: 允许服务器管理员发送 Activation Response 以支持操作和故障排除.
服务器在错误条件下不应 (SHALL NOT) 传达适当 Command Response 代码 (静默失败) 的其他情形如下:
- Test Activation Request PDU 大小不等于图 7 中所示的
struct controlHdrTA大小. - PDU ID 不是
0xACE2(Test Activation PDU). - 已检测到定向攻击.
在这种情况下, 服务器会允许 Test Activation Requests 静默终止. 攻击检测超出本规范范围.
7.2.2. 服务器接受请求并生成响应 (Server Accepts Request and Generates Response)
当服务器发送 Test Activation Response 时, 它应 (SHALL) 将 cmdResponse 字段设置为 CHTA_CRSP_ACKOK (见第 12.3.9 节).
如果客户端请求了上行测试, 服务器应 (SHALL):
- 在 Sending Rate 结构中包含 Sending Rate Table 第一行的传输参数 (如果通过将
srIndexConf设置为CHTA_SRIDX_DEF请求). - 或者, 在 Sending Rate 结构中包含 Sending Rate Table 中指定的 Configured Sending Rate Table 索引 (
srIndexConf) 对应的传输参数. 其中, 如果在modifierBitmap中设置了CHTA_SRIDX_ISSTART, 则该值将作为负载速率调整算法的起始速率; 否则, 它将被视为固定速率测试.
在为下行测试生成 Test Activation Response (接受) 时, 服务器应 (SHALL) 将 Sending Rate 结构的所有 octets 设置为 0.
如果激活继续, 服务器会为上行或下行测试准备新连接.
在上行测试的情况下, 服务器应 (SHALL) 准备使用单个定时器, 按指定间隔发送 Status PDUs. 对于下行测试, 服务器应 (SHALL) 准备使用双定时器, 根据以下内容发送 Load PDUs:
- 直接使用 Sending Rate Table 第一行的传输参数 (如果请求时
srIndexConf已设置为CHTA_SRIDX_DEF). - 或者, 使用 Sending Rate Table 中指定的 Configured Sending Rate Table 索引 (
srIndexConf) 对应的传输参数. 其中, 如果在modifierBitmap中设置了CHTA_SRIDX_ISSTART, 则该值将作为负载速率调整算法的起始速率; 否则, 它将被视为固定速率测试.
然后, 服务器应 (SHALL) 将 Test Activation Response 发回客户端, 用新的超时值更新 watchdog timer, 并设置测试持续时间定时器以最终停止测试.
7.3. 客户端处理测试激活响应 (Client Processes Test Activation Response)
客户端收到 Test Activation Response 消息时, 应 (SHALL) 首先遵循第 6.2 节第 2 段列出的消息验证过程 (Message Verification Procedure).
客户端收到 (已验证的) Test Activation Response 后, 首先检查 Command Response 值.
如果客户端收到的 Test Activation cmdResponse 字段值指示错误, 客户端应 (SHALL) 向用户或测量系统显示/报告相关消息并退出.
如果客户端收到的 Test Activation cmdResponse 字段值不等于第 12.3.9 节定义的任何代码, 客户端必须 (MUST) 终止连接, 并终止当前建立过程的操作.
如果客户端收到指示成功的 Test Activation Command Response 值 (例如 CHTA_CRSP_ACKOK; 见第 12.3.9 节), 客户端应 (SHALL) 更新其配置, 以使用服务器修改过的任何测试参数. 如果服务器强制修改后的建立参数对客户端不可接受, 客户端结束测试.
为最终确定已接受的测试激活, 客户端应 (SHALL) 准备其连接: 对于上行测试, 设置双定时器以发送 Load PDUs (基于服务器发送的起始传输参数); 或者对于下行测试, 使用单个定时器按指定间隔发送 Status PDUs.
然后, 客户端应 (SHALL) 停止测试启动定时器, 并启动 watchdog timer 以检测服务器是否静默.
连接现在已准备好进行测试.