为什么我无法使用 ToS 字段对 TCP 流量进行优先级排序?

为什么我无法使用 ToS 字段对 TCP 流量进行优先级排序?

我正在尝试使用 IP 标头中的 ToS 字段对 TCP 流量进行优先级排序。我通过 iperf 发送 1GB 数据,并将 ToS 字段设置为 0x10(最小化延迟),从而使接口(以太网)饱和。然后我启动另一个具有默认 ToS(0)的 TCP 客户端。

期望:我的 TCP 客户端不应发送数据,直到 iperf 完成发送其数据。

结果:即使 iperf 发送的是更高优先级的数据包,我的客户端的数据也会被发送。

我还尝试通过创建 2 个单独的客户端并使用 iptables 为各个客户端分配 0x10 和 0x08 ToS 来创建相同的场景。我使用了:iptables -A PREROUTING -t mangle -p tcp --sport 5000 -j TOS --set-tos Minimize-Delay

我仍然无法优先考虑一个客户。

我正在使用 Ubuntu(14.04)和 iptables 版本 1.4.21

有人能帮我解决这个问题吗?

谢谢 Varun

答案1

ToS 字段指示如何对数据包进行优先级排序或路由,现在您必须指定一个策略来解释您要对这些数据包执行的操作。请注意,ToS 字段仅在您的 LAN 上有用,ISP 通常会忽略或重置 ToS。

由于你正在运行 Linux,你应该看看 tc(流量控制)。(这里有一个好的开始)

如果您想要严格的基于 ToS 的优先级,您必须设置 pfifo_fast 调度程序(默认情况下您可能有 fq_codel)。

tc qdisc add dev eth0 root pfifo_fast

不过,如果你想要更多的灵活性,你可能想尝试高频散射或者将 htb 作为有类算法,然后将 fq_codel / pfifo / sfq 作为无类叶算法。您仍然可以使用 iptables 或 tc 来匹配 ToS。

相关内容