我在5Mbps的商务连接上遇到的问题与在此站点上的另一则帖子相同。任何计算机开始下载后,ISP(Bell)提供的超过DFG的第一跳的延迟就会超出图表。
第一跳可能在我们的同一建筑物中,并且持续1ms,请开始下载,例如Windows Update,它跳到200-1000ms。

我在电话上花费了数小时,都表示您已经达到了最大可用带宽,这是正常的延迟高峰。但是我的阅读告诉我,他们正在用TCP破坏某些东西。我已经在家庭Shaw连接上进行了测试,甚至在运行下载并达到帐户最大Mbps的Rogers LTE上都进行了测试,但延迟没有达到极限。

我理解正确吗?贝尔正在采取一些措施来打破TCP的内置技术,以便根据两个端点之间的可用带宽来管理其速率?

评论

我猜一个简单的现成的解决方案是购买Edgerouter X ui.com/edgemax/edgerouter-x并将自适应队列管理配置为4.9 Mbps。只要您与Internet的所有连接都通过此框,就可以摆脱缓冲。如果我没记错的话,Edgerouter X能够处理高达130 Mbps的自适应队列管理。如果您需要具有更高限制的自适应队列管理,则需要一个更好的框。

有什么答案对您有帮助吗?如果是这样,您应该接受答案,这样问题就不会永远弹出来寻找答案。或者,您可以发布并接受自己的答案。

#1 楼

贝尔在告诉你真相。当您尝试将5Mbps(或更高)推送到5Mbps连接时,所有文件都整理整齐(读取:队列)。由于没有积压,您的ping会立即发送出去。但是,答复现在在队列的末尾。 TCP确实正在执行本应做的工作-发送方正在填充允许的接收窗口。

您可以在生产线的另一端(QoS,WRED等)上做些事情来帮助减少效果,但是当发送方和接收方带宽之间有很大差异时,您将要看到这种情况。我已经使用了很多年(T1、6Mbps DS3甚至10Mbps cablemodem),您可以要求ISP减少他们这边的队列大小,但是他们不太可能这样做,因为这会导致丢包。

评论


en.wikipedia.org/wiki/Bufferbloat域中为200-1000ms(85-420个数据包,1500B @ 5Mbps),因为TCP依赖于发生的数据包丢失才能正确快速设置窗口大小,因此将其减小到可能是10个数据包(25毫秒)。我完全同意,除非很多客户抱怨,否则运营商不太可能在其产品中进行更改,这可能更容易将QoS产品订购到业务连接,其缓冲值应该更合理,并且可以根据客户需求进行订购。有趣的是,当延迟开始增加时,Google的QUIC可以选择降低传输速率。

–ytti
13年7月24日在7:08

谢谢Ricky,我听到了您在说什么,但是经过更多阅读之后,TCP的Flow Control是否不应该看到积压的日志并将窗口调整为接收方可以处理的速率?这样一来,客户端或路由器(Bells网络上的跃点2)是否过载?在我看来,您阅读的bufferbloat似乎也已经准确地描述了这种情况。

–干果
13年7月24日在18:35

如果没有数据包丢失(或ECN),TCP将无法检测到任何瓶颈。如果路由器队列足够深,并且接收窗口足够大,则可以创建大量积压。 RFC1323时间戳可能会有所帮助,但是我已经看到允许Windows“使用” TS的重大问题。 (它尝试通过发送初始TS = 0来“协商” TS)

–瑞奇
13年7月24日在18:57

#2 楼

如今,大多数形式的“ QoS”都不包含AQM,因为供应商发现很难自动配置RED而不造成损害。这会导致您在当今许多常见设备上看到可怕的延迟,尤其是电缆调制解调器和无线设备。因此,仅建议“打开Qos” ...无济于事。实际上,至少在Netgear的一种产品上,打开“ QoS”的速率限制器会导致更糟糕的结果...。

最近出现了一种新的公平排队+ AQM算法,该算法似乎确实可以工作非常好,更好,除了设置速率限制器外几乎不需要任何配置。它称为fq_codel,现在在大多数Linux上都可以广泛使用,并且也已移植到BSD。它是openwrt障碍断路器,后院和gargoyle默认QoS的一部分,石像鬼使用的是称为sfqred的(相当不错的)早期版本,并带有一种创新的自动速率调整方案,称为ACC。在行为异常的链接前面基于此框,打开其QoS速率限制器(将其设置在提供商的入站和出站设置的下面,以便您控制)+ fq_codel,并为使用它的每个人获得更好的性能。我的意思是惊人的好:请参阅下面的ietf演示,在ietf上向iccrg工作组提交的报告等。

有关bufferbloat问题及其修复方法的详细信息,请参见:

http://www.bufferbloat.net/projects/cerowrt/wiki/Bloat-videos

我们(当然)正在努力说服各种ISP CPE供应商注意,电缆实验室(Cablelabs)也在几个月前发表了对该新技术的精彩研究,其中还包含了有关电缆调制解调器当前行为异常的一些详细信息。

http://www.cablelabs.com /downloads/pubs/Active_Queue_Management_Algorithms_DOCSIS_3_0.pdf

#3 楼

您所看到的完全是典型的。许多服务提供商会限制速率和/或使用QoS机制来降低ICMP的优先级(包括传统的ping和traceroute),因为ICMP有时已用于拒绝服务攻击。

链接不拥塞,降低的优先级不会影响任何内容,因为没有流量在排队。在这些时间段内,您的等待时间仍然很短,因为ICMP数据包将立即转发并且完全不会延迟。

当链路拥塞时,优先级较高的队列会引起更多关注。根据排队机制的不同,它可能会转发来自高优先级队列的多个数据包,以转发来自低优先级队列的每个数据包,甚至仅在高优先级队列中没有任何内容时才转发。无论如何,降级到较低优先级队列的数据包通常会比没有拥塞的链路保留更长时间,从而增加了延迟。

评论


感谢YLearn的答复。我确实获得了ICMP的优先权,但我们可以看到其他流量受到影响,ICMP只是用来说明问题。正如我试图向Ricky传达的那样,在我的评论中,流控制是TCP起作用的原因,因为如果流控制无法正常工作,则任何带宽比接收器高的发送者都会使他脱机DOS。那就是为什么拨号上网可以与1000Mbps连接通信?如果文件传输期间的运行延迟达到了适当的标准,我是否在错误地思考,以保持可共鸣的水平,而不是冒顶?

–干果
13年7月24日在18:50

#4 楼

您可能正在遭受缓冲膨胀的困扰,并且您需要AQM(活动队列管理)。我已经为Linux编写了一个脚本,它使此操作变得非常容易:

#!/bin/bash
# Traffic shaping script (AQM, fq_codel+tbf)
# Copyright 2018 Mikko Rantalainen <mikko.rantalainen@gmail.com>
# License: MIT (X11)
# Usage:
#   21/0.8 Mbps connection (ADSL2): DOWNLINK_RATE=21.7Mbit UPLINK_RATE=0.8Mbit TBF_LATENCY=500ms bin/traffic-shaping start
#   100/100 Mbps connection: ./traffic-shaping
#   1/1 GBps connection: DOWNLINK_RATE=1Gbit UPLINK_RATE=1Gbit TBF_LATENCY=10ms bin/traffic-shaping start
# Note that using low TBF_LATENCY will require powerful CPU.
#   

set -e

DEV="${DEV:=$(ip route | grep "^default " | grep -Po "(?<=dev )[^ ]+")}"

# ingress:
DOWNLINK_RATE="${DOWNLINK_RATE:=104000kbit}" # or e.g. "21.5Mbit"
# egress:
UPLINK_RATE="${UPLINK_RATE:=105000kbit}"

CODEL_INTERVAL="${CODEL_INTERVAL:=100ms}" # usually 100ms, high speed links with low latency may need lower values
CODEL_TARGET="${CODEL_TARGET:=5ms}" # unit "us" is also available, usually 5%-10% of CODEL_INTERVAL
CODEL_LIMIT="${CODEL_LIMIT:=1001}" # decrease to reduce latency, too low values will limit throughput
CODEL_FLOWS="${CODEL_FLOWS:=1024}"

# set burst as high as possible without causing dropped packets at the start of the connections
DOWNLINK_BURST="${DOWNLINK_BURST:=6500}"
UPLINK_BURST="${UPLINK_BURST:=6500}"

TBF_LATENCY="${TBF_LATENCY:=14ms}" # set to lower latency to improve control over bandwidth limiting, UPLINK_BURST bytes must be able to be sent in this time

IFB="$DEV.ingress"

INITCWND="${INITCWND:=20}"
INITRWND="${INITRWND:=20}"

configure_shaping()
{
    # EGRESS (outgoing traffic, "uploads"):

    # setup bandwidth limiting:
    tc qdisc add dev "$DEV" root handle 1: tbf rate "$UPLINK_RATE" burst "$UPLINK_BURST" latency "$TBF_LATENCY"

    # setup fq_codel for bandwidth shaping
    tc qdisc add dev "$DEV" parent 1: fq_codel limit "$CODEL_LIMIT" target "$CODEL_TARGET" interval "$CODEL_INTERVAL" flows "$CODEL_FLOWS" noecn


    # INGRESS (incoming traffic, "downloads"):

    # setup bandwidth limiting (ingress limiting needs IFB or Intermediate Functional Block, see https://wiki.linuxfoundation.org/networking/ifb):
    tc qdisc add dev "$DEV" handle ffff: ingress
    ip link add name "$IFB" type ifb
    tc qdisc add dev "$IFB" root handle 1: tbf rate "$DOWNLINK_RATE" burst "$DOWNLINK_BURST" latency "$TBF_LATENCY"

    # setup fq_codel for bandwidth shaping
    tc qdisc add dev "$IFB" parent 1: fq_codel limit "$CODEL_LIMIT" target "$CODEL_TARGET" interval "$CODEL_INTERVAL" flows "$CODEL_FLOWS" ecn
    ip link set dev "$IFB" up

    # connect ingress filtering to actual WAN device
    tc filter add dev "$DEV" parent ffff: protocol all prio 10 u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev "$IFB"

    # configure initcwnd and initrwnd
    ip route change $(ip route | grep ^default) initcwnd "$INITCWND" initrwnd "$INITRWND"
}

remove_shaping()
{
    tc qdisc list | grep -q "ingress" && tc qdisc del dev "$DEV" ingress || true
    tc qdisc list | grep -q "codel" && tc qdisc del dev "$DEV" root || true
    ip link show | grep -q "$IFB" && ip link del "$IFB" || true
}

status()
{
        echo "─── queue discipline configuration: ──────────────────"
        tc qdisc list
        echo "   TIP: use e.g. 'sudo tc qdisc del dev $DEV ingress' to remove ingress filtering"
        echo "   TIP: use e.g. 'sudo tc qdisc del dev $DEV root' to remove egress filtering"
        echo "─── ip link show: ────────────────────────────────────"
        ip link show
        echo "   TIP: use e.g. 'sudo ip link del $IFB' to remove ingress device"
}

color_status()
{
    status | grep --color=auto -E "^|$DEV|$IFB|rate [^ ]+"
}

# handle parameters

ACTION=""
shift || true

while [ ! -z "" ]
do
    case "" in
        -v|--verbose)
            echo "Device: $DEV"
            echo "Downlink rate (ingress): $DOWNLINK_RATE"
            echo "Uplink rate (egress): $UPLINK_RATE"
            set -x
            ;;
        *)
            if [ ! -z "" ]; then
                echo "Unknown parameter: ''" 1>&2
                exit 1
            fi
            ;;
    esac
    shift
done

case "$ACTION" in
    start)
        remove_shaping
        configure_shaping
        ;;
    stop)
        remove_shaping
        ;;
    status)
        color_status
        ;;
    restart)
        remove_shaping
        configure_shaping
        ;;
    *)
        echo "Unknown action: " 1>&2
        echo "Usage: 
DOWNLINK_RATE=5.0Mbit UPLINK_RATE=5.0Mbit TBF_LATENCY=500ms ./traffic-shaping start
<start|stop|restart|status> [--verbose|-v]" 1>&2 exit 1 esac


您只需将脚本另存为traffic-shapingchmod a+x并以root身份运行(在阅读了源代码之后)代码)。

对于您的用例,我建议

q4312078q

评论


另请参阅:bufferbloat.net/projects/codel/wiki/…

– Mikko Rantalainen
18年11月1日在14:13

请注意,您可能需要运行linux-lowlatency内核,以使系统保持处理所有软件包的任务。

– Mikko Rantalainen
18年11月18日在14:55

另请参阅:apenwarr.ca/log/20110110

– Mikko Rantalainen
19年1月5日在10:33

另请参阅:jfcarter.net/~jimc/documents/voip-qos-1609.html

– Mikko Rantalainen
19年1月5日,11:02