A/B 编码对齐与指标体系及部分实验结果
0. 本次汇报要说明什么
这次汇报主要回答三个问题:
- 当前算法中,A 端控制序列和 B 端速率观测是如何完成时间对齐的。
- 对齐之后,B 端如何恢复 A 端嵌入的编码,以及如何判断恢复是否正确。
- 最终论文选取哪些指标,这些指标分别说明什么。
核心结论:
- 当前编码器采用的是 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_accuracy、encoding_exact_code_f1、template_dtw_distance_normalized:作为辅助解释指标。
1. 当前系统链路
当前完整分析链路如下:
1 | A 端主动调制速率 |
相关实现文件:
| 文件 | 作用 |
|---|---|
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 | python3 tor_flowctl_random_encoder.py \ |
表示发送两个 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_msadv_kbps
预处理分两步:
- 同一毫秒内如果有多条记录,只保留最后一条。
- 连续
adv_kbps相同的记录,只保留变化点。
然后,每两个相邻变化点构成一个 A 端符号窗口:
1 | W_k^A = [t_k^A, t_{k+1}^A) |
标签定义为:
1 | 最低 adv_kbps 档位 -> 0 |
因此,A 端控制日志最终会被转换成:
1 | 0 1 1 0 1 1 1 1 0 ... |
再以 0 作为分隔符,连续的 1 串就是 code:
1 | 01101111 -> 11, 1111 |
3. B 端观测是什么
B 端输入主要是:
1 | flowctl_client/analysis_C/raw/<exp_id>/B_egress_rate.csv |
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 | DELAY_MIN_MS=0 |
也就是在 0 ms 到 5000 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 | H(tau):A 标签为 1 的窗口,对应到 B 端后的速率集合 |
当前使用的对齐评分是:
1 | separation_score(tau) |
这个分数可以理解为:
1 | 高低态之间拉得越开,分数越高; |
最终选择:
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 | b_pred_bit = 1, if b_rate_kbps >= classification_threshold_kbps |
阈值不是固定的,而是在对齐后的有效窗口上扫描得到。
阈值选择优先级是:
encoding_exact_code_f1最大;encoding_bit_accuracy最大;|code_count_delta|最小;fp最小;- 与基线阈值距离最小。
旧口径的作用:
- 可以看每个窗口是否判对;
- 可以计算 bit accuracy、bit error rate;
- 可以按
0切分出 B 端 code,再和 A 端 code 做精确匹配。
但它有一个问题:当前真实编码是高态持续时间,局部窗口短暂波动不一定代表整个 code 失败。
5.2 新口径:duration-based code recovery
新口径直接围绕“高态持续了多久”来恢复 code。
对每个 A 端 code,先确定它的核心时间范围:
1 | A code core = 连续 1 窗口的起止时间 |
然后在 B 端原始采样中统计:
1 | 高于阈值的总持续时间 b_high_total_ms |
为了抗抖动,如果两个高态片段之间只有很短的低谷,就把它们合并为同一个高态过程。这个合并阈值记为 gap_merge_ms。
最后,用持续时间恢复 code unit 数:
1 | predicted_one_count |
恢复出的 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 | Code Recovery Rate = pulse_duration_exact_code_match_rate |
这样读者更容易理解,不需要直接暴露内部字段名。
6.5 模板相似度指标
| 指标 | 含义 | 使用建议 |
|---|---|---|
template_pearson_corr |
A/B 模板序列的 Pearson 相关系数。 | 越高越好,用于解释整体相似性。 |
template_dtw_distance |
A/B 模板序列的 DTW 距离。 | 越低越好,用于解释错位和形变。 |
template_dtw_distance_normalized |
归一化 DTW 距离。 | 适合跨实验比较。 |
这些指标适合解释“为什么这次实验好/坏”,但不适合作为最终检测成功率。
7. 论文指标选择建议
7.1 参考论文的启发
参考论文的性能评估核心是:
1 | detection rate |
并分析这些因素对结果的影响:
- 时间间隔;
- 冗余 bit 数;
- 判定阈值;
- 信号长度;
- 调制强度。
因此,我们后续论文也应该围绕类似问题组织:
1 | 水印能不能被检测出来? |
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_ms、separation_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 ms、600 ms、800 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. 目前可以怎样讲
如果投屏汇报,可以按下面这条主线讲:
- 我们的编码方式已经从幅度编码转向 duration 编码,即 code 由高态持续时间表示。
- 分析器先把 A 端控制日志变成 0/1 窗口,再用 B 端速率序列做 lag 扫描。
- lag 的选择依据是高低态在 B 端的分离度,即
separation_score。 - 对齐后,旧口径可以逐窗口判 bit,但最终更应该看 duration 口径。
- duration 口径直接统计 B 端高态总时长,再除以
slot_ms恢复 code unit。 - 参考论文主要看 detection rate 和 false positive rate,因此我们的论文主指标也应围绕这两类指标。
- 当前阶段性结果显示,多数组合下 pulse code recovery rate 接近 0.99,但仍需要补背景流和重复实验来稳住 FPR 结论。
10. 需要补充和注意的点
当前文档中有几个需要在组会上提前说明的边界:
- 现在的
fpr主要是窗口级 FPR,不等价于最终论文里的流级 false positive rate。 - 当前不同配置的重复次数还不够,趋势只能作为阶段性观察。
best_lag_ms是对齐中间结果,不是效果指标本身;它应该稳定合理,但不是越大越好。encoding_bit_accuracy高不一定代表 code 一定恢复好;相反,bit 口径下降时,duration 口径仍可能保持较好恢复率。- 后续论文里建议把内部字段名转成更清晰的术语,例如:
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 | A 端 duration 编码 |
最终论文应重点回答两个问题:
1 | 水印能否稳定恢复? |
因此,建议将 Code Recovery Rate、False Positive Rate 和 Mean Code Unit Error 作为主指标,将 bit accuracy、code F1、DTW、Pearson、best lag 和 separation score 作为解释性指标。
参考资料
- Zhen Ling, Junzhou Luo, Danni Xu, Ming Yang, Xinwen Fu. Novel and Practical SDN-based Traceback Technique for Malicious Traffic over Anonymous Networks. 用户提供 PDF:https://cse.seu.edu.cn/_upload/article/files/fd/da/57f52d5243c58567c0d08b688e11/d2263ebb-95bc-4a31-9d3f-9900dedaa44a.pdf
- 本项目时间对齐说明:
docs/time_alignment_math.md - 本项目水印探测说明:
docs/watermark_detection_and_source_trace.md - 当前核心实现:
flowctl_client/analysis_C/bin/analyze_run.py