研究

2026-05-14 组会-TD2 指标体系与交替 XON 读侧瓶颈分析

2026-05-14 组会:TD2 指标体系与交替 XON 读侧瓶颈分析

0. 本次汇报要说明什么

本周工作主要围绕两个问题展开:

  1. 为什么 400 ms 交替 XON(100/500) 场景下,Tor 外发速率无法在每个 400 ms 窗口内稳定形成理想方波。
  2. 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→high0 = 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
2
3
4
5
t=0:      XON rate=100
t=400ms: XON rate=500
t=800ms: XON rate=100
t=1200ms: XON rate=500
...

直觉预期是: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
2
3
4
5
6
7
8
9
10
降低速率 (500→100):
Tor 决定少读
-> 本地立刻生效
-> egress rate 快速下降

提高速率 (100→500):
Tor 决定多读
-> 但 receive buffer 可能很快读空
-> 必须等待 server 补数据
-> egress rate 缓慢爬升

所以真正的慢方向是 100→500,而不是 500→100


2. 读侧瓶颈机制

2.1 数据链路

当前链路可以抽象为:

1
2
3
4
5
6
Bucket rate (XON 控制)
-> Tor read() 速率
-> kernel TCP receive buffer (B_max)
-> TCP advertised window
-> server SO_SNDBUF (8KB) + 阻塞 send()
-> server 文件读取 + 应用层调度

其中:

  • 数据流方向是 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
2
3
4
5
6
7
8
t=400ms: XON=100 到达

bucket: 10KB/100ms
buffer: 可能仍有 32KB 旧数据

400-500ms:
Tor read() <= 10KB
egress ≈ 100KB/s

2.3 100→500:为什么爬不上去

在 100 阶段稳定后,系统处于低位平衡:

1
2
3
4
5
6
Tor bucket rate:       10KB/100ms
Tor 实际 read rate: 约 100KB/s
receive buffer 水位: 接近 B_max (如 32KB)
TCP advertised window: 很小或接近关闭
server SO_SNDBUF: 接近满 (8KB)
server send(): 频繁阻塞或低频唤醒、进程处于 sleep 态

切换到 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”需要几个纲要环节:

  1. Tor 增量读出 → ACK 携带逐次括大的 rwnd(这一步在 loopback 上是 μs 级,不是瓶颈)。
  2. 内核唤醒被 send() 阻塞的 server 进程。在朊齐压力或 Python GIL/event loop 调度下,此调度延迟常在单位数到数十 ms 级。
  3. server 重新进入 send()/fp.read(4096) 循环,每轮填 8 KB 到 SO_SNDBUF。要让下游 egress 达到 50 KB/100ms,需要连续许多轮 “send → read → send” 才能填满 pipeline。
  4. 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
2
3
4
5
6
7
8
9
10
11
大 buffer:
Tor 可以一次读大量旧数据
-> egress 看似快速响应
-> 实际是在重放历史库存
-> server 仍未真正感受到 XON=500

小 buffer:
Tor 一次最多读约 32KB
-> 很快读空并打开 window
-> server 必须真实补给
-> egress 反映新鲜数据

因此,小 buffer 下的“慢”反而更可信:它说明控制回路真正闭合了,而不是 buffer 在替 server 播放旧数据。

2.5 对 400 ms 交替 XON 的解释

综合起来,交替 XON(100/500) 的波形应表现为(横轴 ms,纵轴 KB/s,每格约 100 ms 采样窗口):

1
2
3
4
5
6
7
8
500KB/s |          .|         .|
400KB/s | / | / |
300KB/s | / | / |
200KB/s | / | / |
100KB/s |______/ |_____/ |____
0 400 800 1200 ms
^XON=100 ^XON=100 ^XON=100
^XON=500 ^XON=500

关键特征:

  • 下降沿极快:500→100 在 1 个 100 ms 采样窗口内完成(图中接近垂直跌落)。
  • 上升沿缓慢:100→500 需要 2-3 个 100 ms 窗口才接近目标(图中爬坡段)。
  • 500 阶段形成尖顶:刚接近高态就被下一个 100 XON 切断。
  • 100 阶段有平底:低态更容易稳定形成。

3. TD2 编码方案

3.1 核心思想

TD2(Trend Detection v2)将信息编码在速率变化方向中,而不是编码在绝对速率值中:

1
2
逻辑 1 = LH = 低速率 -> 高速率
逻辑 0 = HL = 高速率 -> 低速率

每个逻辑 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
2
3
4
center = 第二 slot 起始时间 + lag_ms
before = aggregate(center - gap_ms - window_ms, center - gap_ms)
after = aggregate(center + gap_ms, center + gap_ms + window_ms)
score = after - before

它的问题是:当 B 端响应存在 jitter 时,固定窗口容易错过真实跳变,或者把边界扩散区纳入两侧窗口,导致 score 被污染。

4.3 trend_presence_search 的优势

trend_presence_search 不强行假设跳变落在唯一固定位置,而是在 A 端预期跳变附近以固定步长(当前实现为 20 ms)扫描一段窗口:

1
2
3
4
5
for shift_ms in range(-200, +201, step=20):
center = A_transition_ts + lag_ms + shift_ms
signed_score = expected_sign * (after_rate - before_rate)
best_signed_score = max(signed_score over all shifts)
match = best_signed_score > 0

这相当于把短时相位抖动显式纳入解码过程。因此它在 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_BITS10101010 改成长度匹配的 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%
A. 加长 + 同比 $d$ $n{=}16, d{=}2$ 96% 92% 0.21%
A. 加长 + 同比 $d$ $n{=}16, d{=}3$ 99% 98% 1.07%
A. 加长 + 固定 $d$ $n{=}16, d{=}1$ 81% 70% 0.026%
A. 加长 + 同比 $d$ $n{=}24, d{=}3$ 98% 92% 0.012%
B. AND $R{=}2$ $n{=}8, d{=}1$, AND 88% 72% 0.124%
C. HD ∧ margin $n{=}8, d{=}1$ ∧ margin $\approx 0.99\cdot$TPR $\approx 0.99\cdot$TPR $\sim 10^{-4}$
D. PN/m-sequence 同 $n=8$ 与现状同 与现状同 让实测贴近理论

可以看到:

  • 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 高于理论”的结构性偏差问题。任何时候都建议做

可组合的推荐配置(按部署优先级):

  1. D 立即做:把 TD2_BITS10101010 换成长度 8 的 m-sequence/Gold 序列,无任何代价。
  2. A 中期推:升到 $n=16, d=2$,TPR 持平、FP 降 17×、注入时长 2×。
  3. 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$

可以看到三件事:

  1. 加长 $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$ 指数级下降的几何原因。

  2. 加长 $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$ 相当甚至更好。

  3. $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%$。这两个数对水印检测都偏高。
  • 短期可控的改动有三个,按性价比排序:
    1. 加大码字长度:$n=8\to 16$,$d=1$ FP 从 3.5% 降到 0.026%(约 $135\times$)。代价是注入时长翻倍。
    2. AND 复合多注入:注入 2 个 block 并要求都命中,等价于 $n=16$,$d=1$ FP 降到 0.124%。
    3. 复合统计量: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
2
soft_sum[pos] = sum(score_i for all repeats at position pos)
pred[pos] = 1 if soft_sum[pos] > 0 else 0

在当前 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
2
3
4
5
6
7
8
9
交替 XON 实验:
证明短窗口内绝对高低速不稳定
-> 主要误差来自读侧供给、buffer 和边界 ramp-up

TD2:
不再依赖绝对高低速
-> 改为检测速率变化方向
-> 用 TP 搜索吸收响应 jitter
-> 用 Hamming distance 提升 block 级可靠性

换句话说,交替 XON 的“失败”并不是无效结果,而是为 TD2 的设计提供了机制依据:既然 400 ms 内难以稳定形成高低态方波,就应该把检测对象从“状态值”转向“趋势边界”。


7. 汇报结论

  1. 400 ms 交替 XON 的核心问题是读侧供给链路不对称。500→100 是本地限读,响应快;100→500 在第一个 100 ms 窗口有一次“旧 buffer 重放”的伪响应,随后需要 server 从阻塞状态恢复并多轮填满 pipeline,叠加 bucket refill 粒度,合计产生 100-300 ms ramp-up;TCP rwnd 反馈本身不是瓶颈。

  2. 小 receive buffer 会让上升沿看起来更慢,但它让 egress rate 反映 server 的真实当前产出,而不是大 buffer 中旧数据的历史重放。因此它对系统稳定性和机制解释是有益的。

  3. TD2 选择趋势方向作为编码载体,是对非理想速率响应的直接适配。它规避了短窗口下绝对阈值被 buffer、jitter 和边界平滑污染的问题。

  4. trend_presence_search 是当前低 slot 下更合适的 bit 解码器。它通过 ±200 ms 搜索处理响应时间抖动,在 200/300 ms slot 下仍分别达到 93.2% 和 95.1%。

  5. Hamming distance 应作为 TD2 的核心块级指标。200 ms 下 TP ≤2 = 96%,300 ms 下 TP ≤2 = 99%,说明低 slot 的逐 bit 噪声可以通过块级结构和 signed margin 被有效吸收。

  6. 后续汇报和论文表述中,建议把指标层次分清: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

参考材料

  1. 本周草稿:TD2_METRICS_GUIDE.md
  2. 本周草稿:XON_ALTERNATING_RATE_ANALYSIS.md
  3. Tor stream-level flow control / XON-XOFF 相关源码与实验日志。
  4. 当前 TD2 全量实验 metrics 与 hamming 汇总表。