繁体   English   中英

通过TCP套接字发送数据并立即关闭仍然可以确保我的数据到达吗?

[英]Will sending data through TCP socket and closing immediately still guarantee my data will arrive?

保证,我的意思是TCP的普遍理解的功能,即如果数据包损坏或丢失,它将不被确认并被重新发送。

考虑一下(在Java中)发送者发送一些数据并立即关闭套接字的情况。 如果该数据在途中丢失或损坏,接收者将永远无法获得它吗? 还是在读回所有适当的ACK之前,发送方套接字是否等待并且实际上没有关闭?

我已经尝试过自己追踪socket.close()方法,但是这样做很困难,因为不仅存在许多内部套接字实现,而且该功能还使用不明确的方法名称拆分了多个路径。

考虑一下(在Java中)发送者发送一些数据并立即关闭套接字的情况。 如果该数据在途中丢失或损坏,接收者将永远无法获得它吗?

TCP将至少在重试计时器或计数器到期之前重新传输,此后它将放弃并保持连接状态。

还是在读回所有适当的ACK之前,发送方套接字是否等待并且实际上没有关闭?

是。 这发生在TCP中,而不是Java中。

大多数资源管理发生在JVM以下的OS级别。

在TCP协议完全由OS管理的情况下,发生的情况是

Application tells JVM to send data on TCP Stream
JVM access OS functions to perform data send task.
OS manages TCP protocol.
data gets sent over the network.

数据会从JVM中复制到OS内存空间中,因此即使JVM中止,TCP合同也应得到适当处理。

如果JVM暂停或请求操作系统关闭套接字,则它应保持套接字打开,直到另一个端点确认所有数据已到达或另一个端点关闭。

由于JVM仅与操作系统接口,因此您不会在Java库中看到此管理代码,因此它们假定管理已由OS和JVM正确处理。

您应该使用Socket.shutdownOutput() ,然后等待关闭事件,就像远程主机关闭了连接一样。 此方法是shutdown() C套接字函数的包装,该函数接受一个参数来确定要关闭的网络流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM