【问题标题】:Tomcat Seems to send only 64k to a socket, then waits for ack before sending next 64k chunk of dataTomcat 似乎只向套接字发送 64k,然后在发送下一个 64k 数据块之前等待 ack
【发布时间】:2014-10-04 23:33:37
【问题描述】:

我们在传输大文件时观察到以下行为。服务器发送 64k 的 tcp 数据,最大段大小(mss=1469,所以 44*1460 字节,加上 1*1296 字节),没有任何延迟。所以服务器端的 Nagle 没有问题。当最后一个数据包被发送时,它设置了 Push 标志,这向我表明发送缓冲区已清空。

然后在收到来自客户端的最终 ACK 之前会有 200 毫秒的不必要延迟。显然这是因为客户端使用了 tcp 延迟确认(我无法影响的行为)并且我们的段数不相等。

据我了解,如果 tomcat 会不断发送数据,我们会避免在每 64k tcp 数据后出现 200ms 的延迟。

问题:

  1. tomcat 只发送 64k 的预期行为,然后在发送更多数据之前等待最终确认?

  2. 是否有任何方法可以调整 tomcat 的行为,使其更连续地发送数据(不会在每个 64k 数据块之后耗尽 sendbuffer)?

【问题讨论】:

标签: performance sockets tomcat tcp send


【解决方案1】:

tomcat 只发送 64k 的预期行为,然后在发送更多数据之前等待最终确认?

没有。 Tomcat 和任何其他 Java 应用程序都不能“等待最终的 ACK”。你根本看不到他们。 Tomcat 只是写入一个套接字输出流。

是否有任何方法可以调整 tomcat 的行为以使其更连续地发送数据(在每个 64k 数据块之后不会耗尽发送缓冲区)?

这首先不是 Tomcat 的行为。这种行为几乎可以肯定是由于 TCP。

【讨论】:

  • 好的,让我说得更准确一些。我很清楚,只有 TCP 堆栈才能看到 ACK。然而,Tomcat 似乎以某种方式等待来自堆栈的“信号”。这对我来说是未知的 - 正如你所说,我希望应用程序(tomcat)只是写入套接字输出流。
  • 我唯一能想到的另一件事是,tomcat 正在向套接字写入 64k 数据,但是在继续发送下一个 64k 数据之前等待太久。
  • 因为我发现关于套接字输出行为的文档不多 - 这里的预期行为如何?正如我所说,服务器正在发送设置了推送位的 64k 块的最后一个数据包,这向我表明发送缓冲区运行为空。那么从 TCP 栈来看,应该没有什么东西可以阻止 tomcat 发送更多的数据?
  • 解决我们面临的问题的一种解决方法是调整 MSS,使每个 64k 数据块以偶数个数据包发送。
  • 当前:MSS=1460,所以 44x1460 + 1296 = 45 个数据包
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多