2026-05-21 组会:Buffer 感知与 TD2 编码实验进展
1. 问题背景
在基于 Tor 隐藏服务的 TD2 水印系统中,A 端通过 XON 流控机制控制 B 端 relay 的发送速率,从而在 B 端出口流量中嵌入高低速率方波信号。然而 B 端 kernel TCP 接收缓冲区(rmem)的大小直接影响方波信号的边沿质量和可解码性:
- 小 buffer(≤16 KB):TCP 窗口快速参与控制,方波边沿干净,但高速率下容易出现 fill-drain 断流(gap)。
- 大 buffer(≥64 KB,或 6 MB 自动调优):不易溢出,但 LOW→HIGH 转换慢,伴随过冲(overshoot)和突发抖动(burst),边沿拖尾严重。
在无法直接登录 B 端检查 sysctl 配置的场景下,需要一种仅通过 B 端出口流量特征即可感知 buffer 大小的方法,并据此校准最优的 low_kbps / high_kbps 参数。
2. Buffer 感知方法
2.1 感知信号设计
使用固定极端率对 (low=100 KB/s, high=500 KB/s),以 800 ms 周期、30 s 时长发送 square wave,在 B 端以 100 ms 窗口采样网卡出口流量(tx_bytes)。
选择 100/500 的原因:该率对具有最大高低差值,能充分暴露不同 buffer 的行为差异——小 buffer 被 high=500 推至容量边界而出现 gap,大 buffer 因转换惯性而表现出 burst 和过冲。
2.2 理论模型
令 B 为 TCP 接收缓冲区大小,$R_{high}$ 为 XON 通告速率,$R_{drain}$ 为 Tor 从 socket 读取数据的速率。缓冲区占用量 $B(t)$ 满足:
$$ \frac{dB(t)}{dt} = R_{in}(t) - R_{drain}(t) $$
当 $R_{high} > R_{drain}$ 且 B 较小时,系统进入 fill-drain 循环:
$$ T_{fill} = \frac{B}{R_{high} - R_{drain}}, \quad T_{drain} = \frac{B}{R_{drain}} $$
以 KB16 为例:$T_{fill} \approx 80$ ms,$T_{drain} \approx 53$ ms,循环周期约 133 ms,跨越 1-2 个采样窗口。在 drain 阶段 $R_{in}=0$,对应采样窗口记录为零值。
当 B 较大时,TCP 窗口几乎不会收缩,瓶颈转移至 Tor 内部 circuit buffer。此时 LOW→HIGH 切换后,relay 积压的数据一次性释放,表现为短时过冲:
$$ R_{peak} \approx R_{high} + \frac{Q_{buffered}}{T_{burst}} $$
更精确地,大 buffer 的响应可建模为卷积:
$$ TX(t) \approx R_{bg}(t) + (R_{xon} * h_B)(t) + \epsilon(t) $$
其中 $h_B$ 为 buffer 相关的响应核:小 buffer 的 $h_B$ 窄,边沿陡峭;大 buffer 的 $h_B$ 宽,L→H 边沿被拉长。
2.3 诊断指标
| 指标 | 定义 | 物理意义 |
|---|---|---|
| gaps3 | 连续 ≥3 个近零窗口(≥300 ms 断流)的次数 | 小 buffer 溢出循环的指纹 |
| zeros% | 零值窗口占比 | 同上,辅助判断 |
| high_cv | HIGH 状态的变异系数 $\sigma_{high} / \mu_{high}$ | 大 buffer 的 burst-dip 交替导致 CV 高 |
| overshoot_ratio | $P_{95}(R_{high}) / E[R_{high}]$ | 大 buffer 过冲使 p95 显著高于 mean |
| mean_rise_samples | L→H 转换平均窗口数(100 ms/窗口) | 大 buffer 转换慢,rise_samples 大 |
2.4 感知判定树
1 | sense(100, 500, 30s) |
实验验证:KB16 在 sense 阶段 gaps3=50、zeros=2.6%,被正确分类为 small;KB64/KB256/DEFAULT 均被分类为 large。large 内部(64 KB vs 256 KB vs 6 MB)因 B 端 relay 背景噪声(~800-1000 KB/s,σ ≈ 100-200 KB/s)无法进一步区分,但对速率校准而言不需要区分。
3. 速率校准方法
3.1 稳定性条件
率对 $(R_{low}, R_{high})$ 稳定的必要条件:在半个周期内 buffer 不被填满。
$$ R_{high} < R_{drain} + \frac{B}{T_{half\_period}} $$
对于 period=800 ms($T_{half}=400$ ms)、$R_{drain} \approx 300$ KB/s:
- KB16: $R_{high} < 300 + 40 = 340$ KB/s → 理论最优 high ≈ 350
- KB64: $R_{high} < 300 + 160 = 460$ KB/s → 可承受 high=400 甚至 500
3.2 low 下界:保持管道温热
$R_{low}$ 过低会导致 Tor circuit 进入 idle、token bucket 过度节流、L→H 转换变慢。经验下界为:
$$ R_{low} \geq 150\text{-}200 \text{ KB/s} $$
实验证据:low=100→200 后,KB16 的 L→H 平均窗口从 2.1 降至 1.1,DEFAULT 从 3.8 降至 2.3。
3.3 high 上界:转换时间约束
high 的选择不能仅追求更大的 separation,还需满足 L→H 转换时间不超过半周期的合理比例:
$$ T_{LH}^{obs}(R_{low}, R_{high}, B) < \beta T_h, \quad \beta \approx 0.5 $$
综合目标函数:
$$ J(R_l, R_h) = S(R_l, R_h) - \lambda_z P_{zero} - \lambda_g N_{gap3} - \lambda_t \frac{T_{LH}^{obs}}{T_h} - \lambda_o(\text{overshoot} - 1) $$
3.4 推荐参数
| Buffer 级别 | 推荐 (low, high) | Score | Separation | 说明 |
|---|---|---|---|---|
| Small (≤16 KB) | (200, 350) | 100.7 | 1.81 | 窄范围避免断流 |
| Large (≥64 KB) | (200, 400) | 101.4-110.1 | 2.89-3.51 | 宽范围最大化分离度 |
200/400 是跨所有 buffer 的安全默认值:在 KB16/KB64/KB256/DEFAULT 下 score 均 ≥ 95。
3.5 Buffer Sweep 完整数据
| Preset | rmem_max | 最佳 low | 最佳 high | Score | Separation | zeros% | gaps3 |
|---|---|---|---|---|---|---|---|
| KB16 | 16 KB | 200 | 350 | 100.7 | 1.81 | 0.3% | 4 |
| KB64 | 64 KB | 200 | 400 | 110.1 | 2.89 | 0.3% | 2 |
| KB256 | 256 KB | 150 | 400 | 98.8 | 1.82 | 0.3% | 5 |
| DEFAULT | 6 MB | 200 | 400 | 101.4 | 3.51 | 0.2% | 8 |
4. TD2 编码实验结果(200/400 KB/s 下)
基于感知与校准结论,以 low=200 KB/s, high=400 KB/s 为固定参数,在不同 slot 时长下测试 TD2 趋势编码的可解码性。B 端 buffer 为 DEFAULT(6 MB 自动调优)。E20260520_002(slot=300 ms)因解码结果异常被排除,下表中 slot_ms 为实际 slot 时长(= encoder_slot_ms × 2)。
| encoder_slot_ms | 实际 slot_ms | bit_accuracy | block_accuracy | hamming ≤1 rate |
|---|---|---|---|---|
| 200 | 400 | 98.50% | 90.00% | 98.00% |
| 300 | 600 | 99.38% | 96.00% | 99.00% |
| 400 | 800 | 99.63% | 97.00% | 100.00% |
| 500 | 1000 | 99.38% | 95.00% | 100.00% |
注:E20260520_002(encoder_slot_ms=250, 实际 slot=500 ms)因 encoding_bit_accuracy=74.2%、td2_trend_presence_accuracy=95.5%、block_exact_match=71.0%,显著低于同系列其他实验,已从 slot charts 中排除。该实验的 baseline_threshold(1754 KB/s)明显低于其他实验(2240-2270 KB/s),初步判断为 B 端背景流量异常或 Tor circuit 状态不一致。
4.1 关键发现
- slot ≥ 600 ms 时解码可靠:block_accuracy ≥ 96%,hamming ≤1 rate ≥ 99%,汉明码纠错后可达 100% 正确率。
- slot = 400 ms 仍有实用价值:bit_accuracy=98.5%,block_accuracy=90.0%,适合需要更高嵌入速率的场景。
- slot = 800 ms 表现最佳:三项指标均达到或接近 100%,是当前参数下的推荐 slot 时长。
- slot > 800 ms 出现边际递减:block_accuracy 从 97% 略降至 95%,可能由过长的 slot 增加了 Tor circuit 状态漂移的影响。
4.2 结果图
图 1: 不同 slot 时长下的 bit accuracy
图 2: 不同 slot 时长下的 block accuracy
图 3: 不同 slot 时长下的 hamming ≤1 rate(汉明码可纠错比例)
5. 总结与下一步
Buffer 感知可行:通过 100/500 KB/s 的 30s 方波探测,可以可靠区分小 buffer(≤16 KB)与大 buffer(≥64 KB)。感知的物理基础是 TCP 接收缓冲区的 fill-drain 动力学和转换惯性差异。
速率校准有理论支撑:low=200 KB/s 保证管道温热,high=350-400 KB/s 在稳定性条件和转换时间约束之间取得平衡。200/400 是通用安全默认值。
200/400 + slot ≥ 600 ms 可实用:在 DEFAULT buffer 下,slot=600 ms 即可达到 block_accuracy=96%、hamming ≤1 rate=99%。slot=800 ms 达到最优。
下一步计划:
- 在 KB16(小 buffer)条件下测试 200/350 + 各 slot 时长的 TD2 表现
- 将 buffer 感知集成至正式实验流程作为前置探测步骤
参考文献
- 理论推导与实验报告:
/root/sound/docs/buffer_sensing_theory.md、/root/sound/docs/buffer_sensing_report.md - Sweep 实验数据:
/root/sound/results/SWEEP_20260516_120620/sweep_summary.json - TD2 编码说明:
/root/flowctl_client/docs/TD2_METRICS_GUIDE.md - Slot charts 数据:
/root/flowctl_client/analysis_C/reports/E20260520_slot_charts/