|
|
1
6
TCP头中的窗口大小通常由TCP堆栈软件设置,以反映可用缓冲空间的大小。如果服务器正在发送窗口设置为零的数据包,可能是因为客户端发送数据的速度比服务器上运行的应用程序读取数据的速度快,并且与TCP连接关联的缓冲区现在已满。 如果客户端发送数据的速度比服务器读取数据的速度快,这对于TCP协议来说是完全正常的操作。客户机应该避免发送数据,直到服务器发送一个非零窗口大小(没有点,因为它将被丢弃)。 这可能反映出客户机和服务器之间的严重问题,也可能不反映,但如果问题仍然存在,则可能意味着服务器上运行的应用程序已停止读取接收的数据(一旦开始读取,这将为TCP释放缓冲区空间,并且TCP堆栈将发送一个新的非零窗口大小)。 |
|
|
2
2
窗口大小为零的TCP头表示接收器的缓冲区已满。对于一个速度比读者快的作家来说,这是一个正常的情况。 在阅读你的描述时,还不清楚这是否出乎意料。是什么导致您打开了协议分析器? |
|
|
3
2
因为您可能对解决您的问题也感兴趣: 如果您对服务器端运行的内容有一些控制(发送0窗口大小消息的那一个): 您是否考虑将setsockopt()与so-rcvbuf一起使用以显著增加套接字的接收缓冲区的大小? 在indy中,setsockopt()是tidsockethandle的一种方法。 您应该将它应用到与您的套接字关联的所有tidsockethandle对象。 在Indy9中,它们通过TidtcpServer中的属性绑定定位。 我建议首先将getsockopt()与so rcvbuf一起使用,以查看OS为您提供的默认缓冲区大小。然后显著增加这一点,可能是通过连续的试验,每次增加一倍的大小。 您可能还需要重新运行getsockopt()调用 之后 您的setsockopt()以确保实际执行了setsockopt:通常有一个上限,socket实现将其设置为缓冲区大小。在这种情况下,通常有一种依赖于操作系统的方法来向上移动这个上限值。但这些情况相当极端,你不太可能需要这些。 如果在溢出端没有对源代码的控制,只需检查运行在那里的软件是否公开了一些参数来更改缓冲区大小。 祝你好运! |