TPC丢失段

TPC丢失段

我正在调查一个问题,应用程序(基于 Java)没有收到分成两个 TCP 段的整个消息。我有一个跟踪记录,证明两个段都已发送到服务器。

根据我的调查,我没有发现 NIC 上有任何丢失的数据包,但我注意到 netstat -s 上有以下情况:

16 packets pruned from receive queue because of socket buffer overrun
845 packets collapsed in receive queue due to low socket buffer

我假设丢失的 TCP 段可能是这 16 个修剪数据包中的一个。

这里的问题如下:

尝试调整 tcp_rmem 是否有意义?我是否应该期望经过良好调整的服务器/网络修剪数据包为 0?

答案1

这个问题不太可能需要在系统层面而不是应用层面解决。如果 TCP 中丢失了某些内容,则对等端会重新发送该内容 - 这就是 TCP 的设计方式。

更有可能的是,Java 应用程序中对 TCP 的工作方式存在错误假设。例如,将 TCP 视为基于消息的协议而不是字节流,并假设单次读取将接收刚刚发送的所有数据,这是一种常见错误。由于这不能保证,因此 Java 应用程序有时只读取部分消息,即使其余部分最终可供应用程序读取。

相关内容