QoS 整形器,在不丢包的情况下整形流量?

网络工程 思科 思科-ios 服务质量 拥塞
2021-07-09 16:30:51

我的 QoS 策略有问题,或者我应该说,我在理解我的策略如何在不丢包的情况下设法实现它的要求时遇到了问题!

这是场景:

我们有一个 GRE 点对点隧道、受 IPsec 保护的加密映射,我们将流出它的流量调整为 10Mbps。我们使用 HQF,因此我在隧道接口上应用了传出的父整形策略和具有 5 个类(默认包括)的子策略。通往隧道另一端的路径可以一直处理 100Mbps,并且边缘路由器上的 CPU 受到监控并且处于正常操作级别,因此除了我的整形器将流量限制为 10Mbps 之外别无他物。策略类“A”、“C”、“D”、“默认”设置为“队列限制 234”(“B”类获取默认 64 个数据包)因此所有 5 个类的最大队列总和等于少于 1000 个数据包,这是提供隧道的物理接口上的默认“最大队列”值。Ping 显示通过隧道的 RTT 大约为 12 毫秒。

这是我测试政策的方式:

我将一个大型 ISO 文件通过 FTP 传输到隧道另一端的主机。例如,第一个 FTP 匹配类“C”,并且它超过了类分配的“权重”。我注意到隧道传出流量被调整为 10 Mbps。“show policy-map”显示了一些排队的数据包但没有丢包......隧道仍然满(10Mbps)我启动了第二个与“D”类匹配的FTP,再次是大的ISO文件,过了一会儿“show policy-map ” 显示这两个类别的流量与使用带宽命令分配给它们的“权重”成比例。隧道流量保持 10Mbps,队列中仍有一些数据包但没有丢包……更重要的是,与其他类别匹配的“正常”网络流量(不超过其分配的“权重”)仍然没有问题。

问题:

我的策略如何在不丢包的情况下将流量调整为请求的大小?

我的(显然是错误的)理论:

我所期望的是,当 TCP 超过类的可用 BW 时,数据包会堆积在类队列中,直到它满了并开始尾部丢弃。然后 TCP 最终将不得不重新传输未确认的数据并降低窗口大小,直到它尝试在一段时间后再次放大它,我们最终会像以前一样出现尾部丢弃,然后我们又来了,结果将流量整形为 10Mpbs。

但是我的尾巴在哪里???我在这里错过了什么?

路由器是带有 IOS c2800nm-advsecurityk9-mz.151-4.M12a 的 Cisco 2821。这是我的配置的一部分:

class-map match-any A
 match access-group name ACL_A
class-map match-any B
 match access-group name ACL_B
class-map match-any C
 match access-group name ACL_C
class-map match-any D
 match access-group name ACL_D
!
!
policy-map CHILD
 class A
  bandwidth percent 5
  queue-limit 234 packets
 class B
  bandwidth percent 5
 class C
  bandwidth percent 40
  queue-limit 234 packets
 class D
  bandwidth percent 40
  queue-limit 234 packets
 class class-default
  queue-limit 234 packets
  bandwidth percent 10
!
policy-map PARENT
 class class-default
  shape average 10000000
  service-policy CHILD
!
!
interface Tunnel1
 bandwidth 10000
 ip address x.x.x.x 255.255.255.252
 ip mtu 1400
 ip flow ingress
 ip flow egress
 load-interval 30
 qos pre-classify
 keepalive 3 3
 tunnel source GigabitEthernet0/1.4042
 tunnel destination z.z.z.z
 tunnel path-mtu-discovery
 service-policy output PARENT
!
!    
interface GigabitEthernet0/1
 no ip address
 load-interval 30
 duplex auto
 speed auto
!
!
interface GigabitEthernet0/1.4042
 bandwidth 10000
 encapsulation dot1Q 4042
 ip address w.w.w.w 255.255.255.252
crypto map XXXZZZ
!
2个回答

我的策略如何在不丢包的情况下将流量调整为请求的大小?...隧道流量保持 10Mbps,队列中仍有一些数据包,但没有丢包...

您的 C 级 FTP 和 D 级 FTP 将完全按照您在编写良好的 CBWFQ 策略中的要求进行处理

您在队列中看到一些数据包的事实意味着该策略正在执行您的要求;如果您在这种情况下看到数据包丢失,则 Cisco IOS 有问题。

由于您实际上是在延迟一些 TCP 数据包,因此当您有 10Mbps PARENT 类的竞争流量时,操作系统内核的 TCP RTT 估计会稍微高一点,但这就是这种情况下会发生的全部情况。

CBWFQ 仅在队列中有数据包时才处于活动状态;您要求将队列带宽的 40% 分配给“C FTP”,并将队列带宽的 40% 分配给“D FTP”。本质上,当 PARENT 类整形器中存在相同的 10Mbps 竞争时,您正在减慢 FTP 会话。

但是我的尾巴在哪里???我在这里错过了什么?

您还没有发送足够的流量来超过那些 234 个数据包的 C 类和 D 类队列限制。发送更多 TCP 会话,您将开始破坏这些队列并丢弃数据包。

[在评论中] 如果不丢包,TCP 是如何变慢的?

要了解流量变慢的确切原因,请发布wireshark数据包捕获;最简单的捕获位置是在您的以太网交换机上。这避免了 TCP 分段卸载导致的失真,默认情况下,该卸载在您的 NIC 驱动程序中是打开的

按照迈克的建议,我得到了一些捕获,好吧,我对我的问题有了一半的答案。我在互联网上阅读了一些内容,关于 TCP 拥塞控制的 RFC 5681 等,以便更好地了解我应该对 TCP 的期望,然后我玩了一些wireshark 和不同的捕获,这就是我所做的一切.

在应用我的 QoS 策略之前,我提供的图像来自靠近发件人的捕获。测试也是按照开头问题中的描述进行的。一个 FTP 开始匹配具有 40% BW 保证的 10Mbps 链路的类,然后第二个匹配具有 40% BW 保证的不同类。第二个 FTP 停止,一段时间后第一个 FTP 也停止。在捕获期间,链接上不允许有其他流量。这有助于把事情弄清楚一点,并得出这一半的答案。图像仅指一直到最后的第一个 FTP 流。

从 t=0 到 t=34,TCP 接收方接收窗口为 64KB,发送方的 Bytes-in-Flight 达到该数字。RTT 上升,这表明在发送方和接收方之间的通信中插入了一些延迟。由于发送方达到接收方通告的窗口大小,发送方正在等待接收方确认数据包,以便它可以发送更多数据包。没有发送进一步的 ACK,因为发送方发送的数据包尚未被接收方接收,因为它们在 10Mbps 链路上被允许之前被 QoS 策略延迟。当 QoS 策略允许链路上的数据包时,会向发送方发送一个 ACK​​,然后发送方可以发送下一个数据包。因此,QoS 策略允许链路上的数据包的速率是允许发送方在网络上发送更多数据包的速率,

我希望到目前为止这是可以理解的,因为这是我的答案......

我现在知道 QoS 策略能够在不丢弃数据包的情况下限制 TCP 流的传输速率,当然前提是所有排队的数据包都有足够的队列深度,这在我的情况下似乎是正确的。(这里很重要的一点是要注意 Qos 策略强加的队列深度和延迟之间的关系,但目前这不是主题)

现在剩下的问题是:在 t=34 之后到 t=58 左右,第二个 FTP 通过同一链接发送,我可以确认我的 QoS 策略在此测试期间没有丢弃数据包。正如在我上传的图像中看到的那样,BW 的竞争在 2 个 TCP 流之间开始,第一个流上的 TCP 反复后退,这可以通过锯齿状图形确认。

问题是一样的:

由于为了使 TCP 拥塞避免生效,发送方需要感知“丢失事件”(RTO 到期或接收方发送的重复 ACK),并且我的 QoS 策略没有丢弃数据包,它如何限制 TCP流速率到链接上可用的速率。

线索是了解触发这种回退的原因,但我很难找到它。是因为数据包没有到达接收器,因为它在去往接收器的途中被丢弃了,还是因为数据包在接收器处无序到达,或者因为接收器的接收缓冲区被发送器溢出(虽然我可以不知道这是如何发生的,因为发送方总是遵守通告的窗口大小......!)或者因为发送方的 RTO 计时器因 QoS 链接排队的过多延迟而到期

老实说,在这次捕获中,拥塞期间发生了一些“未捕获 TCP 先前的数据包”,因此,我想确认这一点并进行另一次捕获,这次是在链路的另一端,靠近接收器,有点棘手...

无论如何,我有一半的答案,并且有很多嫌疑人要归咎于拥塞部分(不是 Qos 下降),所以我必须在正确的轨道上。我的想法在这里错了吗?

实时传输时间 窗口缩放 RWIN 变化 数据包/秒 动态字节数 重传