【问题标题】:When does a Java socket send an ack?Java 套接字何时发送 ack?
【发布时间】:2011-01-11 12:04:48
【问题描述】:

我的问题是,当接收方的套接字发送 ack 时?是在应用读取socket数据的时候,还是底层获取数据并放入buffer的时候?

我想要这个,因为我希望双方应用程序都知道对方是否收到了数据包。

【问题讨论】:

  • 这不是 Java 问题。这完全是一个 TCP/IP 问题。 TCP/IP 协议与 Java 无关。随意从这个问题中删除“Java”。
  • 请阅读“否”答案和我对他的评论,以了解为什么这是一个 java 问题。
  • 您是如何在应用程序级别解决这个问题的?(在 JAVA 中?)

标签: tcp sockets


【解决方案1】:

发生这种情况时取决于操作系统 TCP 堆栈,因为 TCP 向应用程序提供了一个流,因此执行读/写的应用程序与通过网络发送的数据包和 TCP 确认之间没有保证的 1:1 相关性。

如果您需要确保对方已经接收/处理了您的数据,您需要将其构建到您的应用协议中 - 例如发送回复,说明已收到数据。

【讨论】:

  • 但这是java,它应该给我所有操作系统的统一视图!
  • 确实如此。它只是不公开 TCP 确认。原生套接字 API 也没有。
  • 但它应该在发送 ack 时告诉我,以帮助我保持数据完整性。
  • 它不会对数据完整性产生任何影响,因为一端无法判断另一端是否接收到 ACK。此外,通知到应用程序级别的内容完全超出了 Java 的控制范围。
【解决方案2】:

TCP ACK 用于确认传输层而不是应用层上的 TCP 数据包。只有您的应用程序可以明确表示它也处理了缓冲区中的数据。

【讨论】:

    【解决方案3】:

    TCP/IP(以及 java 套接字)将保证您要么成功发送数据,要么最终得到一个错误(java 的例外情况)。

    【讨论】:

    • 但是什么时候发送数据完成?当对方应用程序读取它或底层将数据放入应用程序缓冲区时?
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2015-07-04
    • 2022-12-10
    • 1970-01-01
    • 2016-04-28
    • 2021-11-19
    • 2013-06-18
    • 2015-07-24
    相关资源
    最近更新 更多