2026-05-14 组会:TD2 指标体系与交替 XON 读侧瓶颈分析
0. 本次汇报要说明什么
本周工作主要围绕两个问题展开:
- 为什么 400 ms 交替 XON(100/500) 场景下,Tor 外发速率无法在每个 400 ms 窗口内稳定形成理想方波。
- TD2(Trend Detection v2)指标体系应该如何解释,尤其是为什么
trend_presence_search在低 slot 下显著优于internal_edge,以及为什么 Hamming distance 能作为合适的块级可用性评估指标。
核心结论:
交替 XON 场景的瓶颈不在 XON 发送频率、SENDME/circuit window 或 Tor bucket refill,而在 Tor 从本地 kernel socket 读数据这一侧。更具体地说,降速
500→100是本地限读,能在 100 ms 窗口内快速生效;升速100→500需要 server 从rwnd_limited的低频发送状态恢复,必须经历 buffer 排空、window 打开、server 唤醒和重新填充 pipeline,因此存在 100-300 ms 的 ramp-up。这个不对称性解释了为什么 400 ms 的 500 阶段常常还没建立稳态就被下一个 100 XON 切断。外发侧看到的不是理想方波,而是“100 阶段快速降到平底,500 阶段缓慢爬升形成尖顶”。
TD2 不再依赖绝对速率阈值,而是把 bit 编码在速率变化方向中:
1 = low→high,0 = high→low。这使它更适合当前这种存在响应延迟、边界扩散和短时 buffer 记忆的信道。在低 slot 下,固定窗口的
internal_edge解码容易被响应 jitter 污染;trend_presence_search在预期跳变附近做 ±200 ms 搜索,天然吸收响应时间抖动。实测中,300 ms slot 下 TP accuracy 达到 95.1%,而 internal_edge 只有 62.0%;200 ms slot 下 TP accuracy 仍有 93.2%,internal_edge 只有 59.3%。对 8-bit pattern block 进一步使用 Hamming distance 和 signed margin 做块级纠错后,低 slot 的可用性显著提高。200 ms slot 下,
TP ≤1 = 85%,TP ≤2 = 96%;300 ms slot 下,TP ≤1 = 92%,TP ≤2 = 99%。这说明即使逐 bit 判决仍有误差,块级恢复已经接近可用。
1. 交替 XON 场景与现象
1.1 实验场景
client 每 400 ms 交替发送 XON,建议速率在 100 KB/s 和 500 KB/s 之间跳变:
1 | t=0: XON rate=100 |
直觉预期是:Tor bucket refill 周期约为 100 ms,所以外发速率应在 1 个 refill 周期内跟随 XON 切换。实际现象是:外发速率无法在 400 ms 窗口内清晰地区分 100 和 500 阶段。
此前已经排除的因素:
| 排除项 | 结论 |
|---|---|
| SENDME / circuit stop | 数量很少,不是 OR 侧窗口耗尽导致 |
| XOFF | 不频繁,不是流控关断导致 |
| Tor bucket refill | 100 ms 粒度足够细,不是 token 更新过慢 |
因此,问题集中到本地读侧:Tor 虽然已经改变 bucket rate,但 read() 能否读到足够数据取决于本地 socket receive buffer 和 server 侧补给。
1.2 关键纠正:慢方向是 100→500
直观上容易认为两个方向都很快——“少读”和“多读”不过是 Tor 本地改个 bucket 参数;另一种常见直觉是认为 500→100 反而慢,因为 buffer 里还有旧数据要“学会反压”。但对 Tor 外发速率而言,这两个直觉都不准。
Tor 的 bucket rate 直接限制 read() 的字节数:
1 | 降低速率 (500→100): |
所以真正的慢方向是 100→500,而不是 500→100。
2. 读侧瓶颈机制
2.1 数据链路
当前链路可以抽象为:
1 | Bucket rate (XON 控制) |
其中:
- 数据流方向是
server -> Tor。 - 反压方向是
Tor bucket/read -> receive window -> server。
这带来两个不同的响应路径:
| 方向 | 控制方式 | 主要瓶颈 | egress 响应 |
|---|---|---|---|
| 500→100 | Tor 直接减少 read() |
bucket 本地限读 | 约 100 ms 内下降 |
| 100→500 | Tor 增加 read(),但依赖 server 补给 |
数据供给链路 | 需要 100-300 ms ramp-up |
2.2 500→100:为什么可以快速下降
当 XON 从 500 切到 100 时,Tor bucket 从 50KB/100ms 变为 10KB/100ms。下一次 read() 直接按新限额读取,最多读约 10 KB。
即使 receive buffer 里还有 500 阶段留下的旧数据,它们也只能以新的低速率被读出。因此旧数据会延迟 server 感受到反压的时间,但不会延迟 Tor 外发速率下降。
1 | t=400ms: XON=100 到达 |
2.3 100→500:为什么爬不上去
在 100 阶段稳定后,系统处于低位平衡:
1 | Tor bucket rate: 10KB/100ms |
切换到 XON=500 后,Tor 可以立刻把 bucket 提到 50KB/100ms,但这只表示“允许读更多”。从这一刻起需要区分两个阶段:
阶段 A(第一个 100 ms 窗口,旧数据 burst):
buffer 里还有 100 阶段积累的 ≈B_max=32 KB。Tor 在新 token 限额内一次读空这部分数据,耗时仅几个系统调用。这会产生一次 ≈32 KB / 100 ms = 320 KB/s 的 burst——看似“快速响应”,但本质上是重放 100 阶段留下的库存,与 server 的当前产出无关。
阶段 B(从第二个 100 ms 窗口起,供给饥饿):
旧数据读完后,buffer 接近为空。Tor 进入“有 token 但无数据可读”的状态,外发速率被 server 实际重新供给的速率限住。server 从“长期被阻塞”恢复到“以 500 KB/s 稳定填满 pipeline”需要几个纲要环节:
- Tor 增量读出 → ACK 携带逐次括大的 rwnd(这一步在 loopback 上是 μs 级,不是瓶颈)。
- 内核唤醒被
send()阻塞的 server 进程。在朊齐压力或 Python GIL/event loop 调度下,此调度延迟常在单位数到数十 ms 级。 - server 重新进入
send()/fp.read(4096)循环,每轮填 8 KB 到 SO_SNDBUF。要让下游 egress 达到 50 KB/100ms,需要连续许多轮 “send → read → send” 才能填满 pipeline。 - Tor token bucket 本身的 100 ms 粒度是上限:即使 server 瞬间恢复,Tor 也只能在下一个 refill 边界上才能让该窗口跑满额度。
主导这 100–300 ms ramp-up 的是第 2、3、4 项:调度唤醒 + 多轮 send-read 填满 pipeline + bucket refill 粒度。TCP rwnd 反馈本身不是瓶颈。对 400 ms 的高态窗口来说,这个 ramp-up 已经是主导开销。
2.4 小 buffer 的作用:更平稳但上升更真实
小 receive buffer(如 32 KB)带来一个看似矛盾的现象:
- 它会让
100→500的 ramp-up 看起来更慢; - 但它让整个链路更平稳、更连续,也让 egress rate 更接近 server 当前真实产出。
原因是 B_max 变成了硬性 burst cap:
1 | 大 buffer: |
因此,小 buffer 下的“慢”反而更可信:它说明控制回路真正闭合了,而不是 buffer 在替 server 播放旧数据。
2.5 对 400 ms 交替 XON 的解释
综合起来,交替 XON(100/500) 的波形应表现为(横轴 ms,纵轴 KB/s,每格约 100 ms 采样窗口):
1 | 500KB/s | .| .| |
关键特征:
- 下降沿极快:
500→100在 1 个 100 ms 采样窗口内完成(图中接近垂直跌落)。 - 上升沿缓慢:
100→500需要 2-3 个 100 ms 窗口才接近目标(图中爬坡段)。 - 500 阶段形成尖顶:刚接近高态就被下一个 100 XON 切断。
- 100 阶段有平底:低态更容易稳定形成。
3. TD2 编码方案
3.1 核心思想
TD2(Trend Detection v2)将信息编码在速率变化方向中,而不是编码在绝对速率值中:
1 | 逻辑 1 = LH = 低速率 -> 高速率 |
每个逻辑 bit 占用两个连续 slot,称为一个 trend pair。信息位于 pair 内部的跳变方向。
3.2 为什么使用趋势而不是绝对阈值
传统阈值判定在短 slot 下不稳定,主要因为:
- Tor flowctl 的控制响应存在约数百毫秒延迟;
- B 端采样粒度会平滑掉边界;
- burst、队列记忆和 TCP buffer 会污染绝对速率;
- 400 ms 交替 XON 场景本身就证明了高态/低态并非理想方波。
但是,即使响应形状被拉宽或延迟,上升/下降趋势通常仍能保留。因此 TD2 的重点从“这个窗口是否高于阈值”转向“这个边界附近是否存在预期方向的变化”。
3.3 基本参数
| 参数 | 含义 | 当前典型值 |
|---|---|---|
TD2_BITS |
基础 pattern | 10101010 |
TD2_REPEAT |
pattern 重复次数 | 100 |
td2_bit_count |
bit 总数 | len(bits) * repeat = 800 |
td2_chip_count |
物理 slot 总数 | bit_count * 2 = 1600 |
ENCODER_SLOT_MS |
物理 slot 时长 | 200 / 300 / 400 / 600 / 800 ms |
ENCODER_CODE_GAP_MS |
pattern 间隔 | 2000 ms |
4. 解码器与指标体系
4.1 解码器分层
当前 TD2 框架中包含以下几类解码器,按从硬判决到软判决、从固定窗口到自适应搜索的顺序排列:
| 解码器 | 核心思想 | 适用性 |
|---|---|---|
slot_diff |
比较 pair 内两个 slot 平均速率 | 简单,但对边界污染敏感 |
internal_edge |
在 pair 内部边界两侧取窗口做差 | 旧推荐 bit 解码器 |
transition_pattern |
直接在 chip transition 上判断方向 | 用于更细粒度边界分析 |
isi_bit_diaglda |
用 25 维采样特征做 Diagonal LDA | ML 辅助解码 |
phase_regularized |
用重复 pattern 的相位均值正则化 | 稳定重复结构 |
trend_presence_search |
在预期跳变附近 ±200 ms 搜索最佳趋势 | 当前低 slot 推荐 |
4.2 internal_edge 的问题
internal_edge 在固定 lag/gap/window 下比较边界前后速率:
1 | center = 第二 slot 起始时间 + lag_ms |
它的问题是:当 B 端响应存在 jitter 时,固定窗口容易错过真实跳变,或者把边界扩散区纳入两侧窗口,导致 score 被污染。
4.3 trend_presence_search 的优势
trend_presence_search 不强行假设跳变落在唯一固定位置,而是在 A 端预期跳变附近以固定步长(当前实现为 20 ms)扫描一段窗口:
1 | for shift_ms in range(-200, +201, step=20): |
这相当于把短时相位抖动显式纳入解码过程。因此它在 200-400 ms slot 下明显优于固定窗口 internal_edge。
4.4 核心指标口径
| 指标 | 含义 |
|---|---|
td2_accuracy |
逐 bit 判定准确率 |
td2_trend_presence_accuracy |
趋势存在检测准确率 |
td2_soft_sum_accuracy |
每个 pattern position 的 soft score 累加后准确率 |
td2_tp_hamming_mean_raw_hd |
TP 预测到已知 pattern 的平均汉明距离 |
td2_tp_hamming_raw_hamming_le_1_rate |
每个 8-bit block 最多错 1 bit 的比例 |
td2_tp_hamming_raw_hamming_le_2_rate |
每个 8-bit block 最多错 2 bit 的比例 |
td2_tp_hamming_median_correction_cost_kbps |
用 signed margin 纠错的代价中位数 |
td2_tp_hamming_correctable_error_block_rate |
有错误 block 中可被纠正的比例 |
对汇报而言,最值得强调的是:逐 bit accuracy 不是唯一目标,块级 Hamming distance 更直接对应 pattern/template 是否可用。
5. 实验结果:TP + Hamming 显著改善低 slot 可用性
5.1 trend_presence_search vs internal_edge
| Slot | internal_edge | trend_presence_search | 提升 |
|---|---|---|---|
| 800 ms | 98.1% | 99.9% | +1.8 pp |
| 600 ms | 98.9% | 100.0% | +1.1 pp |
| 400 ms | 62.1% | 80.4% | +18.3 pp |
| 300 ms | 62.0% | 95.1% | +33.1 pp |
| 200 ms | 59.3% | 93.2% | +33.9 pp |
可以看到,在 600-800 ms 下两者都能工作;真正的差异出现在 200-400 ms。低 slot 下固定窗口解码器失效较快,而 TP 搜索仍能捕获趋势方向。
5.2 平均汉明距离对比
| 实验 | Slot | TP Acc | TP Mean HD | IE Acc | IE Mean HD | TP 优势 |
|---|---|---|---|---|---|---|
| E20260507_002 | 800 ms | 99.9% | 0.01 | 98.1% | 0.15 | HD 降 93% |
| E20260507_003 | 600 ms | 100.0% | 0.00* | 98.9% | 0.09 | HD ≈ 0 |
| E20260508_001 | 400 ms | 99.9% | 0.01 | 78.6% | 1.71 | HD 降 99% |
| E20260510_004 | 400 ms | 80.4% | 1.57 | 62.1% | 3.03 | HD 降 48% |
| E20260511_006 | 300 ms | 95.1% | 0.39 | 62.0% | 3.04 | HD 降 87% |
| E20260511_008 | 200 ms | 93.2% | 0.54 | 59.3% | 3.26 | HD 降 83% |
(*注:0.00 为四舍五入到两位小数,实际 HD ≤ 0.005。)
即使在最差的 400 ms 实验中,TP 的 mean HD 仍从 3.03 降到 1.57。对于 8-bit block 来说,这意味着需要纠错的 bit 数已经从接近半个 block 降到约 1-2 个。
5.3 Hamming ≤1 / ≤2:块级可用性
| 实验 | Slot | TP Acc | TP Mean HD | TP ≤1 | TP ≤2 | TP ≤3 | IE ≤1 | IE ≤3 |
|---|---|---|---|---|---|---|---|---|
| E20260507_002 | 800 ms | 99.9% | 0.01 | 100% | 100% | 100% | 94% | 100% |
| E20260507_003 | 600 ms | 100.0% | 0.00 | 100% | 100% | 100% | 99% | 100% |
| E20260508_001 | 400 ms | 99.9% | 0.01 | 100% | 100% | 100% | 55% | 89% |
| E20260508_002 | 400 ms | 95.6% | 0.35 | 88% | 100% | 100% | 54% | 98% |
| E20260510_004 | 400 ms | 80.4% | 1.57 | 50% | 85% | 96% | 16% | 63% |
| E20260511_006 | 300 ms | 95.1% | 0.39 | 92% | 99% | 100% | 12% | 61% |
| E20260511_008 | 200 ms | 93.2% | 0.54 | 85% | 96% | 99% | 9% | 56% |
这组结果说明:
- 600-800 ms 下,TP block 基本无需纠错。
- 多数 300-400 ms 实验中,
TP ≤1已达到 87-100%,TP ≤2达到 99-100%。 - 200 ms 下仍有
TP ≤2 = 96%,说明块级纠错后仍有较强可用性。 - IE 的
≤1和≤3全面落后,说明固定窗口解码在低 slot 下不是稳定基线。
5.4 Hamming distance 阈值的误报率分析与下界
实际部署中每条目标流只注入 1 个(必要时 2 个)8-bit pattern block,不是 100 次重复。因此判决面对的就是单 block(或最多 2 block)的命中事件,无法靠 $\sqrt R$ 平均把 FP 拉下来。下面把这个口径下的 FP 算清楚,并讨论文献中已有的降 FP 手段。
5.4.1 模型
设:
- 已知 pattern 为固定的 8-bit 串 $\mathbf{p}\in{0,1}^8$(如
10101010)。 - benign 流量解码出的 block $\mathbf{x}\in{0,1}^8$ 在零假设下服从均匀分布,即每个 bit 独立同分布 $\Pr[x_i=0]=\Pr[x_i=1]=1/2$。
- 判决规则:当 $d_H(\mathbf{x},\mathbf{p})\le d$ 时判定为水印命中。
5.4.2 单 block FP($R=1$)
由 Hamming 球体积(Hamming bound):
$$ P_{\mathrm{FP}}(n, d) \;=\; \frac{|B_d|}{2^{n}} \;=\; \frac{\sum_{k=0}^{d}\binom{n}{k}}{2^{n}}. $$
当前 $n=8$ 时:
| $d$ | $\sum_{k\le d}\binom{8}{k}$ | $P_{\mathrm{FP}}$ |
|---|---|---|
| 0 | 1 | 0.391% |
| 1 | 9 | 3.516% |
| 2 | 37 | 14.453% |
$P_{\mathrm{FP}}(8,1)\approx 3.5%$ 在水印检测语境下确实偏高——典型流量水印工作(RAINBOW [^rainbow]、SWIRL [^swirl])追求的 FP 量级是 $10^{-3}$ 到 $10^{-6}$。
5.4.3 双 block FP($R=2$)
注入 2 个 block 时,常见两种判决:
- OR 规则(任一命中即报警,灵敏度优先):$P_{\mathrm{FP}}^{\text{OR}} = 1-(1-P_{\mathrm{FP}})^2 \approx 2P_{\mathrm{FP}}$,FP 变高。
- AND 规则(两个都要命中,特异性优先):$P_{\mathrm{FP}}^{\text{AND}} = P_{\mathrm{FP}}^{2}$,FP 平方。
| $d$ | $P_{\mathrm{FP}}$ ($R=1$) | OR ($R=2$) | AND ($R=2$) |
|---|---|---|---|
| 1 | 3.516% | 6.91% | 0.124% |
| 2 | 14.45% | 26.8% | 2.09% |
如果走 AND,注入 2 个 block 就能把 $d=1$ 的 FP 压到 $\sim 10^{-3}$ 量级,$d=2$ 压到 $\sim 2%$。AND 规则相当于把有效码字长度延长到 $n=16$,符合下一节的核心结论。
5.4.4 文献中降低单 block FP 的方案
Hamming bound 直接告诉我们:FP 仅取决于 $V_d(n)/2^n$。要降只能 (a) 减小 $d$,或 (b) 增大 $n$,或 (c) 让 $\mathbf{x}$ 在 $H_0$ 下的分布偏离均匀(用辅助统计量)。流量水印社区围绕这三条提出过若干方案:
方案 A:增大码字长度 $n$(最直接、最有效)
| $n$ | $d=1$ FP | $d=2$ FP |
|---|---|---|
| 8 (现状) | 3.52% | 14.45% |
| 12 | 0.32% | 2.27% |
| 16 | 0.026% | 0.21% |
| 24 | $1.5\times 10^{-6}$ | $1.9\times 10^{-5}$ |
| 32 | $7.7\times 10^{-9}$ | $1.2\times 10^{-7}$ |
代价是注入时间变长 $n/8$ 倍。$n=16$ 注入时长翻倍但 $d=1$ FP 直接降两个数量级到 0.026%,是性价比最高的一档。SWIRL 默认采用 $n=32$ 量级的码字 [^swirl]。
方案 B:换用 PN / m-sequence 替代 10101010(避免结构化共谋)
零假设里”每 bit 独立 $\mathrm{Bernoulli}(1/2)$”是理想假设。真实 benign 流量在 trend pair 尺度上往往有正自相关(突发持续多个 slot),而 10101010 是周期 2 的极端结构化序列——它最容易和真实流量里的周期成分(轮询、视频 keyframe、TCP RTT 振荡等)发生结构性共谋,使实测 FP 显著高于 $9/256$ 的理论值。
DSSS 类水印(Yu et al. 2007 [^dsss])和 RAINBOW [^rainbow] 都明确用伪随机/m-sequence 作为载波,理由就是:m-sequence 的自相关除零滞后外恒为 $-1/n$,与任何低频周期信号在统计上正交。建议把 TD2_BITS 从 10101010 改成长度匹配的 m-sequence(如 $n=15$ 的 m-sequence 或 $n=8$ 的 Gold 序列),即使保持 $n=8$ 也能让实测 FP 更接近理论值。
方案 C:复合统计检验(HD + 第二统计量 AND 化)
SWIRL [^swirl] 的设计思路:在 Hamming 类匹配之外再加一个独立的统计检验(SWIRL 用的是基于 packet timing centroid 的 KS test),最终判决要求两个检验都通过,FP 相乘。
我们当前指标体系里已有现成可用的”第二统计量”——$\mathtt{td2_tp_hamming_signed_margin}$。signed margin 在 $H_0$ 下近似零均高斯,水印流下显著为正。用它做一次单尾检验(如 $\sum \mathrm{margin}_i > \tau_m$),独立性近似成立,则:
$$ P_{\mathrm{FP}}^{\mathrm{HD}\,\wedge\,\mathrm{margin}} \approx P_{\mathrm{FP}}^{\mathrm{HD}}\cdot P_{\mathrm{FP}}^{\mathrm{margin}}. $$
只要 margin 阈值取在水印流分布的左尾内、benign 分布的右尾外,第二项即可 $\le 10^{-2}$,复合后 $d=1$ 的 FP 就可降到 $\sim 10^{-4}$ 量级。
方案 D(不推荐):BCH/Reed-Solomon 等 ECC 编码
直觉上”用 ECC 让码字更稀疏”听起来能降 FP,但对单码字水印反而无效。因为:(i) 我们只有 1 个固定码字,不存在多个有效码字摊开来;(ii) 真正起作用的还是 $V_d(n)/2^n$ 的球体积。ECC 适合多码字纠错(如发送多 bit 信息时),而不是为了降 FP。所以这条路不应该走。
5.4.5 这些方案对识别率(TPR)的影响
降 FP 不是免费的。设 per-bit 错误率为 $p$,由表 5.1 反推:300 ms slot $p\approx 0.049$,200 ms slot $p\approx 0.068$。在独立 bit 误差近似下,单 block 命中概率为:
$$ \mathrm{TPR}(n,d,p) \;=\; \sum_{k=0}^{d}\binom{n}{k}\,p^{k}(1-p)^{n-k}. $$
把现状 $(n=8, d=1)$ 与各方案在 200/300 ms slot 下的 TPR、FP 同时列出(TPR 由上式估算,FP 由 $V_d(n)/2^n$ 算):
| 方案 | 配置 | TPR @300ms | TPR @200ms | FP | 注入时长 |
|---|---|---|---|---|---|
| 现状 | $n{=}8,d{=}1$ | 94% | 85% | 3.52% | 1× |
| A. 加长 + 同比 $d$ | $n{=}16, d{=}2$ | 96% | 92% | 0.21% | 2× |
| A. 加长 + 同比 $d$ | $n{=}16, d{=}3$ | 99% | 98% | 1.07% | 2× |
| A. 加长 + 固定 $d$ | $n{=}16, d{=}1$ | 81% | 70% | 0.026% | 2× |
| A. 加长 + 同比 $d$ | $n{=}24, d{=}3$ | 98% | 92% | 0.012% | 3× |
| B. AND $R{=}2$ | $n{=}8, d{=}1$, AND | 88% | 72% | 0.124% | 2× |
| C. HD ∧ margin | $n{=}8, d{=}1$ ∧ margin | $\approx 0.99\cdot$TPR | $\approx 0.99\cdot$TPR | $\sim 10^{-4}$ | 1× |
| D. PN/m-sequence | 同 $n=8$ | 与现状同 | 与现状同 | 让实测贴近理论 | 1× |
可以看到:
- A(加长 + 同比 $d$)是少数能在 TPR 不降甚至略升的同时把 FP 砍 1–2 个数量级的方案。$n=16, d=2$ 在 200 ms slot 下 TPR 反而从 85% 升到 92%,FP 从 3.52% 降到 0.21%。代价仅是注入时长翻倍。
- A(加长 + 固定 $d=1$)会显著掉 TPR:$n=16, d=1$ 在 200 ms slot 下 TPR 跌到 70%。所以加长 $n$ 必须同时按比例放大 $d$,保持 $d/n \approx 1/8\sim 1/5$ 的容错预算。这是 SWIRL 论文里反复强调的”码字长度和容错半径要联调”。
- B(AND $R{=}2$)TPR 损失最大:等价于 $\mathrm{TPR}^2$,200 ms slot 下从 85% 掉到 72%。等效 $n$ 翻倍但 $d$ 没翻倍,所以 TPR 退化得比 A 厉害。注入时长一样的话,A 严格优于 B。
- C(HD ∧ signed margin)TPR 损失最小:margin 阈值通常可以选在水印分布的 1%-tail 之外,只损失约 1% TPR;FP 却能再降 1–2 个数量级。是”零注入开销”的优选。
- D(PN/m-sequence)对 TPR 没有副作用:解码端知道 pattern,相关检测仍然成立;它只解决”实测 FP 高于理论”的结构性偏差问题。任何时候都建议做。
可组合的推荐配置(按部署优先级):
- D 立即做:把
TD2_BITS从10101010换成长度 8 的 m-sequence/Gold 序列,无任何代价。 - A 中期推:升到 $n=16, d=2$,TPR 持平、FP 降 17×、注入时长 2×。
- C 长期叠:再加 signed margin 复合检验,FP 再降 $1$–$2$ 个数量级、TPR 损失 ~1%。
三者叠加后,单 block / 单注入场景下可把 FP 拉到 $10^{-5}$ 以下,同时维持 TPR 在 90% 以上。
5.4.6 为什么 $n{=}16, d{=}2$ 是 sweet spot
把 $H_0$(benign)和 $H_1$(水印)下解码到的 Hamming distance 都看成两个二项分布,就能解释为什么这一档同时在 FP 和 TPR 上都赢:
$H_0$ 侧:random block 与已知 pattern 的 Hamming distance 服从
$$ D \mid H_0 \sim \mathrm{Bin}(n, 1/2), \qquad \mu_0 = n/2, \quad \sigma_0 = \tfrac{1}{2}\sqrt{n}. $$
$H_1$ 侧:水印 block 的 bit 误差独立同分布,HD 等于错位个数:
$$ D \mid H_1 \sim \mathrm{Bin}(n, p), \qquad \mu_1 = np, \quad \sigma_1 = \sqrt{np(1-p)}. $$
判决阈值 $d$ 把数轴一分为二:左边判水印命中,右边判背景。FP 是 $H_0$ 在 $[0,d]$ 的左尾,1−TPR 是 $H_1$ 在 $(d, n]$ 的右尾。两个量分别由 $d$ 到两个均值的“标准化距离”决定:
$$ z_0(n,d) = \frac{\mu_0 - d}{\sigma_0} = \frac{n/2 - d}{\sqrt{n}/2}, \qquad z_1(n,d) = \frac{d - \mu_1}{\sigma_1} = \frac{d - np}{\sqrt{np(1-p)}}. $$
$z_0$ 越大 FP 越小,$z_1$ 越大 TPR 越大。代入 $p\approx 0.068$(200 ms slot):
| $(n, d)$ | $\mu_0$ | $z_0$ (越大↔FP↓) | $\mu_1$ | $z_1$ (越大↔TPR↑) |
|---|---|---|---|---|
| $(8, 1)$ | 4 | $(4{-}1)/1.41=2.12$ | 0.54 | $(1{-}0.54)/0.71=0.65$ |
| $(16, 1)$ | 8 | $(8{-}1)/2.00=3.50$ | 1.09 | $(1{-}1.09)/1.00=-0.09$ |
| $(16, 2)$ | 8 | $(8{-}2)/2.00=3.00$ | 1.09 | $(2{-}1.09)/1.00=0.91$ |
| $(16, 3)$ | 8 | $(8{-}3)/2.00=2.50$ | 1.09 | $(3{-}1.09)/1.00=1.91$ |
可以看到三件事:
加长 $n$ 让 $z_0$ 自动放大:从 $(8,1)$ 的 $z_0=2.12$ 升到 $(16,2)$ 的 $z_0=3.00$。这是因为 $\mu_0=n/2$ 线性增长、$\sigma_0=\sqrt{n}/2$ 仅以 $\sqrt n$ 增长,$H_0$ 分布“远离原点”的速度比它“展宽”的速度快。这就是 FP 随 $n$ 指数级下降的几何原因。
加长 $n$ 必须同步放大 $d$ 才能保住 $z_1$:$\mu_1=np$ 线性增长,$d$ 不动则 $d-\mu_1$ 会变成负数。$(16,1)$ 下 $z_1=-0.09$($d$ 落在 $H_1$ 均值以下),所以 TPR 反而崩盘到 70%。把 $d$ 同比放到 2,$z_1$ 重回正区间 $0.91$,与 $(8,1)$ 的 $0.65$ 相当甚至更好。
$d=2$ 而非 $d=3$ 是最优档:$d$ 继续放大到 3 虽然 $z_1$ 升到 $1.91$(TPR 99%),但 $z_0$ 跌回 $2.50$,FP 又升到 1.07%。$d=2$ 同时让 $z_0\ge 3$、$z_1\ge 0.9$,两个尾概率同时取到这一档配置可达的最佳。
直观上:$n{=}16, d{=}2$ 的几何含义是判决阈值 $d$ 同时位于 $H_0$ 均值左侧 $3\sigma_0$ 和 $H_1$ 均值右侧 $\sim 1\sigma_1$。前者保证 benign 几乎不可能落入,后者保证水印的典型噪声仍被覆盖。这正是 Hamming bound 的几何画面:随 $n$ 增长,单位 Hamming 球占据的相对体积 $V_d(n)/2^n$ 以指数速率收缩,而水印 bit 误差的“典型集”半径仅以 $\sqrt n$ 速率扩张——两者剪刀差给出了这个 sweet spot。
可推广的设计法则(与 SWIRL 一致):
- 保持 $d \approx np + c\sqrt{np(1-p)}$,$c\in[0.5, 1.5]$。即 $d$ 紧贴 $H_1$ 均值的右侧 $\sim 1\sigma_1$。
- 在此约束下尽量加大 $n$,因为 FP 几乎只随 $n$ 指数下降,而 TPR 维持。
- 注入时长是唯一硬约束:$n$ 翻倍、注入时间翻倍,决定了上限。
5.4.7 小结与建议
- 当前 $n=8$、$R=1$、$d\le 1$ 配置下,单流 FP $\approx 3.5%$;$d\le 2$ 时 $\approx 14.5%$。这两个数对水印检测都偏高。
- 短期可控的改动有三个,按性价比排序:
- 加大码字长度:$n=8\to 16$,$d=1$ FP 从 3.5% 降到 0.026%(约 $135\times$)。代价是注入时长翻倍。
- AND 复合多注入:注入 2 个 block 并要求都命中,等价于 $n=16$,$d=1$ FP 降到 0.124%。
- 复合统计量:HD ∧ signed margin 联合判决,FP 相乘,可在不改注入长度的前提下再降 1–2 个数量级。
- 长期建议把 pattern 换成 PN/m-sequence,使理论 FP 与实测 FP 更一致(避免
10101010与真实周期信号共谋)。 - BCH 这类 ECC 不适用于单码字水印的 FP 降低。
[^rainbow]: A. Houmansadr, N. Kiyavash, N. Borisov. RAINBOW: A Robust And Invisible Non-Blind Watermark for Network Flows. NDSS 2009.
[^swirl]: A. Houmansadr, N. Borisov. SWIRL: A Scalable Watermark to Detect Correlated Network Flows. NDSS 2011.
[^dsss]: W. Yu, X. Fu, S. Graham, D. Xuan, W. Zhao. DSSS-Based Flow Marking Technique for Invisible Traceback. IEEE S&P 2007.
5.5 Soft sum 与 pattern 检测
TD2 的另一个重要特性是重复 pattern 的 soft sum:
1 | soft_sum[pos] = sum(score_i for all repeats at position pos) |
在当前 pattern=10101010, repeat=100 的设置中,多个实验下 td2_soft_sum_accuracy 均达到 100%。这说明即使单个 bit 有误差,重复结构仍能在 pattern position 维度上形成强信号。
因此,TD2 的能力可以分层理解:
| 层级 | 目标 | 当前结论 |
|---|---|---|
| Bit 级 | 每个 trend pair 独立恢复 | 低 slot 下需要 TP 搜索 |
| Block 级 | 每个 8-bit pattern block 是否可纠错 | TP + Hamming 显著改善 |
| Pattern 级 | 重复后整体 pattern 是否存在 | soft sum 很强 |
| Detection 级 | 流中是否存在水印 | 可用 single pattern trend / phase locked 指标 |
6. 两项工作之间的关系
交替 XON 分析解释了为什么短 slot 下速率响应不是理想阶跃;TD2 指标体系则给出了在非理想响应下如何重新定义可检测信号。
二者的关系可以概括为:
1 | 交替 XON 实验: |
换句话说,交替 XON 的“失败”并不是无效结果,而是为 TD2 的设计提供了机制依据:既然 400 ms 内难以稳定形成高低态方波,就应该把检测对象从“状态值”转向“趋势边界”。
7. 汇报结论
400 ms 交替 XON 的核心问题是读侧供给链路不对称。
500→100是本地限读,响应快;100→500在第一个 100 ms 窗口有一次“旧 buffer 重放”的伪响应,随后需要 server 从阻塞状态恢复并多轮填满 pipeline,叠加 bucket refill 粒度,合计产生 100-300 ms ramp-up;TCP rwnd 反馈本身不是瓶颈。小 receive buffer 会让上升沿看起来更慢,但它让 egress rate 反映 server 的真实当前产出,而不是大 buffer 中旧数据的历史重放。因此它对系统稳定性和机制解释是有益的。
TD2 选择趋势方向作为编码载体,是对非理想速率响应的直接适配。它规避了短窗口下绝对阈值被 buffer、jitter 和边界平滑污染的问题。
trend_presence_search是当前低 slot 下更合适的 bit 解码器。它通过 ±200 ms 搜索处理响应时间抖动,在 200/300 ms slot 下仍分别达到 93.2% 和 95.1%。Hamming distance 应作为 TD2 的核心块级指标。200 ms 下
TP ≤2 = 96%,300 ms 下TP ≤2 = 99%,说明低 slot 的逐 bit 噪声可以通过块级结构和 signed margin 被有效吸收。后续汇报和论文表述中,建议把指标层次分清:bit accuracy 用于说明局部判决能力,Hamming ≤1/≤2 用于说明 block 可用性,soft sum / single pattern trend 用于说明整体检测能力。
8. 后续工作
| 工作 | 目的 |
|---|---|
| 对交替 XON 采集 egress_rate.csv 的 100 ms 窗口序列 | 验证 100→500 的 ramp-up 曲线 |
同步记录 HSFC_DIAG_READ_POST |
证明 Tor 在高态早期“有 token 但读不到数据” |
用 ss -tin sport = :8080 观察 server 侧 |
验证 rwnd_limited 和 Send-Q 恢复过程 |
| 对比 16KB / 32KB / 64KB receive buffer | 定量验证 buffer 大小对 ramp-up 与平稳性的影响 |
| 固化 TD2 指标表 | 将 bit、block、pattern、detection 指标分层进入论文 |
| 扩展 benign trace 误报评估 | 验证 pattern detection 的实际 false positive risk |
参考材料
- 本周草稿:
TD2_METRICS_GUIDE.md。 - 本周草稿:
XON_ALTERNATING_RATE_ANALYSIS.md。 - Tor stream-level flow control / XON-XOFF 相关源码与实验日志。
- 当前 TD2 全量实验 metrics 与 hamming 汇总表。