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

时间:2013-10-30 02:38:13

标签: java sockets networking tcp

保证我的意思是TCP的通常理解的特征是,如果数据包被损坏或丢失,那么它将不被确认并被重新发送。

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

我已经尝试过自己跟踪socket.close()方法了,但它很难,因为不仅有很多内部套接字实现,而且功能分解了几个带有模糊方法名称的路径。

3 个答案:

答案 0 :(得分:0)

  

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

TCP将重新传输,至少在其重试计时器或计数器到期之前,它将放弃并重置连接。

  

或者,在读回所有适当的ACK之前,发送方套接字是否等待而不是实际关闭?

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

答案 1 :(得分:0)

大多数资源管理都发生在JVM以下的操作系统级别。

在TCP协议的情况下,它完全由操作系统管理,发生的是

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中看到此管理代码 库,他们假设操作系统和JVM正确处理管理。

答案 2 :(得分:0)

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