TCP RWIN 是由应用程序还是操作系统设置的?

TCP RWIN 是由应用程序还是操作系统设置的?

我遇到过这样一种情况:应用程序正在侦听 TCP 端口,并且每隔一段时间,如 tcp 转储中所示,其接收窗口 (RWIN) 就会设置为零。发生这种情况时,其 Recv-Q 会停止移动(因为发送方停止发送),并且侦听连接/端口的应用程序线程会挂起。在 WireShark 中,我看到产生了“ZeroWindow”状态,当 RWIN 设置为 0(窗口大小为 0)时就会发生这种情况。

我试图确定我的应用程序是否手动设置了连接的 RWIN = 0,该应用程序使用了许多充满神秘代码的开源库,或者这是否发生在操作系统层。如果是应用程序,我可以访问所有源代码,经过一番努力就可以正确调试它。

但如果操作系统说“嘿,这个连接有问题,将 RWIN 设置为 0......“那么我不知道如何进行诊断。有什么想法吗?提前谢谢您!

答案1

接收窗口由操作系统计算/设置。Linux 可以使用net.core.rmem_maxsysctl 设置更改可用于接收 TCP 数据包的内存。

关于 TCP 性能调优有很多页面,例如这个:

http://fasterdata.es.net/host-tuning/linux/

唉,这很可能不会对您有帮助,因为它只会增加缓冲的数据量。

如果缓冲区已满,则窗口大小设置为 0。您必须查看应用程序,了解它为何不从 TCP 缓冲区收集数据。日志文件,以调试模式启动它,等等。在操作系统级别您对此无能为力。

答案2

这确实要视情况而定。您没有指定您谈论的是什么操作系统,但在 Windows 下(我想 Linux 也一样),TCP 窗口大小通常由 TCP 堆栈处理。

但是,某些非操作系统组件也完全有可能影响这一点。例如: - 应用程序可以通过为套接字 (SO_RCVBUF) 指定非默认缓冲区大小来影响 TCP 堆栈的行为。 - 应用程序可以使用原始套接字并在用户模式下重新实现 TCP(不确定您为什么要这样做,但这是可能的)。

最后,您应该知道,窗口大小为 0 实际上是一种正常情况:它表示其中一方已经拥有完整的数据缓冲区,并且需要更多时间来处理它。

相关内容