我正在尝试使用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
我仍然无法优先考虑一个客户端而不是其他客户端。 尽管如此,我可以在wireshark中看到标有ToS的数据包。
我正在使用Ubuntu(14.04)和iptables版本1.4.21
有人可以帮我解决问题吗?
由于 VARUN
答案 0 :(得分:3)
<强> TL; DR 强>
只需在数据包上设置ToS或DSCP标记即可。实际上,您需要将设备配置为使用不同的标记执行不同的操作。如果要包含队列,则需要配置队列,并为不同的队列分配不同的标记。
更完整的解释
您想要使用QoS。 QoS是一个很大的主题,但我会尝试解释一些事情。可以在Traffic Control HOWTO找到在Linux上使用QoS的指南。
实际上已经被DSCP(差分服务代码点)取代的ToS只是标记数据包以区分各种数据包,以便在某些时候进行不同的处理。 ToS字段是原始IPv4数据包规范的一部分,但标准中没有任何规定要求设备必须使用或尊重该字段。QoS涉及区分(标记)数据包,然后根据标记执行某些操作。您对标记的处理方式可以是整形,监管,排队(包括优先排队)。
硬件接口将具有FIFO队列,这是默认且唯一的队列,无论数据包标记如何。硬件完全不知道数据包标头或标记。
实际上,使用标记通常在第3层网络设备中完成,例如,路由器。例如,您可以为路由器接口配置不同的软件队列,并且可以将具有不同标记的数据包分配给不同的队列。队列相对较小,不像真正的缓冲区。优先队列将在常规队列之前提供。在您定义队列之前,队列不存在,并且除非您已配置规则以执行此操作,否则不会将数据包分配给不同的队列。您可以将BE(Best Effort,ToS 0)数据包分配给优先级队列,将EF(加速转发)数据包分配给低优先级队列。
当队列填满时,将丢弃发往该队列的新数据包(称为尾部丢弃)。尾部丢弃可能是TCP的一个问题,因为它可能导致使用队列的所有TCP流变为同步(全局同步),在这些流中,它们退回并同步加速,交替饥饿或泛滥队列。有一些方法可以尝试防止这种情况,例如: RED(随机早期检测)。 RED实际上会丢弃队列中的随机数据包。这是为了强制使用队列的各种TCP流程退出并在不同的时间表上增加。
除非您已将交换机配置为信任一个或多个接口上的标记,否则许多网络交换机会自动将BE(尽力而为,ToS 0)分配给进入交换机的任何内容。路由器通常会信任标记,但除非您将其配置为标记,否则它们不会对标记执行任何操作。
只有在您的网络中,QoS才能在Internet上运行。您需要拥有一整套在整个网络中一致实施的QoS策略。您可能需要付费协商,让您的ISP尊重您的QoS标记和政策的部分,但这只会影响您的ISP。当您的流量离开您的网络时,或者如果您与ISP达成协议,则您的ISP网络将完全忽略您的QoS标记和策略,并且数据包可能会设置为BE。