代码之家  ›  专栏  ›  技术社区  ›  Francesca

谁将TCP窗口大小设置为0、indy或window s?

  •  6
  • Francesca  · 技术社区  · 15 年前

    我们有一个应用服务器,在网络拥塞时(在客户端站点),它会发送TCP窗口大小为0的头文件。

    我们想知道是indy还是底层windows层负责根据可用吞吐量将tcp窗口大小从名义64K下调。
    我们将能够在它变为0时采取行动(不发送任何内容,用户等待=>不好)。

    所以,任何信息,链接,指向indy代码的指针都是受欢迎的…

    免责声明:我不是网络专家。请让普通人理解答案;—)
    注意:它是Windows Server 2003 SP2上的indy9/d2007。

    更多血腥细节:
    TCP零窗口案例发生在与DB服务器对话的中间层上。
    当最终用户抱怨客户机应用程序的速度慢时(这就是触发网络调查的原因),就会发生这种情况。
    已确定造成瓶颈的两个主要网络问题。
    TCP零窗口发生在网络拥塞时,但可能或可能不是由它引起的。
    我们想知道什么时候会发生这种情况,并有一种方法在我们的代码中做一些事情(至少记录日志)。

    所以核心问题是谁将窗口大小设置为0,在哪里?
    钩在哪里(在印地?)知道什么时候会出现这种情况?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Stephen C. Steel    15 年前

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

    如果客户端发送数据的速度比服务器读取数据的速度快,这对于TCP协议来说是完全正常的操作。客户机应该避免发送数据,直到服务器发送一个非零窗口大小(没有点,因为它将被丢弃)。

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

        2
  •  2
  •   wallyk    15 年前

    窗口大小为零的TCP头表示接收器的缓冲区已满。对于一个速度比读者快的作家来说,这是一个正常的情况。

    在阅读你的描述时,还不清楚这是否出乎意料。是什么导致您打开了协议分析器?

        3
  •  2
  •   filofel    15 年前

    因为您可能对解决您的问题也感兴趣:

    如果您对服务器端运行的内容有一些控制(发送0窗口大小消息的那一个): 您是否考虑将setsockopt()与so-rcvbuf一起使用以显著增加套接字的接收缓冲区的大小?

    在indy中,setsockopt()是tidsockethandle的一种方法。 您应该将它应用到与您的套接字关联的所有tidsockethandle对象。 在Indy9中,它们通过TidtcpServer中的属性绑定定位。

    我建议首先将getsockopt()与so rcvbuf一起使用,以查看OS为您提供的默认缓冲区大小。然后显著增加这一点,可能是通过连续的试验,每次增加一倍的大小。 您可能还需要重新运行getsockopt()调用 之后 您的setsockopt()以确保实际执行了setsockopt:通常有一个上限,socket实现将其设置为缓冲区大小。在这种情况下,通常有一种依赖于操作系统的方法来向上移动这个上限值。但这些情况相当极端,你不太可能需要这些。

    如果在溢出端没有对源代码的控制,只需检查运行在那里的软件是否公开了一些参数来更改缓冲区大小。

    祝你好运!

    推荐文章