基于NetFlow双向流记录估算平均往返时间
1. 引言
网络性能中,延迟是一个重要指标,可应用于服务质量保证、网络规划、拥塞检测等方面。延迟分为单向延迟和往返延迟,往返延迟通常称为往返时间(RTT),它指的是发送一个数据包到收到其确认的时间。用户对网络服务的体验明显依赖于发送请求和接收响应之间的延迟,因此我们主要关注TCP流的RTT。
估算RTT的方法主要分为主动测量和被动测量两类:
-
主动测量
:通过发送测试数据包来计算链路延迟,但会给流量带来额外开销,不适合部署在网络中的监控设备。
-
被动测量
:在网络中部署监控点,分析流量数据以获取TCP流的RTT。目前有多种被动RTT估算算法,如SYN - ACK法、SLOW - START法、PRE法、TIMESTAMP法、SELF - CLOCKING法、RUNNING法、SPECTRAL ANALYSIS法等。不过这些方法都需要监控设备捕获的IP跟踪信息,在高速网络环境下,需要专业设备和大量存储空间来记录每个数据包的详细信息,应用范围因成本受限。
NetFlow是CISCO在1996年开发的网络流量监控技术,广泛集成于许多商业路由器和交换机中。分析NetFlow收集的数据集对RTT估算具有重要意义,本文旨在通过分析NetFlow跟踪信息以被动方式估算TCP流的端到端RTT,这里讨论的RTT是TCP流的统计平均RTT值。
2. 基于NetFlow记录的RTT估算
网络流在RFC 2722和RFC 3697中被定义为从源主机到目标主机的单向数据包序列。传统Cisco定义中,流中的数据包共享7元组键,包括源和目标IP地址、源和目标端口、IP协议、IP服务类型和入站接口。路由器通过检查捕获数据包的7元组键来确定其所属流,若匹配则更新流量信息,否则生成新的流记录。
路由器在以下四种情况下会向NetFlow数据收集器发送记录:
1. 捕获到带有FIN或RST标志的段,表明TCP会话终止。
2. 流量停止一段时间,通常为15秒。
3. 路由器缓存耗尽。
4. 即使流仍在进行,路由器也会以固定间隔(通常为30分钟)输出流记录。
NetFlow最常见的版本是v5,它适用于许多不同品牌的路由器,但仅限于IPv4流。NetFlow v5记录包含流量的各种信息,如流的开始和结束时间戳、字节数和数据包数、源和目标IP地址、端口号、IP协议、服务类型值等。对于TCP流,还有一个tcp_flags字段,表示流生命周期内观察到的所有TCP标志的并集。
我们根据NetFlow记录中的TCP标志、端口号等字段将TCP流分为几类,并为每类提出不同的估算方法:
-
包含起始和结束阶段的双向流
:TCP使用三次握手建立连接,四次握手终止连接。由于NetFlow只存储流的开始和结束时间,无法直接从时间戳计算RTT。但如果监控到一个流及其反向流,可将两个流的开始和结束时间间隔相加得到RTT。若NetFlow记录F包含连接建立和终止阶段(tcp_flags中SYN和FIN位被设置),其开始和结束时间为st和et,反向流记录
F_rev 也包含这两个阶段,开始和结束时间为 _s_t_rev 和 _e_t_rev ,且 _s_s_t_t_rev < 和 _e_e_t_rev < t ,则RTT计算公式为:
[RTT = (t
{rev}^s - t^s) + (t^e - t_{rev}^e)]
-
延迟ACK流
:根据RFC 1122,接收TCP数据段流的主机应发送少于每个数据段一个的ACK段。对于稳定的无丢包TCP数据流,数据包数与ACK流数据包数的比例应为2:1,此时ACK流中ACK段的平均间隔可视为该TCP会话的平均RTT。若数据流记录F及其反向ACK流记录
F_rev 存在,数据流量和反向流的数据包数分别为N和 _N_rev ,反向流的开始和结束时间为 _s_t_rev 和 _e_t_rev ,采样率为S,且N : _N_rev = 2 : 1 ,则平均RTT计算公式为:
[RTT = \frac{t
{rev}^e - t_{rev}^s}{N_{rev}} \times S]
-
无拥塞的双向流
:在有线网络中,随机比特错误率可忽略不计,丢包表示发生拥塞。根据包数比可判断双向流是否拥塞,往返数据包比为2:1的双向流可假设为无拥塞。无拥塞时,TCP流在连接建立后开始慢启动阶段,达到阈值后进入拥塞避免阶段。设流的开始和结束时间为st和et,该流期间发送的轮数为X,若能从NetFlow记录中估算出X,则RTT计算公式为:
[RTT = \frac{t^e - t^s}{X}]
假设主机在慢启动阶段发送i轮,第i轮发送不超过ssthresh(通常为655535)字节,平均包长为p,则i的计算公式为:
[i = \left\lceil \log_2 \frac{ssthresh}{p} \right\rceil + 1]
i轮后,每轮发送的数据包线性增加,直到达到最大窗口限制 maxW (默认值为110KB)。第k(k > i)轮发送的数据包数为 (2^{i - 1} + (k - i)) 。假设N个数据包在j轮内发送,分两种情况求解j:
-
发送窗口未达到限制
:数据包数N在慢启动阶段呈指数增长,在拥塞避免阶段线性增长,计算公式为:
[N = \sum_{k = 1}^{i - 1} 2^k + \sum_{k = i}^{j - 1} (2^{i - 1} + (k - i))]
求解j的公式为:
[j = i + \frac{1}{2} \left( \sqrt{1 + 8 \left( N - \sum_{k = 1}^{i - 1} 2^k \right)} - 1 \right)]
-
发送窗口达到限制
:假设主机发送窗口在拥塞避免阶段t轮后达到限制,该轮发送的数据包数为 (W_{max}’ = \frac{W_{max}}{p}) ,且 (W_{max}’ = 2^{i - 1} + t) 。则主机达到限制前发送的数据包总数为:
[N’ = \sum_{k = 1}^{i - 1} 2^k + \sum_{k = i}^{t - 1} (2^{i - 1} + (k - i)) + W_{max}’]
主机发送N个数据包总共需要的轮数j为:
[j = i + t + \frac{N - N’}{W_{max}’}]
综上所述,若NetFlow记录F表示TCP批量数据流,根据端口号判断,其数据包数为N,开始和结束时间为st和et,采样率为S,反向流记录
F_rev 存在,数据包数为 _N_rev ,若N : _N_rev = 2 : 1 ,则认为流F无拥塞。先通过上述公式计算主机达到限制前发送的数据包总数 _N ,若流F中的数据包总数大于 _N ,使用公式(8)计算轮数X,否则使用公式(6),最后将X代入公式(3)得到该流的RTT。
-
有拥塞的双向流
:若双向流的往返数据包比不等于2:1,说明丢包率不为0,该流存在拥塞。TCP数据流由多个传输周期组成,每个周期包括超时、慢启动和拥塞避免三个阶段。根据发送窗口是否达到限制讨论RTT估算:
-
发送窗口未达到限制
:预期发送的数据包数 [E Y] 和预期流持续时间 [E A] 的计算公式分别为:
[E[Y] = \frac{(1 + b) E[W]}{(1 - p) (1 + P
{TD}) + \frac{1}{2}}]
[E[A] = T_0 + \frac{2}{b} \left( \log_2 \frac{E[W]}{p} + 1 + (1 - P_{TD}) \frac{E[W]}{p} \right) RTT]
其中 (f(p) = 1 + 2p + 4p^2 + 8p^3 + 16p^4 + 32p^5) , (P_{TD}) 是由三重重复ACK导致丢包的概率, (T_0) 是发送方和接收方之间估计的初始重传超时(RTO),本文大致将其视为RTT。
-
发送窗口达到限制
:考虑超时、慢启动、拥塞避免和接收窗口限制的影响,数据包数和流持续时间的修正模型为:
[E[Y] = \frac{(1 + b) W_{max}}{(1 - p) (1 + P_{TD}) + \frac{1}{2}}]
[E[A] = T_0 + \frac{2}{b} \left( \log_2 \frac{W_{max}}{p} + 1 + (1 - P_{TD}) \frac{W_{max}}{p} \right) RTT]
若NetFlow记录F是TCP批量数据流,开始和结束时间为st和et,采样率为S,反向流记录
F_rev 存在,数据包数为 _N_rev ,且N : _N_rev ≠ 2 : 1 ,丢包率p计算公式为:
[LossRate = \frac{2r^2 + 11r + 16}{4r^2 + 4r + 1}]
其中 (r = \frac{2N - M}{M}) ,M和N是双向流的数据包数,且M > N 。TCP发送方的吞吐量可视为丢包率和平均RTT的函数,已知吞吐量和丢包率时可计算RTT。通过N × S可得到流中发送的数据包数,流持续时间为 (t^e - t^s) ,使用上述公式可求解未达到窗口限制的流的RTT1和达到限制的流的RTT2。由于无法确定流是否达到限制,假设流达到接收窗口限制的概率 (P
{lim}) 为0.5,则RTT估算公式为:
[RTT = (1 - P_{lim}) RTT_1 + P_{lim} RTT_2]
3. 评估
为收集测试数据,我们搭建了实验环境,客户端PC使用FTP下载工具从远程服务器下载文件,NetFlow收集器是部署在CERNET东北网络中心的路由器,下载的文件足够大以确保NetFlow收集器存储足够的数据。为进行比较,客户端PC在下载时通过ping服务器进行主动测量以获取实际RTT。
实验结果表明,估算的RTT与实际RTT的变化趋势大致相同,但仍存在一些误差。同时,我们发现NetFlow记录中的数据包数也会影响RTT估算,因此在估算RTT时选择数据包数大于25的流。
4. 结论
本文提出了一种使用路由器收集的NetFlow记录估算TCP流平均RTT的方法。该方法的前提是计算的流有反向流记录,并使用NetFlow记录中的多个字段,如开始和结束时间戳、数据包数、TCP标志以及流与其反向流的数据包数比。
基本思路是通过流和反向流的数据包数比获取丢包率,分析给定丢包率下的TCP稳定流量模型,计算流持续时间内的发送轮数,最后用流持续时间除以发送轮数得到平均RTT。此外,还针对包含建立和终止阶段的流、延迟ACK流提出了简单的估算方法,测试结果表明估算的RTT具有可接受的精度。
未来可进一步研究单向流的流量模型,因为单向流在流记录中更为常见。
基于NetFlow双向流记录估算平均往返时间
方法总结与对比
为了更清晰地展示不同类型TCP流的RTT估算方法,我们将上述内容总结成以下表格:
| 流类型 | 特征 | RTT估算方法 |
| — | — | — |
| 包含起始和结束阶段的双向流 | NetFlow记录F包含连接建立和终止阶段(tcp_flags中SYN和FIN位被设置),反向流记录
F_rev 也包含这两个阶段 | (RTT = (t
{rev}^s - t^s) + (t^e - t_{rev}^e)) |
| 延迟ACK流 | 稳定的无丢包TCP数据流,数据包数与ACK流数据包数的比例为2:1 | (RTT = \frac{t_{rev}^e - t_{rev}^s}{N_{rev}} \times S) |
| 无拥塞的双向流 | 往返数据包比为2:1的双向流 | 先计算i:(i = \left\lceil \log_2 \frac{ssthresh}{p} \right\rceil + 1),再分情况计算j,最后 (RTT = \frac{t^e - t^s}{X}) |
| 有拥塞的双向流 | 往返数据包比不等于2:1的双向流 | 先计算丢包率p,再分发送窗口是否达到限制计算RTT1和RTT2,最后 (RTT = (1 - P_{lim}) RTT_1 + P_{lim} RTT_2) |
技术点分析
- NetFlow技术的优势 :NetFlow技术被广泛集成于商业路由器和交换机中,能够方便地收集网络流量信息。与传统需要捕获IP跟踪信息的方法相比,它不需要专业的设备和大量的存储空间来记录每个数据包的详细信息,降低了成本,扩大了应用范围。
- 多种估算方法的互补性 :针对不同类型的TCP流提出了不同的估算方法,这些方法相互补充,能够更全面地处理各种网络情况。例如,对于包含起始和结束阶段的双向流、延迟ACK流等特殊情况,都有专门的估算方法,提高了估算的准确性。
操作步骤梳理
以下是使用NetFlow记录估算TCP流平均RTT的详细操作步骤:
1.
数据收集
:使用部署在网络中的NetFlow收集器收集TCP流的NetFlow v5记录,确保记录包含流的开始和结束时间戳、数据包数、TCP标志等信息。
2.
流分类
:根据NetFlow记录中的TCP标志、端口号以及流与其反向流的数据包数比,将TCP流分为包含起始和结束阶段的双向流、延迟ACK流、无拥塞的双向流和有拥塞的双向流四类。
3.
参数计算
:
- 对于包含起始和结束阶段的双向流,获取流和反向流的开始和结束时间戳,代入公式 (RTT = (t_{rev}^s - t^s) + (t^e - t_{rev}^e)) 计算RTT。
- 对于延迟ACK流,获取数据流量和反向流的数据包数、反向流的开始和结束时间戳以及采样率,代入公式 (RTT = \frac{t_{rev}^e - t_{rev}^s}{N_{rev}} \times S) 计算RTT。
- 对于无拥塞的双向流,先计算i:(i = \left\lceil \log_2 \frac{ssthresh}{p} \right\rceil + 1),再根据发送窗口是否达到限制分情况计算j,最后代入公式 (RTT = \frac{t^e - t^s}{X}) 计算RTT。
- 对于有拥塞的双向流,先计算丢包率p,再分发送窗口是否达到限制计算RTT1和RTT2,最后代入公式 (RTT = (1 - P_{lim}) RTT_1 + P_{lim} RTT_2) 计算RTT。
4.
结果筛选
:由于NetFlow记录中的数据包数会影响RTT估算,选择数据包数大于25的流进行估算,以提高估算的准确性。
流程图展示
下面是使用mermaid绘制的估算TCP流平均RTT的流程图:
graph TD;
A[数据收集] --> B[流分类];
B --> C{流类型};
C -->|包含起始和结束阶段的双向流| D[计算RTT1];
C -->|延迟ACK流| E[计算RTT2];
C -->|无拥塞的双向流| F[计算i和j];
F --> G[计算RTT3];
C -->|有拥塞的双向流| H[计算丢包率p];
H --> I{发送窗口是否达到限制};
I -->|是| J[计算RTT4];
I -->|否| K[计算RTT5];
J --> L[综合计算RTT6];
K --> L;
D --> M[结果筛选];
E --> M;
G --> M;
L --> M;
M --> N[输出最终RTT];
总结与展望
通过上述方法,我们可以利用NetFlow记录有效地估算TCP流的平均RTT。这种方法不仅降低了成本,还提高了估算的准确性和适用性。然而,目前的方法主要针对双向流,对于单向流的处理还不够完善。未来的研究可以重点关注单向流的流量模型,进一步拓展该方法的应用范围。同时,可以考虑结合更多的网络特征和机器学习算法,提高RTT估算的精度和鲁棒性。
总之,使用NetFlow记录估算TCP流平均RTT是一种有前景的网络性能监测方法,有望在未来的网络管理和优化中发挥重要作用。
超级会员免费看
3202

被折叠的 条评论
为什么被折叠?



