eBPF Real-Time Detection · 子课题 第2页 / 共3页

eBPF实时检测框架 (中篇 · 流表管理与特征提取工程)

本页进入工程深水区:Map驱动的流表设计选型与安全防护、TLS 1.3 ClientHello与QUIC Initial的内核态解析及握手可见性边界、包长矩/IAT/burst等统计特征的低开销算法、自适应采样策略、Ring Buffer数据通路的背压治理,以及把CPU开销控制在可审计水位上的工程实践清单。

01 · 流状态管理:Map驱动的流表设计

1.1 流表键值设计

流表是加密流量检测引擎的核心数据结构:以流标识为键、以统计状态为值,在包处理热路径上完成O(1)的状态读写。键的设计必须同时覆盖两类传输层现实:

  • TCP流:以五元组(源IP、源端口、目的IP、目的端口、协议)的哈希为键;对涉及NAT的观测点,四元组加方向位的设计可避免对端端口混淆。
  • QUIC流:五元组在连接迁移(Connection Migration)瞬间即告失效,必须以Connection ID为键——这正是QUIC将连接标识与网络路径解耦的设计初衷(RFC 9000 §9),也是本课题流表设计区别于传统NetFlow类工具的关键点[14]。

值(流状态条目)的字段设计遵循"提取什么就存什么、绝不多存"的最小化原则,典型字段包括:首末包时间戳、双向包数与字节数、包长的一阶/二阶累积量、IAT的指数加权滑动平均、burst计数器、JA4指纹的结构化字段(见2.1节)、0-RTT与疑似ECH标志位。第3.4节将给出各特征组的字节预算。

1.2 Map类型选型决策

Map类型语义与并发模型典型用途内核版本
BPF_MAP_TYPE_HASH通用哈希表;全局加锁,多核竞争随核数上升小流量场景下的流表、配置表3.18+
PERCPU_HASH每CPU核一份副本,无锁读写;跨核视图不一致需容忍流表首选:包处理热路径零自旋4.6+
LRU_HASH / LRU_PERCPU_HASH容量满时自动淘汰最久未活跃条目,内存上界可控流老化兜底:避免流表无限膨胀4.10+
ARRAY / PERCPU_ARRAY连续整数索引,最快访问路径端口/协议直方图、分桶计数器、限速令牌桶3.18+
RINGBUF共享环形区,reserve/commit无锁提交,支持跨事件保序事件上报首选(内核5.8起)5.8+
PERF_EVENT_ARRAY按CPU分区的perf环,需配套perf事件5.8之前的事件上报、采样输出4.x

Map类型及语义依据Linux内核BPF文档与libbpf头文件定义[3][8]。流表生产实践的通行组合是:PERCPU_HASH承载热路径状态 + LRU容量兜底 + RINGBUF事件出口。

1.3 流老化与内存上界

流老化采用"被动LRU淘汰 + 主动TTL扫描"双保险:内核态LRU Map在容量满时自动驱逐最久未活跃的条目;用户空间守护进程周期性地按协议超时扫描流表(TCP可参考RFC 793定义的TIME_WAIT = 2×MSL语义——典型MSL为2分钟即约4分钟,实际取值应按部署场景收紧),将超时流的最终统计摘要强制上报后删除。由此内存上界是可证明的:峰值内存 ≈ Map容量上限 × 单条目大小,与流量突发解耦——这是检测引擎作为长期驻留服务的基本素质。

1.4 per-CPU设计的代价与收益

per-CPU变体用"跨核视图短暂不一致"换取"热路径零锁竞争":同一五元组的包若经RSS散列到不同核处理,统计会被分别累积,用户空间在消费侧做归并即可。对统计特征而言这是无损的;但对"每流全局计数"类精确语义,需要在用户空间收敛。实践中RSS队列与CPU的亲和性绑定能让同一流的包稳定落在同核,进一步降低归并成本。

1.5 流表安全防护:状态耗尽与对抗缓解

流表本质上是每流状态机,天然可能成为DoS放大器:攻击者以伪造源地址构造海量短流(SYN洪流、随机源UDP数据报),可在数秒内冲满流表容量,导致合法流特征被驱逐、检测降级。流表本身必须有安全设计:

  • 容量上界:LRU容量在设计期确定(第1.3节),攻击最多造成"统计截尾"而非资源耗尽崩溃——引擎永不因流表而拖垮转发面;
  • 首包限速:在XDP层对新建流条目实行每核令牌桶(如每核每秒新建N条),超限流走无状态直通通道,仅计数不上流表;
  • 哈希盐防护:五元组哈希加入每核随机盐(salt),避免攻击者构造哈希碰撞定向驱逐特定流条目;
  • 存活监测:流表占用率、新建速率、LRU淘汰速率纳入引擎健康指标,异常即触发降级预案(第5节P3逃生机制)。

设计原则:检测引擎的数据面组件必须按"会被恶意流量主动攻击"来设计,而不是按"观测对象温顺合作"来设计。流表的安全性与特征的正确性同等重要——这是攻防演练沙盘反复验证过的教训。

02 · TLS/QUIC握手特征的内核态提取

2.1 ClientHello解析与JA4字段提取

TLS 1.3时代,ClientHello仍是明文发送(ECH普及前),它是被动观测者最后可直接解析的握手结构。在TC挂载点,解析链条为:IP/TCP头定位 → TLS记录层头(5字节:类型/版本/长度)→ Handshake消息头 → ClientHello体。受512字节栈约束,实现上必须用bpf_skb_load_bytes按段读取、就地解析,不可整包缓冲[3]。需提取的结构化字段包括:

  • 密码套件列表与扩展类型序列(遍历扩展时按RFC 8701识别并跳过GREASE占位值[16],遍历设硬上限,超限即标记"截断");
  • supported_versions扩展:识别真实协商版本(区分TLS 1.3与其伪装);
  • ALPN列表、椭圆曲线组、签名算法等第二梯队字段;
  • JA4指纹的四元组输入(协议版本、套件数与套件串、扩展数与扩展串、ALPN首字符)——JA4是FoxIO提出的TLS客户端指纹识别规范,相较JA3对TLS 1.3与GREASE做了适配[17]。

工程诚实声明:完整的JA4哈希涉及对套件/扩展字符串的散列计算,其成本与实现复杂度不适合放在内核热路径。本课题的务实分工是:内核态提取结构化字段并做轻量规范化(排序、去GREASE、计数),指纹散列与库比对下沉用户空间。这再次印证第1页的原则——内核做"重提取",用户空间做"重判断"。

🔍 点击展开 / 收起:ClientHello内核态解析代码骨架(示意)
/* TC挂载点:示意解析骨架,省略错误处理与边界证明细节 */
struct flow_state *st = bpf_map_lookup_elem(&FLOW_TBL, &key);
if (!st) { /* 新流:初始化条目;容量由LRU兜底 */ }
if (st->handshake_done) { /* 快速路径:仅更新统计矩 */ goto stats; }

/* 512B栈约束:禁止整包缓冲,必须分段读取 */
if (bpf_skb_load_bytes(skb, tls_off, &rec, sizeof(rec)) < 0) goto out;
for (i = 0; i < MAX_EXT && ext_left; i++) {        /* MAX_EXT=64 硬上限 */
    if (is_grease(ext_type)) continue;           /* RFC 8701 占位值跳过 */
    st->ja4.ext_seq[st->ja4.n_ext++] = ext_type;   /* 记录扩展序列 */
}
if (ext_left) st->flags |= FLAG_TRUNCATED;       /* 超限诚实标记 */
stats:
welford_update(&st->plen, skb->len);             /* 整数定点Welford递推 */
st->iat_ewma += (now - st->last_ts) >> 3;         /* 移位定点EWMA */
return TC_ACT_OK;

骨架仅示意控制流与helper用法;真实实现须通过verifier逐指令验证,所有读包操作都必须携带可证明的边界检查。

2.2 TLS 1.3特征要点:0-RTT与ECH

  • 0-RTT识别:PSK会话恢复时,客户端首个报文即可携带应用数据(RFC 8446 §2.3),观测上呈现"首包即载荷、无证书往返"的鲜明模式,本身即是一种高质量的行为特征;同时0-RTT数据的防重放责任在服务器侧,防御评估时应把它列入检查清单[13]。
  • ECH影响:Encrypted Client Hello普及后,ClientHelloInner(含真实SNI)以服务商公钥加密,观察者只能解析ClientHelloOuter的标准结构(其SNI为公知名)。内核态提取的目标随之调整为:记录公知名、提取外层结构指纹、把身份推断交给IP/ASN信誉与行为特征——与姊妹篇"TLS/QUIC流量分析"第4节的结论完全一致。

2.3 TLS 1.3握手可见性边界(必须精确的工程事实)

常被简化为"TLS 1.3握手加密",但精确的可见性边界是:ClientHello明文、ServerHello明文(可提取服务器选定的密钥共享组与legacy_version协商信息),自EncryptedExtensions起服务器飞行全部加密——包括Certificate消息(服务器证书链)。这一边界带来三条工程结论:

  • TLS 1.3下证书特征不可见:证书颁发者、有效期、SAN曾是TLS 1.2时代有效的恶意流量信号(自签名、超短有效期、异常CN);TLS 1.2中Certificate明文可见,该特征族在TLS 1.3时代系统性关闭,特征设计必须向握手结构与行为层迁移;
  • 信号通道的此消彼长:TLS 1.3同时削弱了中间盒的篡改能力(协议净化的初衷),被动观测者失去的部分明文信号,需以supported_versions、密钥共享组选择、扩展集合等结构特征补偿;
  • 标注与验证手段不外溢为检测能力:授权调试环境可通过端点SSLKEYLOGFILE解密自有流量做特征算法验证,但该方法要求端点配合、超出本课题零解密被动分析边界,仅用于标注与验证,不作为检测能力。

2.4 QUIC识别与追踪:从Initial包开始

QUIC没有独立的明文握手阶段——TLS 1.3直接内嵌于传输握手(RFC 9001)[15]。但协议设计仍留下了若干可观测窗口:

  • UDP/443端口基线叠加包长分布,即可对"疑似QUIC"做初筛;
  • Initial包的最小长度约束:客户端必须将携带Initial包的UDP数据报载荷填充至至少1200字节(RFC 9000 §14),这使得QUIC连接的早期包长呈现其他UDP应用少见的稳定下界;
  • 长包头的明文字段:Initial/Handshake等长包头的版本字段、目的/源Connection ID在header protection生效前明文可见,可支撑QUIC版本分布统计与CID键控的流追踪;1-RTT短包头则几乎无可见字段,观测重心转向统计行为。

2.5 QUIC连接迁移的CID追踪(JS绘制)

连接迁移下的CID键控流追踪
五元组在路径切换瞬间失效,Connection ID不变——以CID为键的流表可在内核态无缝延续统计状态
依据:RFC 9000 §8(地址验证)与§9(连接迁移)[14]。CID的明文可见范围以长包头为准;短包头场景依赖流表延续与用户空间关联。

01b · 本节勘误表(对应审查报告勘误E/F/G)

勘误一(命名):第1.2节表中"PERCPU_LRU_HASH"的内核正式类型名为 BPF_MAP_TYPE_LRU_PERCPU_HASH(LRU_PERCPU_HASH)。同表其余类型名(HASH / PERCPU_HASH / LRU_HASH / ARRAY / PERCPU_ARRAY / RINGBUF / PERF_EVENT_ARRAY)均与内核定义一致[3][8]。

勘误二(算法口径):第2.1节代码骨架中 st->iat_ewma += (now - st->last_ts) >> 3 为教学简化写法,其语义是"平滑化包间隔增量",并非标准指数加权滑动平均。标准定点EWMA递推为:e ← e + ((x − e) >> 3)(等价于权重1/8的指数平滑,x为本包IAT观测值)。骨架其余部分(分段读取、GREASE跳过、硬上限与截断标记、Welford更新)的口径均正确。

勘误三(版本精确化):第3.5节关于AF_XDP零拷贝驱动的表述精确化为:ixgbe于4.19周期合入首个零拷贝驱动支持,i40e约5.4、mlx5于5.x后期、virtio_net于6.9陆续支持;具体支持矩阵以xdp-tools与目标内核的文档为准[1][8]。

03 · 统计特征的低开销算法实现

3.1 包长矩:Welford单次遍历算法

包长分布的均值、方差、偏度是加密流量分类研究中被反复验证有效的特征族(从早期的NetFlow统计特征工作到深度学习方法均以其为基础[20][21])。在"每流一状态条目、每包一次更新"的约束下,必须用单次遍历(online)算法而非二次遍历:Welford于1962年提出的增量算法以三个标量(计数n、均值mean、校正平方和M2)即可在O(1)时间内递推更新均值与方差,数值稳定性优于朴素求和[18]:

  • 计数更新:n ← n + 1;
  • 均值更新:mean ← mean + (x − mean) / n;
  • 二阶矩更新:M2 ← M2 + (x − mean_old) × (x − mean_new),方差 = M2 / (n − 1)。

eBPF无浮点的历史约束下,上述运算以定点整数实现(均值用移位定点表示,M2用64位整数累积),在精度损失与开销之间取得可控平衡;内核5.x之后部分场景可用编译器辅助的定点手段进一步简化。

3.2 IAT与burst特征

  • 包到达间隔(IAT):维护指数加权滑动平均(EWMA),同时按对数边界分桶(如2k微秒桶)累积直方图——直方图比单点均值更能区分"匀速心跳C2"与"突发下载"。
  • burst检测:以滑动时间窗(如10ms)内的包数是否超过阈值为判据,超窗触发计数;该特征对区分交互式加密通道与批量加密传输尤为敏感。
  • 方向性分离:上述所有统计均按客户端→服务器 / 服务器→客户端两个方向分别累积——加密C2的常见模式(小请求大包回、长连接低字节)只有方向分离后才会显形。

3.3 特征清单与状态字节预算

特征组代表特征内核更新成本信息量定性
握手结构JA4字段、supported_versions、ALPN、扩展计数、0-RTT/ECH标志仅握手期,一次性识别客户端实现与家族,高
基础计数双向包数/字节数、流时长每流O(1)体量级行为,中—高
包长分布均值/方差(Welford)、对数分桶直方图每包O(1)整数运算应用类型与内容类型推断,高
时序行为IAT的EWMA与直方图、burst计数、周期性检测每包O(1)C2心跳与信道质量,高
上下文关联同目的IP/ASN的流聚集度、DNS协同流存在性用户空间归并基础设施归因,高(第3页展开)
每流内核态状态字节预算(设计值,JS绘制)
全部特征组的状态合计控制在约160字节/流——百万级并发流的内存上界因此可精确预算
迪妙检测引擎v0.3设计预算(工程示意值,非实测)。预算纪律:LRU容量 × 160B即流表内存上界,例如100万流条目约160MB。

03b · 观测真实性与统计语义的对策

3b.1 特征口径的三条工程纪律

第1页4b节已论证:GRO/LRO聚合发生在TC ingress观测点之前,TSO/GSO使TC egress呈现段语义。落到特征工程层,对策不是"关掉所有卸载"(生产网卡通常不允许),而是口径纪律:

  1. 计量点绑定:包数、包长矩、IAT、burst的原始计量固定在XDP层完成(XDP在GRO之前执行,所见即线上报文);TC层提供同流计数作交叉校验,两层计数差作为GRO运行期探针(差值异常扩大即报警)。
  2. 语义标注:凡在TC层不可避免地使用段级计量的场景(如握手特征的方向计数),特征schema中显式标注"段语义",训练与推理两侧口径一致,禁止混用。
  3. 镜像口径验证:在ethtool -K gro off lro off的镜像口上以传统抓包工具建立黄金参照集,定期比对引擎输出,偏差超阈即触发特征管道复核。

依据:GRO在内核接收路径中的位置(dev_gro_receive → netif_receive_skb)属公开实现事实[3][10];三层对策为迪妙研究组工程归纳。

03c · 被低估的第二信号:JA4S服务器指纹

3c.1 ServerHello是明文,而且比ClientHello更"诚实"

第2页2.3节已经精确给出TLS 1.3可见性边界:ClientHello与ServerHello均为明文。全文的特征设计目前只利用了前者——但ServerHello有一个ClientHello不具备的性质:它由服务器实现唯一决定,且几乎不随客户端而变化。FoxIO的JA4S规范正是利用这一点:对ServerHello提取协议类型、协商版本、扩展数量、协商ALPN、选定密码套件五项构成结构化指纹,再哈希扩展序列[17]。官方公开示例显示,JA4与JA4S联合可将识别粒度从"底层TLS库"提升到"具体应用或恶意软件家族"——例如IcedID恶意软件、Sliver C2(GoLang编写)、SoftEther VPN各自呈现稳定的JA4+JA4S组合[17]。

3c.2 内核态提取的工程分工

  • 内核态(TC挂载点):在解析ClientHello的对称位置解析ServerHello——记录层头校验、握手类型校验、提取legacy_version、selected_cipher、extensions序列(设硬上限、去GREASE、超限标记截断)、ALPN协商结果;全部写入流状态条目的JA4S字段组。
  • 用户空间:与JA4字段组一并做规范化(排序/计数)与SHA-256截断哈希,与JA4DB等社区指纹库联合比对[17]。
  • 注意边界:JA4S依赖EncryptedExtensions之前的明文,TLS 1.3下成立;ECH场景下ServerHello不受影响(ECH加密的是ClientHelloInner),但后续EncryptedExtensions起仍不可见——JA4S信号不受ECH削弱,这是它比"基于SNI/证书"的旧信号更稳健的原因。

新增特征预算:JA4S字段组(协商版本/套件/扩展计数/扩展序列截断/ALPN)约增加20字节/流,总状态预算由约160B上调至约180B/流,LRU内存上界按新预算复核。

04 · 内核-用户空间数据通路

4.1 Ring Buffer与Perf Buffer的选择

维度BPF Ring Buffer(5.8+)Perf Buffer(PERF_EVENT_ARRAY)
内存模型共享环形区,按需reserve/commit,无每CPU冗余按CPU分区,多核场景内存成倍增长
排序保证支持跨事件全局保序(可选)仅单CPU内部保序
开销更低的固定成本与更好的批量效率需配套perf事件,历史包袱较重
结论首选:新引擎的默认事件出口兼容旧内核(<5.8)的降级方案

对比依据:内核5.8合入Ring Buffer时的官方说明与BPF文档[3][8]。

4.2 上报策略:从"每包事件"到"摘要触发"

把每个包作为一个事件上报,会在事件通道上复刻网卡线速——必然压垮消费端。工程上的三级降采样是:

  1. 摘要上报:流表在正常存续期内不发出任何事件,仅当流结束(FIN/RST/超时老化)或到达周期性心跳(如每T=60秒)时,上报一份完整特征摘要;
  2. 阈值触发:burst超阈、包长矩突变、握手结构命中可疑集合时立即上报,换取对突发威胁的秒级响应;
  3. 抽样直通:对明确良性的大流量(如已知CDN段)按1/N抽样透传摘要,保留统计总体代表性。

4.3 自适应采样策略:从固定抽样到按流大小加权

固定1/N抽样对"大象流"(少数大流贡献绝大多数字节)的统计损失可控,但会系统性漏检海量"小鼠流"中的异常——而加密C2恰恰常伪装成小鼠流。网络测量领域的经典结论是应按流的大小自适应分配采样资源(smart sampling思想:对大象流粗采样、对小鼠流全量观察,Estan与Varghese在ACM TOCS 2003年的工作奠定了"抓大放小"的采样理论基础[24])。本课题的落地形态:

  • 内核态大小分层:维护每目的IP/前缀的字节计数(PERCPU_ARRAY直方图),累计字节超过阈值的大流降采样(如1/100),其余流全量特征提取;
  • 确定性伪随机:采样决策由流键哈希加引擎盐(salt)确定,保证可复现性与审计能力;
  • 总体估计还原:用户空间消费时按采样比还原总体估计,置信区间随样本量显式报告——采样不是偷懒,而是带误差上界的工程权衡。

4.4 背压与丢弃治理

Ring Buffer满时,内核侧的正确姿态是计数丢弃并继续转发,绝不阻塞数据面:丢弃计数本身写入专用Map,用户空间将其纳入引擎健康度指标(丢弃率突增即触发降级:增大抽样比、收缩特征集、或启动XDP直通逃生)。检测引擎永远不该成为网络路径上的单点故障——这是所有设计评审的第一条红线。

特征提取流水线(JS绘制)
采集 → 流表 → 特征 → 上报 → 用户空间消费;全程不接触明文载荷与密钥
流水线设计原则:热路径只做O(1)整数运算;所有重逻辑(哈希、推理、归并)在用户空间;丢弃不阻塞转发。

4.5 与NetFlow/IPFIX生态的衔接

检测引擎的流级输出与既有NetFlow/IPFIX生态天然兼容[19]:流摘要可直接映射为标准信息元素——如octetDeltaCount(IE 1)、packetDeltaCount(IE 2)、flowStartMilliseconds(IE 152)、flowEndMilliseconds(IE 153)等IANA注册元素——使加密流量特征以运维团队熟悉的形态进入既有采集与审计管道;包长矩、JA4字段、burst计数等自定义特征则通过企业私有IE(Private Enterprise Number)扩展携带。这一衔接的现实意义是:检测引擎不要求企业更换流量遥测体系,而是在其上叠加加密行为维度,大幅降低落地摩擦。

04b · 时间源与per-CPU Map的并发读取

4b.1 内核态时间源的正确用法

  • 单调时钟:全部IAT/burst计量使用 bpf_ktime_get_ns()(CLOCK_MONOTONIC语义,纳秒级,不受系统时间回拨影响);严禁使用墙钟时间做包间间隔计算。
  • 上下文安全:XDP/TC程序运行于软中断上下文,该helper在此上下文可用且开销为一次时钟读取;周期性心跳上报时由用户空间补充墙钟时间戳。
  • 跨核漂移:多核各自的时钟源可能存在微小漂移,per-CPU统计归并时以首末包时间戳的最大跨度估计流时长,避免跨核直接相减。

4b.2 per-CPU Map的用户空间读取

PERCPU_HASH承载的热路径状态,消费端有两种读取姿势:

  • bpf_map_lookup_percpu_elem():逐键读取每个CPU副本,归并语义由消费端完全控制(推荐:流摘要上报前做最终归并,语义最清晰);
  • bpf_map_lookup_batch():批量遍历,吞吐高但归并窗口需自行设计;
  • 一致性声明:两种读取都提供的是"某一时刻的跨核视图快照",不保证全局瞬时一致——对统计特征无害(第1.4节已论证),但对"每流全局精确计数"类需求必须显式说明。

helper语义与读取API依据Linux内核BPF文档与libbpf头文件[3][8]。

05 · 开销控制工程实践清单

P1

无锁与亲和性

流表用per-CPU变体消除自旋;RSS队列与CPU绑定,让同流同核,把跨核归并压到最低。

P2

快速路径极简化

已识别流的常规包只更新计数与矩,不重复解析;解析逻辑仅在握手首包与阈值触发时执行。

P3

逃生与降级

XDP_PASS直通开关常驻;CPU占用超限时自动收缩特征集并提高抽样比,保证转发永不中断。

P4

引擎自身可观测

bpftool prog/map show监控运行时长与命中;丢弃率、事件队列深度、热更新时间线全部留痕。

性能数字声明:本课题页面中出现的吞吐与开销指标,除明确标注"公开基准"者(如XDP单核千万级pps[1])外,均为设计目标或工程预算示意值;真实测量必须以目标硬件、驱动、内核版本与标定流量集为准,并相对无检测基线报告增量开销——这也是第3页评估方法学的硬性要求。

本节参考文献(第2页 · [13]—[24])

[13]

Rescorla, E. "The Transport Layer Security (TLS) Protocol Version 1.3", RFC 8446, IETF, 2018. rfc-editor.org/rfc/rfc8446

[14]

Iyengar, J., Thomson, M. "QUIC: A UDP-Based Multiplexed and Secure Transport", RFC 9000, IETF, 2021. rfc-editor.org/rfc/rfc9000

[15]

Thomson, M., Turner, S. "Using TLS to Secure QUIC", RFC 9001, IETF, 2021. rfc-editor.org/rfc/rfc9001

[16]

Benjamin, D. "Applying GREASE to TLS Extensibility", RFC 8701, IETF, 2020. rfc-editor.org/rfc/rfc8701

[17]

FoxIO. "JA4: TLS Client Fingerprinting — Network Detection & Response", foxio.io/ja4;JA4社区指纹库 ja4db.com

[18]

Welford, B.P. "Note on a Method for Calculating Corrected Sums of Squares and Products", Technometrics, 4(3), 1962.

[19]

Claise, B., Trammell, B., Aitken, P. "Specification of the IP Flow Information Export (IPFIX) Protocol for the Exchange of Flow Information", RFC 7011, IETF, 2013. rfc-editor.org/rfc/rfc7011

[20]

Draper-Gil, G., Lashkari, A.H., Mamun, M.S.I., Ghorbani, A.A. "Characterization of Encrypted and VPN Traffic Using Time-related Features", ICISSP 2016, Rome, pp. 407–414, SciTePress.(ISCX VPN-nonVPN数据集)

[21]

Velan, P., Čermák, M., Jirsík, T., Tovarňák, D. "A Survey of Methods for Encrypted Traffic Classification and Analysis", International Journal of Network Management, 2015.

[22]

Cisco. "Joy — A Package for Capturing and Analyzing Network Flow Data", github.com/cisco/joy

[24]

Estan, C., Varghese, G. "New Directions in Traffic Measurement and Accounting: Focusing on the Elephants, Ignoring the Mice", ACM Transactions on Computer Systems (TOCS), 21(4), 2003.(smart sampling理论基础)