delphi – 谁将TCP窗口大小设置为0,Indy或Windows?

我们有一个应用程序服务器,当网络拥塞时(在客户端的站点),已经观察到发送带有TCP窗口大小为0的标头.

我们想知道是否是Indy或底层Windows层负责根据标称64K调整TCP窗口大小以适应可用吞吐量.
并且我们将能够对其进行操作变为0(没有任何内容发送,用户等待=>没有好处).

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

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

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

所以核心问题是谁将窗口大小设置为0以及在哪里?
在哪里挂钩(在Indy?)以了解何时发生这种情况?

解决方法

TCP标头中的窗口大小由TCP堆栈软件正确设置,以反映可用缓冲区空间的大小.如果您的服务器正在发送窗口设置为零的数据包,则可能是因为客户端发送数据的速度比服务器上运行的应用程序正在读取数据的速度快,并且与TCP连接关联的缓冲区现已满.

如果客户端发送数据的速度快于服务器可以读取的速度,则这是TCP协议的完全正常操作.客户端应该避免发送数据,直到服务器发送非零窗口大小(没有任何意义,因为它无论如何都会被丢弃).

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

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...