gpt4 book ai didi

delphi - 谁将 TCP 窗口大小设置为 0,Indy 还是 Windows?

转载 作者:可可西里 更新时间:2023-11-01 02:31:36 25 4
gpt4 key购买 nike

我们有一个应用程序服务器,观察到它在网络拥塞时(在客户端站点)有时发送 TCP 窗口大小为 0 的 header 。

我们想知道是 Indy 还是底层 Windows 层负责将 TCP 窗口大小从标称的 64K 向下调整以适应可用吞吐量。
我们将能够在它变为 0 时采取行动(没有发送任何内容,用户等待 => 不好)。

因此,欢迎任何指向 Indy 代码的信息、链接和指针...

免责声明:我不是网络专家。请保持普通人可以理解的答案;-)
注意:它是 Windows Server 2003 SP2 上的 Indy9/D2007。

更多细节:
TCP 零窗口情况发生在与数据库服务器通信的中间层。
它发生在最终用户提示客户端应用程序变慢的同一时刻(这就是触发网络调查的原因)。
已确定导致瓶颈的 2 个主要网络问题。
TCP 零窗口发生在网络拥塞时,但可能是也可能不是由它引起的。
我们想知道这种情况何时发生,并想办法在我们的代码中做一些事情(至少记录日志)。

那么核心问题是谁将窗口大小设置为0,在哪里?
在哪里 Hook (在 Indy 中?)以了解该情况何时发生?

最佳答案

TCP header 中的窗口大小通常由 TCP 堆栈软件设置以反射(reflect)可用缓冲区空间的大小。如果您的服务器正在发送窗口设置为零的数据包,这可能是因为客户端发送数据的速度快于服务器上运行的应用程序读取数据的速度,并且与 TCP 连接关联的缓冲区现在已满。

如果客户端发送数据的速度比服务器读取数据的速度快,这对于 TCP 协议(protocol)来说是完全正常的操作。在服务器发送非零窗口大小之前,客户端应避免发送数据(没有意义,因为它无论如何都会被丢弃)。

这可能反射(reflect)也可能不反射(reflect)客户端和服务器之间的严重问题,但如果情况持续存在,则可能意味着服务器上运行的应用程序已停止读取接收到的数据(一旦开始读取,这会为 TCP 释放缓冲区空间,并且 TCP 堆栈将发送一个新的非零窗口大小)。

关于delphi - 谁将 TCP 窗口大小设置为 0,Indy 还是 Windows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com