我正在调查应用程序(基于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个被修剪的数据包之一。
问题(S)如下:
尝试调优tcp_rmem是否有意义?我是否应该期望一个经过良好调整的服务器/网络删除数据包为0?
发布于 2019-10-17 15:08:28
这个问题不太可能需要在系统级别而不是应用程序级别上解决。如果在TCP中丢失了什么,它就会受到对等方的不满--这就是TCP的设计方式。
更有可能的是,对于TCP在Java应用程序中的工作方式存在错误的假设。例如,将TCP视为基于消息的协议而不是字节流,并假设单个读取将接收刚才发送的所有数据,这是常见的错误。由于这不能保证这将导致Java应用程序有时只读取消息的一部分,即使其馀部分最终可供应用程序读取。
https://serverfault.com/questions/988403
复制相似问题