研究

2026-04-30 组会-A/B 编码对齐与指标体系及部分实验结果

A/B 编码对齐与指标体系及部分实验结果

0. 本次汇报要说明什么

这次汇报主要回答三个问题:

  1. 当前算法中,A 端控制序列和 B 端速率观测是如何完成时间对齐的。
  2. 对齐之后,B 端如何恢复 A 端嵌入的编码,以及如何判断恢复是否正确。
  3. 最终论文选取哪些指标,这些指标分别说明什么。

核心结论:

  • 当前编码器采用的是 duration-based 编码:高态持续时间等于 code * slot_ms
  • 当前对齐方法是在候选时延中扫描,选择最能区分 B 端高低态速率的 best_lag_ms
  • 当前最适合论文主展示的指标是:
    • pulse_duration_exact_code_match_rate:作为 detection rate / code recovery rate;
    • fpr 和后续背景流实验中的 flow-level FPR:作为 false positive rate;
    • pulse_duration_mean_abs_code_unit_error:说明恢复错了多少;
    • encoding_bit_accuracyencoding_exact_code_f1template_dtw_distance_normalized:作为辅助解释指标。

1. 当前系统链路

当前完整分析链路如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A 端主动调制速率

A_control_log.jsonl 记录控制事件

构造 A 端 0/1 符号窗口和 code

B_egress_rate.csv 记录出口速率

扫描 lag,完成 A/B 时间对齐

搜索分类阈值和窗口速率聚合方式

恢复 B 端 bit/code

计算 bit、code、duration、误报等指标

相关实现文件:

文件 作用
tor_flowctl_random_encoder.py A 端编码器,负责写入低态/高态速率。
flowctl_client/analysis_C/bin/analyze_run.py 核心分析脚本,负责对齐、恢复和指标计算。
flowctl_client/analysis_C/config/analyzer.env 分析参数配置,包括 lag 扫描范围、步长和最小窗口样本数。
flowctl_client/analysis_C/processed/<exp_id>/metrics.json 每次实验的汇总指标。
duration_code_alignment.json / pulse_duration_alignment.json duration 口径下的编码恢复结果。

2. A 端如何编码

2.1 编码规则

当前编码器只使用两个速率状态:

状态 速率
低态 100 kbps
高态 --high-kbps 指定的值

一个码字的发送形式是:

1
低态分隔 -> 高态保持 N * slot_ms -> 回到低态

其中:

  • N 是 code 的整数值;
  • slot_ms 是单个 slot 的持续时间;
  • 高态持续时间就是 N * slot_ms

例如:

1
2
3
4
5
python3 tor_flowctl_random_encoder.py \
--code-gap-ms 1000 \
--high-kbps 260 \
--slot-ms 1000 \
--codes 2,4

表示发送两个 code:

code 高态持续时间
2 2 * 1000 ms = 2000 ms
4 4 * 1000 ms = 4000 ms

所以,当前算法真正嵌入到流量里的信号不是复杂的符号形状,而是 高态持续时间

2.2 A 端日志如何转成 bitstream

分析器读取:

1
flowctl_client/runs/<exp_id>/A_control_log.jsonl

只保留 event_type == "XON" 的记录,并使用其中的:

  • ts_unix_ms
  • adv_kbps

预处理分两步:

  1. 同一毫秒内如果有多条记录,只保留最后一条。
  2. 连续 adv_kbps 相同的记录,只保留变化点。

然后,每两个相邻变化点构成一个 A 端符号窗口:

1
W_k^A = [t_k^A, t_{k+1}^A)

标签定义为:

1
2
最低 adv_kbps 档位 -> 0
高于最低档位 -> 1

因此,A 端控制日志最终会被转换成:

1
0 1 1 0 1 1 1 1 0 ...

再以 0 作为分隔符,连续的 1 串就是 code:

1
01101111 -> 11, 1111

3. B 端观测是什么

B 端输入主要是:

1
2
flowctl_client/analysis_C/raw/<exp_id>/B_egress_rate.csv
flowctl_client/analysis_C/raw/<exp_id>/B_meta.json

B 端记录的是出口速率序列:

字段 含义
ts_ns B 端采样时间,分析时转成毫秒。
kbps 当前采样窗口内的出口速率。
window_ms B 端采样窗口长度,缺省按 200 ms 处理。

对任意 B 端时间窗口 [u, v),分析器会取出其中的样本,并计算:

  • 均值;
  • 中位数;
  • 最大值;
  • p90
  • 样本数。

如果窗口中的样本少于 MIN_WINDOW_SAMPLES,该窗口不参与后续判决。

4. 时间对齐怎么做

4.1 对齐目标

A 端控制变化不会立刻反映到 B 端速率上,中间存在网络传输和系统响应延迟。当前模型假设这个延迟在一次实验中近似为常数:

1
t^B ≈ t^A + lag

因此,对齐任务就是找到最佳 lag_ms

当前配置:

1
2
3
4
DELAY_MIN_MS=0
DELAY_MAX_MS=5000
LAG_STEP_MS=100
MIN_WINDOW_SAMPLES=5

也就是在 0 ms5000 ms 之间,每隔 100 ms 尝试一个候选时延。

4.2 每个候选 lag 如何评分

对一个候选时延 tau,把每个 A 端窗口平移到 B 端:

1
W_k^B(tau) = [start_k^A + tau, end_k^A + tau)

然后在 B 端窗口里计算速率均值。

接着,按 A 端标签分成两组:

1
2
H(tau):A 标签为 1 的窗口,对应到 B 端后的速率集合
L(tau):A 标签为 0 的窗口,对应到 B 端后的速率集合

当前使用的对齐评分是:

1
2
separation_score(tau)
= (mean(H) - mean(L)) / (std(H) + std(L) + 1e-9)

这个分数可以理解为:

1
2
高低态之间拉得越开,分数越高;
每一类内部越稳定,分数越高。

最终选择:

1
best_lag_ms = 使 separation_score 最大的 lag

4.3 为什么这个方法有效

如果 lag 偏小或偏大,A 端高态窗口会切到 B 端错误位置,低态窗口也会混入错误样本。这样高低两类的 B 端速率会混在一起,separation_score 会下降。

如果 lag 合适,高态窗口映射到 B 端后应整体更高,低态窗口应整体更低,此时分离度最高。

因此,时间对齐本质上是在找一个全局时延,使 A 端的高低态标签和 B 端速率变化最一致。

5. 编码匹配怎么做

当前有两类匹配口径:旧的窗口/bit 口径,以及新的 duration 口径。

5.1 旧口径:逐窗口判 bit

best_lag_ms 下,每个 A 窗口都会映射到一个 B 端窗口,并得到一个 b_rate_kbps

B 端 bit 判决规则是:

1
2
b_pred_bit = 1, if b_rate_kbps >= classification_threshold_kbps
b_pred_bit = 0, otherwise

阈值不是固定的,而是在对齐后的有效窗口上扫描得到。

阈值选择优先级是:

  1. encoding_exact_code_f1 最大;
  2. encoding_bit_accuracy 最大;
  3. |code_count_delta| 最小;
  4. fp 最小;
  5. 与基线阈值距离最小。

旧口径的作用:

  • 可以看每个窗口是否判对;
  • 可以计算 bit accuracy、bit error rate;
  • 可以按 0 切分出 B 端 code,再和 A 端 code 做精确匹配。

但它有一个问题:当前真实编码是高态持续时间,局部窗口短暂波动不一定代表整个 code 失败。

5.2 新口径:duration-based code recovery

新口径直接围绕“高态持续了多久”来恢复 code。

对每个 A 端 code,先确定它的核心时间范围:

1
2
A code core = 连续 1 窗口的起止时间
B code core = A code core + best_lag_ms

然后在 B 端原始采样中统计:

1
高于阈值的总持续时间 b_high_total_ms

为了抗抖动,如果两个高态片段之间只有很短的低谷,就把它们合并为同一个高态过程。这个合并阈值记为 gap_merge_ms

最后,用持续时间恢复 code unit 数:

1
2
predicted_one_count
= round_half_up(b_high_total_ms / duration_slot_ms)

恢复出的 code 是:

1
"1" * predicted_one_count

这个公式是当前新口径最关键的部分。

6. 指标体系

6.1 对齐质量指标

指标 含义 作用
best_lag_ms A 端控制到 B 端响应之间的最佳时延。 说明 A/B 时间轴如何对齐。
separation_score 最佳 lag 下高低态窗口的分离度。 判断对齐是否可靠。
window_coverage_rate 有效 B 窗口数 / A 窗口总数。 判断 B 端观测是否覆盖充分。
mean_high_kbps / mean_low_kbps 高态/低态窗口映射到 B 端后的平均速率。 验证高低态是否真的可分。
median_high_kbps / median_low_kbps 高态/低态窗口 B 端速率中位数。 比均值更抗异常值。

这些指标主要说明“对齐是否成立”,不建议作为论文最终效果的唯一结论。

6.2 窗口级分类指标

窗口级混淆矩阵:

含义
tp A 为高态,B 也判为高态。
tn A 为低态,B 也判为低态。
fp A 为低态,B 误判为高态。
fn A 为高态,B 误判为低态。

由此得到:

指标 公式 含义
accuracy (tp + tn) / all 窗口级总体正确率。
precision tp / (tp + fp) B 判为高态的窗口中,有多少是真的高态。
recall tp / (tp + fn) A 的高态窗口中,有多少被 B 找到。
f1 2PR / (P + R) precision 和 recall 的综合值。
fpr fp / (fp + tn) 低态被误判为高态的比例。
fnr fn / (fn + tp) 高态被漏判的比例。

这里需要注意:当前 fpr 是窗口级误报率。论文里最好进一步补充 flow-level FPR,也就是无水印背景流被最终判为有水印的比例。

6.3 bit / code 旧口径指标

指标 含义 使用建议
encoding_bit_accuracy 对齐后 A/B bit 逐位相同的比例。 辅助展示。
encoding_bit_error_rate bit 不一致比例。 可与 bit accuracy 二选一。
encoding_bit_edit_distance A bitstream 变成 B bitstream 所需最少编辑次数。 诊断错位或插删。
encoding_exact_code_precision B 恢复出的 code 中,有多少与 A 完全一致。 辅助展示。
encoding_exact_code_recall A 真实 code 中,有多少被 B 完全恢复。 辅助展示。
encoding_exact_code_f1 code precision 和 recall 的调和平均。 可作为旧口径代表指标。
encoding_code_edit_distance A code 序列变成 B code 序列的编辑距离。 诊断 code 级错位。
first_one_recall 每个 code 第一个 1 被识别的比例。 诊断边界识别。
later_one_recall code 内后续 1 被识别的比例。 诊断长码内部恢复。

6.4 duration / pulse 主指标

指标 含义 使用建议
duration_code_exact_match_count duration 口径下完整恢复正确的 code 数。 主结果表可展示。
duration_code_exact_match_rate duration 口径下完整恢复正确的 code 比例。 主结果或辅助主结果。
duration_code_mean_abs_error 恢复出的 1 数量与真实数量之间的平均绝对误差。 主结果表建议展示。
duration_code_overestimate_count 高估 code unit 数的 code 数。 误差分析。
duration_code_underestimate_count 低估 code unit 数的 code 数。 误差分析。
duration_code_zero_recovered_count 恢复为 0 的 code 数。 严重漏检分析。
pulse_duration_exact_code_match_rate 按 encoder slot 直接恢复 code unit 的精确匹配率。 建议作为论文主 detection rate。
pulse_duration_mean_abs_code_unit_error code unit 层面的平均绝对误差。 建议作为主误差指标。
pulse_duration_mean_abs_error_ms 高态持续时间的平均绝对误差,单位 ms。 辅助说明时间误差。
pulse_duration_within_sample_window_rate 时长误差不超过一个 B 采样窗口的比例。 辅助说明恢复稳定性。

建议论文主指标统一命名为:

1
2
Code Recovery Rate = pulse_duration_exact_code_match_rate
Mean Code Unit Error = pulse_duration_mean_abs_code_unit_error

这样读者更容易理解,不需要直接暴露内部字段名。

6.5 模板相似度指标

指标 含义 使用建议
template_pearson_corr A/B 模板序列的 Pearson 相关系数。 越高越好,用于解释整体相似性。
template_dtw_distance A/B 模板序列的 DTW 距离。 越低越好,用于解释错位和形变。
template_dtw_distance_normalized 归一化 DTW 距离。 适合跨实验比较。

这些指标适合解释“为什么这次实验好/坏”,但不适合作为最终检测成功率。

7. 论文指标选择建议

7.1 参考论文的启发

参考论文的性能评估核心是:

1
2
detection rate
false positive rate

并分析这些因素对结果的影响:

  • 时间间隔;
  • 冗余 bit 数;
  • 判定阈值;
  • 信号长度;
  • 调制强度。

因此,我们后续论文也应该围绕类似问题组织:

1
2
3
水印能不能被检测出来?
没有水印时会不会误报?
不同参数会如何影响检测率和误报率?

7.2 最终展示指标

论文展示名 当前字段 说明
Detection Rate / Code Recovery Rate pulse_duration_exact_code_match_rate B 端完整恢复 A 端 code 的比例。
False Positive Rate fpr + 背景流 flow-level FPR 衡量无水印或低态被误判的风险。
Mean Code Unit Error pulse_duration_mean_abs_code_unit_error 平均每个 code 错几个 unit。
Bit Accuracy encoding_bit_accuracy 作为旧口径和过程诊断。
Code F1 encoding_exact_code_f1 作为旧 code 口径对比。
Normalized DTW template_dtw_distance_normalized 解释整体模板是否匹配。
Alignment Quality best_lag_ms, separation_score, window_coverage_rate 证明对齐过程可靠。

7.3 建议图表安排

图/表 展示内容 目的
主结果表 Detection Rate、FPR、Mean Code Unit Error、样本数 给出核心结论。
slot 长度影响图 横轴 slot_ms,纵轴 Detection Rate / FPR 对应参考论文中的 time interval。
调制幅度影响图 横轴 high_kbps - low_kbps,纵轴 Detection Rate / FPR 说明调制强度影响。
新旧口径对比表 bit/code 旧口径 vs duration/pulse 新口径 说明为什么采用 duration 口径。
对照实验表 同实验 A/B vs 交叉实验或背景流 说明不是偶然匹配。
对齐质量表 best_lag_msseparation_score、coverage 说明时间对齐稳定性。

8. 现有实验结果

这里用 flowctl_client/analysis_C/reports/meeting_20260429/ 中已经汇总的数据做阶段性说明。

8.1 按调制幅度分组

幅度 high-low 有效实验数 bit accuracy 均值 pulse code 恢复率均值 normalized DTW 均值 FPR 均值
33 kbps 1 1.000 1.000 0.074 0.000
50 kbps 1 0.994 0.987 0.145 0.006
100 kbps 4 0.958 0.992 0.511 0.041

阶段性观察:

  • 三组幅度下 code 恢复率都比较高。
  • 幅度 100 kbps 下平均 FPR 更高,主要受个别实验影响。
  • 当前每组重复次数还少,适合作为组会阶段性结果,不应直接作为最终统计结论。

8.2 按 slot 长度分组

slot_ms 有效实验数 bit accuracy 均值 pulse code 恢复率均值 normalized DTW 均值 FPR 均值
400 3 0.952 0.987 0.527 0.038
600 1 0.970 0.997 0.582 0.057
800 1 1.000 0.996 0.025 0.000

阶段性观察:

  • 400 ms600 ms800 ms 都能恢复出较高比例的 code。
  • 800 ms 在当前数据中表现最干净,但样本只有一次。
  • 后续需要补重复实验,才能判断 slot 长度和恢复稳定性的真实关系。

8.3 代表性实验

实验 slot_ms 幅度 symbol 数 bit accuracy pulse code recovery FPR normalized DTW 说明
E20260429_002 800 100 477 1.000 0.996 0.000 0.025 当前最干净的代表实验。
E20260429_004 600 100 637 0.970 0.997 0.057 0.582 code 恢复好,但窗口级误报略高。
E20260429_005 400 100 794 0.869 0.977 0.101 1.296 bit 口径下降,但 duration 口径仍较稳。
E20260429_006 400 100 624 0.994 0.997 0.006 0.140 400 ms 下的较好样例。
E20260429_008 400 50 622 0.994 0.987 0.006 0.145 较低幅度下仍能恢复。

异常/对照实验:

实验 现象 说明
E20260429_003 bit accuracy 约 0.527,FPR 约 0.300,normalized DTW 约 4.968 对齐和模板相似度很弱,趋势脚本已判为异常。
E20260429_007 bit accuracy 约 0.702,FPR 约 0.239,normalized DTW 约 5.137 误报偏高,适合作为负例讨论。
CMP_* 交叉实验 coverage、code F1、duration match 普遍下降 可作为不同实验不应稳定匹配的对照。

9. 目前可以怎样讲

如果投屏汇报,可以按下面这条主线讲:

  1. 我们的编码方式已经从幅度编码转向 duration 编码,即 code 由高态持续时间表示。
  2. 分析器先把 A 端控制日志变成 0/1 窗口,再用 B 端速率序列做 lag 扫描。
  3. lag 的选择依据是高低态在 B 端的分离度,即 separation_score
  4. 对齐后,旧口径可以逐窗口判 bit,但最终更应该看 duration 口径。
  5. duration 口径直接统计 B 端高态总时长,再除以 slot_ms 恢复 code unit。
  6. 参考论文主要看 detection rate 和 false positive rate,因此我们的论文主指标也应围绕这两类指标。
  7. 当前阶段性结果显示,多数组合下 pulse code recovery rate 接近 0.99,但仍需要补背景流和重复实验来稳住 FPR 结论。

10. 需要补充和注意的点

当前文档中有几个需要在组会上提前说明的边界:

  1. 现在的 fpr 主要是窗口级 FPR,不等价于最终论文里的流级 false positive rate。
  2. 当前不同配置的重复次数还不够,趋势只能作为阶段性观察。
  3. best_lag_ms 是对齐中间结果,不是效果指标本身;它应该稳定合理,但不是越大越好。
  4. encoding_bit_accuracy 高不一定代表 code 一定恢复好;相反,bit 口径下降时,duration 口径仍可能保持较好恢复率。
  5. 后续论文里建议把内部字段名转成更清晰的术语,例如:
    • pulse_duration_exact_code_match_rate 写作 Code Recovery Rate
    • pulse_duration_mean_abs_code_unit_error 写作 Mean Code Unit Error
    • fpr 写作 Window-level False Positive Rate

11. 后续实验建议

实验类型 目的 主看指标
同配置重复实验 统计均值、方差和置信区间。 Detection Rate、FPR、MAE。
不同 slot_ms 对应参考论文中的 time interval。 Detection Rate、FPR、Mean Code Unit Error。
不同 high_kbps 分析调制强度影响。 Detection Rate、FPR、DTW。
不同 code 长度 验证信号长度对误报的影响。 Flow-level FPR、code edit distance。
交叉 A/B 实验 验证不同实验不会偶然匹配。 Code Recovery Rate、FPR、DTW。
干净背景流实验 直接估计 false positive rate。 Flow-level FPR、window-level FPR。

12. 总结

当前项目已经形成了完整的 A/B 编码对齐和指标评估流程。

方法上,关键步骤是:

1
2
3
4
5
6
7
A 端 duration 编码
-> A 端窗口化
-> B 端速率采样
-> lag 扫描对齐
-> 阈值和聚合方式搜索
-> duration / pulse 口径恢复 code
-> 计算检测率、误报率和恢复误差

最终论文应重点回答两个问题:

1
2
水印能否稳定恢复?
干净流量中是否会误报?

因此,建议将 Code Recovery RateFalse Positive RateMean Code Unit Error 作为主指标,将 bit accuracy、code F1、DTW、Pearson、best lag 和 separation score 作为解释性指标。

参考资料