我有一种情况,应用程序正在监听一个TCP端口,每隔一段时间,就像在tcp转储中看到的那样,将其接收窗口(RWIN)设置为零。 发生这种情况时,它的Recv-Q停止移动(因为发送者停止发送)并且在连接/端口上侦听的应用程序线程只是挂起。 在WireShark中,我看到“零窗口”状态正在产生,当RWIN设置为0(一个窗口大小为0)时发生。
我试图确定我的应用程序是否使用了许多充满神秘代码的开源库,手动设置连接的RWIN = 0,或者如果这发生在操作系统层。 如果它的应用程序,我有权访问所有的源代码和一些辛苦的工作,可以正确地debugging它。
但是如果操作系统上写着“ 嗨,这个连接有什么问题,把RWIN设置为0 ”,那么我就不知道如何进行诊断了。 有什么想法吗? 提前致谢!
接收窗口由OS计算/设置。 Linux可以使用net.core.rmem_max sysctl设置更改可用于接收TCP数据包的内存。
TCP性能调整有很多页面,例如:
http://fasterdata.es.net/host-tuning/linux/
唉这很可能不会帮助你,因为它只是增加了缓冲的数据量。
如果缓冲区已满,则窗口大小设置为0.您必须查看应用程序,以了解为什么它不从TCP缓冲区收集数据。 日志文件,以debugging模式启动,等等。在操作系统级别上你可以做的不多。
这真的取决于。 你没有指定你在说什么操作系统,但是在Windows(也是Linux)下,TCP窗口大小通常由TCP堆栈来处理。
但是,一些非操作系统组件也可能影响到这一点。 例如: – 应用程序可以通过指定套接字的非默认缓冲区大小(SO_RCVBUF)来影响TCP堆栈的行为。 – 一个应用程序可以在用户模式下使用原始套接字和重新实现TCP(不知道为什么你想这样做,但这是可能的)。
最后,你应该知道获得一个0的窗口大小实际上是一个正常的情况:它表明一方已经有一个完整的数据缓冲区,并且需要更多的时间来处理它。