流量定位不准确怎么办

流量定位不准确怎么办,第1张

开启一波阿里云性能测试服务PTS[1],PTS已于2021年5月上线。

背景写这篇文章的原因是有一天一个客户找到我们,问我们不支持的接口是否总是报错:

一开始怀疑是发动机方面的问题。

通过本地调试,我们可以看到请求URL时客户端窗口被调整为大于2 ^ 32-1导致的异常。

然后借此机会看看这里的窗口大小是什么意思。

引入了流式传输和多路复用,并且可以通过流量控制来协调多个流。

流量控制的一些基本概念:

流量控制是为了连接,不是为了端到端,而是为了两端的每一跳;当有代理时,代理与两端之间的流量控制是基于WINDOW_UPDATE帧的,接收方可以通过流量控制来控制发送方的速度。流量控制可以应用于流和连接。对于连接和所有新打开的流,默认的流量控制窗口大小是65535,最大值是2 ^ 32-1。不能禁用流量控制。为了便于理解,首先,简单地列出帧的类型:

数据:在请求或响应中携带数据。HEADERS:用于创建新的流(请求或响应),包括相应的HeadersPRIORITY:用于配置流的优先级。RST流:强制结束一个流,只在一端取消流。它不适用于正常流程的结束。设置:H2建联PUSH_PROMISE的一些配置:服务器向客户端推送响应PING:向远端发送PING,远端必须返回这个PINGGOAWAY: WINDOW_UPDATE:更新流控窗口大小。延续:如果报头太大,很难携带单个报头帧,并通过该帧发送额外的报头。接下来,我们将关注与流控制相关的帧。主要是设置和WINDOW_UPDATE。连接建立后,对方的窗口大小会被设置框调整。然后在传输过程中,窗口大小会随着数据传输逐渐减小,直到收到对方发送的WINDOW_UPDATE帧,从而更新窗口大小。设置框主要包含以下内容:

settings _ header _ table _ size:H Pack(一种头压缩算法)头表最大长度,默认值为4096SETTINGS_ENABLE_PUSH:客户端发送给服务器的配置。如果设置为true,客户端将允许服务器推送响应。true settings _ max _ concurrent _ streams:可以同时打开的最大流数,通常指可以同时响应的请求数。默认设置_初始_窗口_大小是无限制的:流量控制的设置_初始_窗口_大小。默认值为65535SETTINGS_MAX_FRAME_SIZE:对等体可以接受的最大帧长度,默认值为16384 settings _ MAX _ header _ list _ SIZE:对等体可以接受的最大头列表长度。如上所述,每次发送一批数据帧时,窗口大小都会减小。请注意,流量控制仅适用于数据帧。

如前所述,流控制可以作用于流和连接。是如何实现的?连接的流量控制类似于上面stream的流量控制逻辑。每发送一个数据帧,连接和流的窗口都会减小,但不同的是WINDOW_UPDATE要么只作用于流,要么只作用于连接(streamid为0时作用于连接)。

定位问题然后回到开始的问题,我们用URL抛出一个异常:

从这里的代码可以看出,524288是当前的窗口大小,而delta是对方告知的WINDOW_UPDATE大小。通过分析发现,524288的值与默认值65535不同。然后继续查看该值是何时更改的:

发现在收到SETTINGS指令后初始化窗口大小时进行了修改,但与RFC 7540 [2]的描述相冲突(连接窗口大小只能在收到WINDOW_UPDATE后修改):

因此,我们得出结论,删除这一标记行代码后,请求可以正常执行。

不幸的是,它是在准备中修复的。

参考[1] PTS:

[2] RFC 7540:

/作者:风吹过

原始链接:

本文为阿里云原创内容,未经允许不得转载。

欢迎分享,转载请注明来源:聚客百科

原文地址: https://juke.outofmemory.cn/life/620258.html

()
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-07-06
下一篇 2022-07-06

发表评论

登录后才能评论

评论列表(0条)

保存