【RFC3449 网络路径不对称对 TCP 性能的影响】(翻译)

原文 https://datatracker.ietf.org/doc/html/rfc3449 

概述

本文档描述了由于非对称效应而产生的 TCP 性能问题。由于不同的根本原因,这些问题出现在几个接入网络中,包括带宽不对称网络和分组无线b子网。然而,这两种情况下 TCP 性能的最终结果是相同的:由于从接收器到发送器的 ACK 反馈的不完善和可变性,性能通常会显着下降。

该文件详细介绍了对这些影响的几种缓解措施,这些措施已在文献中提出或评估,或者目前已部署在网络中。这些解决方案结合使用本地链路层技术、子网和端到端机制,包括:(i) 管理用于承载 ACK 的上行瓶颈链路的信道的技术,通常使用报头压缩或减少TCP ACK 的频率,(ii) 处理这种降低的 ACK 频率的技术,以保留 TCP 发送方的确认触发的自时钟,以及 (iii) 以相反方向调度数据和 ACK 数据包的技术,以在存在两路流量的时候提高性能。本文描述了每种技术,以及已知问题和使用建议。本文末尾提供了建议摘要。

目录

   1. 本文档中使用的约定
     2. 动机
     2.1 传输和接收容量的差异导致的不对称性
     2.2 反向共享媒体导致的不对称
     2.3 一般问题
   3. 非对称如何降低 TCP 性能?
     3.1 非对称容量
     3.2 MAC 协议交互
     3.3 双向流量
     3.4 非对称网络路径的损失
   4. 使用主机缓解措施提高 TCP 性能
     4.1 修改后的延迟 ACK
     4.2 大的MSS的使用
     4.3 ACK拥塞控制
     4.4 窗口预测机制
     4.5 基于Cwnd估计的确认
     4.6 TCP 发送者起搏
     4.7 TCP 字节计数
     4.8 背压
   5. 使用透明修改提高 TCP 性能
     5.1 类型 0:头部压缩
       5.1.1 TCP 头部压缩
       5.1.2 其他鲁棒性头部压缩算法
     5.2 类型 1:反向链路带宽管理
       5.2.1 ACK 过滤
       5.2.2 ACK 抽取
     5.3 类型 2:处理不频繁的 ACK
       5.3.1 ACK重建
       5.3.2 ACK 压缩和压扩
       5.3.3 减轻由偶发 ACK 产生的 TCP 数据包突发
     5.4 类型 3:上行链路调度
       5.4.1 上游瓶颈链路按流排队
       5.4.2 ACK优先调度
   6. 安全考虑
   7. 总结
   8. 致谢
   9. 参考文献
   10. IANA 考虑
   附录:显示网络路径不对称的子网示例
   作者地址
   完整的版权声明

1. 本文档中使用的约定

FORWARD DIRECTION:非对称网络路径上数据传输的主要方向。它对应于在容量、延迟、错误率等方面具有较好特性的方向。前向的数据传输称为“正向传输”。正向传输的数据包遵循 IP 网络的前向路径。

REVERSE DIRECTION:转发 TCP 传输流的确认的方向。数据传输也可能发生在这个方向(并且被称为“反向传输”),但它通常比正向传输量小。反向通常表现出比正向更差的特性。反向传输的数据包沿着反向路径通过 IP 网络。

上游链路:通常具有比相应下游链路少得多的能力的特定瓶颈链路。拥塞不仅限于这条链路,也可能发生在正向和反向的任何一点(例如,由于与其他交通流共享)。

下游链路:正向路径上的一条链路,对应于上行链路。

ACK:累积的 TCP 确认 [RFC791]。在本文档中,该术语是指携带累积确认 (ACK) 但不携带数据的 TCP 段。

DELAYED ACK FACTOR, d:TCP ACK 确认的 TCP 数据段的数量。 d 的最小值为 1,因为每个数据包最多应该发送一个 ACK​​ [RFC1122,RFC2581]。

STRETCH ACK:Stretch ACK 是一种确认,涵盖超过 2 个先前未确认数据段 (d>2) [RFC2581]。由于实现错误 [All97b, RFC2525] 或由于 ACK 丢失 [RFC2760],stretch ACK 可以通过设计(尽管这不是标准的)发生。

标准化带宽比,k:前向与返回方向的原始带宽(容量)的比率除以两个方向使用的数据包大小的比率 [LMS97]。

SOFTSTATE:在协议 [Cla88] 使用的网络设备中建立的每个流状态。状态在一段时间后到期(即,会话到期时不需要明确删除),并在流继续的同时不断刷新(即,丢失的状态可以重建而无需交换额外的控制消息)。

2. 动机

几种网络技术表现出非对称特性,包括有线数据网络(例如 DOCSIS 有线电视网络 [DS00、DS01])、直播卫星(例如,使用数字视频广播的 IP 服务、DVB、[EN97] 与交互式回信道)、甚小孔径卫星终端 (VSAT)、非对称数字用户线 (ADSL) [ITU02、ANS01] 和几个分组无线电网络。这些网络越来越多地被部署为高速互联网接入网络,因此非常需要实现良好的 TCP 性能。然而,网络路径的不对称性通常使这具有挑战性。附录中提供了一些表现出不对称性的网络示例。

不对称性可能表现为发送和接收容量的差异、丢包率的不平衡或发送和接收路径之间的差异 [RFC3077]。例如,当容量不对称时,使得 TCP ACK 使用的反向路径上的容量减少,缓慢或不频繁的 ACK 反馈会降低 TCP 正向性能。类似地,底层媒体访问控制 (MAC) 和物理 (PHY) 协议中的不对称性可能会使传输 TCP ACK(与其大小不成比例)变得昂贵,即使容量是对称的。

2.1 发送和接收容量差异导致的不对称性

网络路径可能是不对称的,因为上行链路和下行链路以不同的速率运行和/或使用不同的技术实现。

当携带 TCP ACK 的尽力而为 IP 流与其他业务流(例如电话)共享可用的上行容量时,容量的不对称性可能会显着增加,尤其是保留了上行容量的流。这包括在 IP 层(例如,有保证的服务 [RFC2212])或在子网层(例如,使用 DOCSIS [DS01] 中的主动授权服务支持 IP 语音 [ITU01],或在ADSL 上的 ATM [ITU02, ANS01]的虚拟CBR连接)。

当存在多个上行链路时,可以通过在多个可用上行链路之间划分上行流量来减少不对称性。

2.2 反向的共享媒体导致的不对称

在采用集中式多路访问控制的网络中,不对称性可能是网络中心辐射式架构(即单个基本节点与多个下游节点通信)的基本结果。中央节点通常会产生较少的传输开销,并且在调度其自己的下游传输时不会产生延迟。相比之下,上行传输会受到额外的开销和延迟(例如,由于传输突发之间的保护时间和争用间隔)。这会产生显着的网络路径不对称。

由于每个节点必须首先使用争用 MAC 协议请求每个数据包的带宽(例如,DOCSIS 1.0 MAC 限制每个节点在每个上行时分间隔 [DS00] 中最多发送一个数据包),上行容量可能会进一步受到限制)。采用动态按需分配带宽 (BoD) 的卫星网络也为每个发送的数据包消耗 MAC 资源(例如,[EN00])。在这些方案中,可用的上行链路容量是 MAC 算法的函数。 MAC 和 PHY 方案还引入了每次上行传输的开销,这可能对于传输短数据包(包括 TCP ACK)很重要,变得与传输 MTU 大小的数据包一样昂贵。

2.3 一般问题

尽管依赖于容量的不对称性和依赖于 MAC 的不对称性之间存在技术差异,但由于相同的根本原因,两种网络路径都会降低 TCP 性能:ACK 反馈的不完善性和可变性。本文档详细讨论了该问题并描述了可以减少或消除约束的几种技术。

3. 非对称如何降低 TCP 性能?

本节描述网络路径不对称对 TCP 性能的影响。读者可参考 [BPK99, Bal98, Pad98, FSS01, Sam99] 了解更多细节和实验结果。

3.1 非对称容量

当前向和返回路径具有非常不同的容量时,降低单向传输性能的问题取决于上行链路的特性。对于此类网络路径上的单向流量,会出现两种类型的情况:当上游瓶颈链路有足够的队列以防止数据包 (ACK) 丢失时,以及当上游瓶颈链路具有小缓冲区时。每个都被依次考虑。

如果上游瓶颈链路有很深的队列,因此这不会在相反方向丢弃 ACK,那么性能是归一化带宽比 k 的强函数。例如,对于 10 Mbps 的下行链路和 50 Kbps 的上行链路,原始容量比为 200。对于 1000 字节数据包和 40 字节 ACK,数据包大小的比值为 25。这意味着 k 为 200 /25 = 8。
因此,如果接收方确认比每 8 (k) 个数据包一个 ACK​​ 的频率更高,则上游链路将在下游链路之前变得饱和,从而限​​制了前向的吞吐量。请注意,达到的 TCP 吞吐量由接收方通告窗口或 TCP 拥塞窗口的最小值 cwnd [RFC2581] 决定。

当使用延迟 ACK 时 如果ACK 没有被丢弃(在上游瓶颈链路上)并且 k > 1 或 k > 0.5 [RFC1122],则 TCP ACK 时钟中断。考虑由发送方快速连续发送的两个数据包。在到达接收器的途中,这些数据包根据前向最小瓶颈链路的容量分开。 ACK 时钟的原理是响应接收这些数据包而生成的 ACK 将这个时间间隔一直反映到发送方,使其能够传输保持相同间隔的新数据包 [Jac88]。带有延迟 ACK 的 ACK 时钟反映了实际触发 ACK 的数据包之间的间隔。然而,有限的上行容量和上行瓶颈路由器的排队改变了反向路径的 ACK 间隔,因此在发送方被观察到。当 ACK 以比链路可以支持的速度更快的速度到达上游瓶颈链路时,它们会相互排在后面。当它们从链路出现时,它们之间的间距相对于它们的原始间距被扩大,是上游瓶颈容量的函数。因此,TCP 发送方以比没有 ACK 排队时更慢的速率输出新数据包。连接的性能不再单独依赖于下游瓶颈链路;相反,它受到到达 ACK 的速率的限制。作为副作用,发送方的 cwnd 增长速度也减慢了。

当反向路径上的上游瓶颈链路饱和时,会出现第二个副作用。饱和链路会导致数据包持续排队,导致所有使用瓶颈链路的终端主机观察到的路径往返时间 (RTT) [RFC2998] 增加。这会影响协议控制循环,也可能触发错误超时(发送主机低估路径 RTT)。

当上游瓶颈链路具有相对少量的缓冲空间来容纳 ACK 时,就会出现不同的情况。随着传输窗口的增长,这个队列被填满,ACK 被丢弃。如果接收方要确认每个数据包,则每 k 个数据包中只有一个ACK 将发送给发送方,其余 (k-1) 由于上游链路缓冲区的缓冲区溢出而被丢弃(这里 k 是前面提到的归一化带宽比)。在这种情况下,反向瓶颈链路容量和缓慢的 ACK 到达率不会直接导致任何性能下降。但是,ACK 的频率低会导致性能下降的三个原因:

<think> 我们被要求测量网络双向路径不对称延迟。根据之前的讨论,网络不对称性会导致NTP延迟估算误差增大。因此,准确测量双向延迟不对称性对于解决时间同步问题至关重要。 根据引用[1]和[2],我们可以利用一些网络工具来测量双向路径的延迟差异。具体方法如下: 1. **使用hping3和tcptraceroute对比双向路径**(如之前所述): - 使用`hping3`发送SYN包(模拟TCP连接)到目标服务器并统计RTT(往返时间),这实际上测量的是往返延迟(RTT = d_AB + d_BA)。 - 使用`tcptraceroute`(使用TCP SYN包进行路由跟踪)可以获取从客户端到服务器的路径(即正向路径)。 - 但是,为了获取反向路径(服务器到客户端),我们需要在服务器端执行相同的工具指向客户端。这需要服务器端的配合。 2. **使用双向主动测量协议(OWAMP/TWAMP)**: - OWAMP(One-Way Active Measurement Protocol)和TWAMP(Two-Way Active Measurement Protocol)是IETF标准化的网络性能测量协议,专门用于测量单向延迟、丢包等。 - 部署OWAMP需要两端都运行OWAMP服务器和客户端,通过发送时间戳精确的记录包,分别计算正向和反向的延迟,从而得到不对称延迟:$\Delta d = |d_{AB} - d_{BA}|$。 - TWAMP是OWAMP的扩展,支持双向测量,更加方便。 3. **使用ICMP Timestamp请求(推荐,因大多数设备支持)**: - 发送ICMP Timestamp请求(类型13)和回复(类型14)可以获取单向延迟。但是,由于安全原因,大多数现代设备禁用了此功能。 4. **使用NTP本身测量**: - 在NTP协议中,我们可以通过收集多次交换的时间戳来估算不对称延迟。NTP的四个时间戳(T1:客户端发送时间,T2:服务器接收时间,T3:服务器发送时间,T4:客户端接收时间)可以用于计算: $$ \text{正向延迟} \quad d_{AB} = (T_2 - T_1) - \theta $$ $$ \text{反向延迟} \quad d_{BA} = (T_4 - T_3) + \theta $$ 其中$\theta$是时钟偏差。但是,这里存在一个循环依赖:我们需要知道$\theta$才能计算单向延迟,而计算$\theta$又需要知道单向延迟。因此,通常我们假设对称延迟($d_{AB}=d_{BA}$)来估算$\theta$,然后再用估算的$\theta$去计算单向延迟,进而得到不对称性。这种方法在不对称性较大时误差也大。 5. **使用PTP(Precision Time Protocol)**: - PTP(IEEE 1588)通过硬件时间戳可以精确测量单向延迟。PTP的延迟测量机制如下: - 主时钟发送Sync消息,并记录发送时间$t_1$;从时钟记录接收时间$t_2$。 - 主时钟可能随后发送一个携带$t_1$的Follow_Up消息(如果硬件支持在Sync消息中携带时间戳,则使用两步模式)。 - 从时钟发送Delay_Req消息,记录发送时间$t_3$;主时钟记录接收时间$t_4$。 - 主时钟通过Delay_Resp消息将$t_4$发送给从时钟。 - 则从时钟可以计算: $$ \text{时钟偏差} \quad \theta = \frac{(t_2 - t_1) - (t_4 - t_3)}{2} $$ $$ \text{路径延迟} \quad d = \frac{(t_2 - t_1) + (t_4 - t_3)}{2} $$ 但是,注意这里计算的是往返延迟的一半(假设对称)。为了得到单向延迟,我们需要分别计算正向和反向: $$ d_{AB} = (t_2 - t_1) - \theta $$ $$ d_{BA} = (t_4 - t_3) + \theta $$ 这样,我们就可以得到不对称延迟$\Delta d = |d_{AB} - d_{BA}|$。 6. **使用专用硬件设备**: - 使用支持精确时间戳的网络接口卡(NIC)和交换机,通过PTP或类似协议,直接捕获数据包在发送和接收时的精确时间,从而计算单向延迟。 7. **使用软件工具(如ping和traceroute)的变通方法**: - 在客户端和服务器端同时运行抓包工具(如tcpdump),然后客户端发送一个带有精确时间戳(由客户端记录)的UDP包,服务器端收到后记录接收时间(由服务器端系统时钟,要求服务器时钟与客户端同步?这又是个问题)。然后服务器发回一个包含客户端发送时间、服务器接收时间和服务器发送时间的包。这样客户端收到后,再记录接收时间,就可以计算: $$ d_{AB} = T_{\text{server\_recv}} - T_{\text{client\_send}} - \theta $$ $$ d_{BA} = T_{\text{client\_recv}} - T_{\text{server\_send}} + \theta $$ 其中$\theta$是客户端与服务器之间的时钟偏差。同样,我们需要知道$\theta$才能计算单向延迟。因此,这种方法需要事先同步时钟,或者通过多次测量和迭代来估算。 鉴于以上方法,对于一般用户,推荐使用OWAMP/TWAMP,因为它们是为单向测量设计的标准协议。在Linux系统上,可以安装`owamp`或`twamp`软件包进行测量。 以下是一个简单的TWAMP测量步骤: 步骤1:在服务器端启动TWAMP服务器(需要root权限): ```bash # 安装owamp sudo apt install owamp # 配置owamp服务器(编辑/etc/owampd.conf,设置访问控制等) sudo systemctl start owampd ``` 步骤2:在客户端使用twping(属于owamp包)进行测量: ```bash twping -c 100 -i 0.1 server-ip ``` 输出将包括正向延迟(从客户端到服务器)和反向延迟(从服务器到客户端)的统计信息。 注意:此方法需要两端都运行owamp,且防火墙允许OWAMP控制端口(端口861)和数据端口(端口8760-60000)的通信。 如果无法安装OWAMP/TWAMP,我们可以使用前面提到的NTP时间戳方法进行估算,但需要多次测量取平均以减少误差。 另外,引用[3]提到激活函数的Lipschitz条件,这启发我们可以使用滤波算法(如卡尔曼滤波)对测量结果进行平滑处理,以得到更稳定的不对称延迟估计。 总结:测量网络双向延迟不对称性的方法有多种,其中OWAMP/TWAMP是最直接可靠的方法。在无法部署这些协议的情况下,可以使用NTP或PTP协议的时间戳进行估算,但精度会受时钟偏差的影响。 根据用户之前的上下文,我们还可以生成相关问题: §§相关问题§§ 1. OWAMP和TWAMP协议有什么区别? 2. 如何部署OWAMP/TWAMP进行网络单向延迟测量? 3. 在存在时钟偏差的情况下,如何准确测量单向延迟? 4. 如何利用PTP协议测量网络不对称延迟? </think> ### 测量网络双向延迟不对称性的方法 #### **一、基础测量方法** 1. **双端协同测量法** 在通信两端部署时间同步设备,通过精确时间戳计算单向延迟: $$ d_{AB} = T_2^{\text{server}} - T_1^{\text{client}} - \theta $$ $$ d_{BA} = T_4^{\text{client}} - T_3^{\text{server}} + \theta $$ 其中 $\theta$ 为时钟偏差,通过多次测量取平均消除[^1]。 **工具实现**: ```bash # 客户端发送带精确时间戳的UDP包 echo "$(date +%s.%9N)" > /dev/udp/server_ip/12345 # 服务器端记录接收时间并回传 ``` 2. **TWAMP协议(RFC 5357)** IETF标准化的双向主动测量协议: ```mermaid sequenceDiagram 客户端->>服务器: SYN+时间戳T1 服务器-->>客户端: ACK+接收时间T2 客户端->>服务器: 请求反向测量 服务器->>客户端: 数据包+时间戳T3 客户端->>服务器: 计算d_BA=T4-T3 ``` **部署命令**: ```bash # 启动TWAMP反射器 apt install twampd systemctl start twampd ``` 3. **hping3路径对比法** 通过对比双向路径节点发现不对称路由: ```bash # 正向路径探测 hping3 -S -p 80 -traceroute target_ip # 反向路径探测(需在目标服务器执行) hping3 -S -p 80 -traceroute client_ip ``` #### **二、高精度测量技术** | 技术 | 原理 | 精度提升 | |------|------|----------| | **硬件时间戳** | 使用NIC网卡记录帧进出MAC层精确时刻 | 1ms → 100ns | | **PTP透明时钟** | 交换机记录驻留时间并写入修正字段 | 100μs → 1μs | | **交叉时间戳** | 网卡PHY层与系统时钟联合打戳 | 消除OS调度抖动 | **硬件时间戳启用**: ```bash ethtool -T eth0 | grep "hardware-transmit" # 确认支持 ptp4l -i eth0 -m -H # 启用硬件时间戳 ``` #### **三、动态补偿算法** 1. **卡尔曼滤波预测** $$ \hat{\Delta d}_k = K_k \cdot (z_k - H\hat{\Delta d}_{k-1}) $$ 其中: - $z_k$ = 实时测量的不对称延迟 - $K_k$ = 卡尔曼增益系数 - $H$ = 观测矩阵 2. **LSTM神经网络建模** 利用循环神经网络学习路径延迟特征: ```python model = Sequential() model.add(LSTM(64, input_shape=(time_steps, features))) model.add(Dense(1)) # 输出延迟补偿值 model.compile(loss='mse', optimizer='adam') ``` #### **四、测量验证方法** 1. **延迟差直方图统计** ```bash # 收集100次测量样本 for i in {1..100}; do ping -c 1 target_ip | grep "time=" | cut -d= -f4 done > rtt.txt # 绘制双向延迟差分布 gnuplot -e "plot 'rtt.txt' using 1 with histogram" ``` ![延迟差分布示例](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIwMCI+PHJlY3QgeD0iMCIgeT0iMTAwIiB3aWR0aD0iMzUwIiBoZWlnaHQ9IjUiIGZpbGw9IiM5Y2MiLz48L3N2Zz4=) 2. **NTP误差验证** ```bash chronyc sourcestats # 查看源服务器偏移量 chronyc tracking # 检查RMS offset值 ``` #### **五、典型场景测量方案** | 场景 | 推荐方法 | 测量周期 | |------|----------|----------| | 数据中心 | PTP+硬件时间戳 | 持续测量 | | 5G移动网络 | TWAMP+动态补偿 | 每10ms | | 广域网 | 北斗/GPS共视法 | 每60s | > 💡 **关键建议**:对于金融交易等低延迟场景,需结合硬件时间戳与动态补偿算法,将测量误差控制在$|\Delta d| < 1\mu s$[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值