有没有办法可以对网络应用程序的网络速度进行优先排序?

有没有办法可以对网络应用程序的网络速度进行优先排序?

就像 CPU 时间有“高优先级、普通优先级等”或“优等性”一样,有没有办法对网卡/互联网做类似的事情?例如,如果我通过 wifi 从我的服务器下载文件并观看 YouTube 视频,有没有办法让 YouTube 视频具有更高的优先级?如何在 Windows 和 Linux 上做到这一点?

答案1

首先,介绍一些背景知识(读完本文后再回来看这个答案)——在维基百科上

现在,您可能会想,“QoS”(服务质量)——这就是关键!嗯,可能不是。问题是 QoS 确实应该是“端到端”才能有效,但许多节点往往不遵守它,这让它变得毫无用处。此外,它仍然没有解决一个根本问题,即实际上这很可能会导致视频延迟。

缓冲区膨胀

您可以通过阅读以下内容来了解​​缓冲区膨胀Jim Gettys 的精彩文章在他的博客上。

短的答案是,下载大量 HTTP 文件会使网络“饱和”(在路由器级别占用 100% 的可用带宽),这会导致路由器硬件创建越来越大的缓冲区来存储所有数据。缓冲区越大,数据包通过网络的延迟就越高。

要了解原因,请想象一下,您有一个网卡以 100 KBps 的速度接收数据。现在,请记住,每个传入的数据包都会排队在队列末尾(在队伍的后面,就像在学校排队吃午餐时一样)。

如果您有一个 100 KB 大的缓冲区,那么数据包需要多长时间才能穿过缓冲区? 1 秒。

如果您有一个 1 MB 大的缓冲区,假设吞吐量为 100 KBps,那么数据包需要多长时间才能穿过缓冲区?10 秒。

问题很可能是由于文件服务器的下载导致缓冲区“膨胀”(变得非常大),这是由于一种几乎有害的编程技术造成的。全部近年来,网络硬件不断改进,增加了缓冲区以避免数据包丢失。

问题是,一旦延迟超过某个点,TCP(传输控制协议)就会开始崩溃。您会看到,TCP 依赖于数据包在一定时间内到达,然后从另一端收到“ACK”(确认,例如“好的,我收到了!”的消息)。当它没有及时收到“ACK”时,它会尝试再次发送数据包,假设它已丢失。因此,最终结果是,在尝试防止数据包丢失时,膨胀的缓冲区实际上原因数据包丢失!!!

这种数据包丢失有时会导致固件将缓冲区变得更大,问题会恶化,直到网络完全中断,连接断开。只有到那时,缓冲区才会再次缩小并恢复功能。

您可能没有意识到,YouTube 的工作原理是每隔几秒钟为您传输少量视频。它会以刚好足够的吞吐量传输视频,在大约 5 秒的下载时间内为您提供大约 10 到 15 秒的视频,然后突然停止,然后重新启动,如此反复。问题是,如果您的缓冲区过大,您的视频就会滞后,因为 Youtube 视频数据包无法及时通过您过大的缓冲区!

受控延迟主动队列管理来救援。

如果可能的话,你应该尝试在你的路由器-- 如果您可以在其上安装 CeroWRT 固件,那就最好了。OpenWRT 也可以配置为使用 CoDel。您还可以在 Linux 计算机(笔记本电脑/台式机)上配置 CoDel,并通过那里路由您的流量。CoDel 是目前已知的最佳缓冲区膨胀问题解决方案。不幸的是,Windows 尚未实现。安装详细信息可以在bufferbloat.net

如果您尝试 CoDel 并且它不起作用,我敢打赌这要么是您的配置,要么我是一只飞翔的独角兽。如果您尝试 QoS 并且它不起作用,那么,这完全正常。;)

相关内容