【问题标题】:How to send a ACK packet in Solaris10Solaris10如何发送ACK包
【发布时间】:2012-08-04 14:42:12
【问题描述】:

对于 tcp 连接,在 Solaris 10 中,有没有办法在没有其他数据(只有 ack 数据包)的情况下向另一端发送 ACK 数据包。

我知道我们可以通过 TCP Keep alive 选项做到这一点,但它在 Solaris 10 中受支持。

【问题讨论】:

  • 你的意思是来自应用程序,还是仅仅指TCP栈的操作?
  • 其实我是想检测tcp断线。因为 Solaris 10 不支持 Tcp keep alive 选项,所以我想找到另一种方法;也许像get_socket_status这样的函数(不是系统调用)会发送一个ack包并返回连接状态。
  • 那无济于事。保持活动 ACK 之所以有效,是因为它用于“错误”的序列号,因此它会使用正确的当前 seqno 引发回复。根据我的回答,没有任何 API 只会发送 ACK。除了读写之外,没有任何 API 可以检测到断开连接。

标签: sockets tcp solaris


【解决方案1】:

检测断开连接的可靠方法是在您的应用程序级协议中构建一个 null / ping / echo 类型的消息,并让您的应用程序定期发送这些消息。如果它没有得到及时的回答,它可以假设连接已被丢弃。大多数旨在涉及长期连接的协议都包含这样的消息(例如,IRC、IMAP 和 SSH 都包含这样的消息)。

(毕竟,即使您可以发送纯 TCP ACK 消息,另一端也不必响应它们,因为它自己没有收到更多数据 ACK)。

【讨论】:

  • 你最后的说法是可疑的。 TCP/IP keepalive 机制是基于另一端回复无数据 ack 数据包。
  • @jlliagre:It appears that 这样的响应实际上是可选的。许多 TCP 发送带有一个字节重复有效负载的 keepalive,这确实需要响应。
  • 您发布的链接并没有说响应是可选的。相反,不回复被认为是一个错误。此外,该错误已在 13 年前修复,并且指的是需要该字节的重复有效负载的“一些较旧的实现”。 RFC 1122 声明它们是伪造的。您确定仍有需要它的有效 TCP/IP 实现吗?
  • @jlliagre:它说:“RFC 1122 主机要求不需要对无序 ACK 的响应。他们说你可以响应。事实上 RFC 1127(关于主机要求 RFC)声明主机要求 RFC 对这个问题没有立场。” 所引用的旧实现是那些在其上提供重复有效负载字节的实现。自己的探针。
  • 查看当前的 Solaris tcp 代码后,您是对的。 Solaris 发送的 Keepalives 探测具有一个字节的重复有效负载。收到的 Keepalives 探测无论是否有该字节都会被确认。似乎大多数实现不遵循 RFC 1122 建议,即不发送该字节数据,而是更喜欢替代方式。 RFC1122 规定:一个实现应该发送一个没有数据的保活段;但是,为了与错误的 TCP 实现兼容,它可以配置为发送包含一个垃圾八位字节的 keep-alive 段。
【解决方案2】:

如果您只是在接收,TCP 堆栈将自行发送大量没有数据的 ACK。但是,无法从应用程序发送任何类型的 ACK。

【讨论】:

  • 但是,请注意,使用 Solaris 11 Express,应用程序可以通过 TCP/IP 层发送这些 ACK。
  • 嗯?您不能停止 TCP/IP 层发送 ACK。你这里指的是 TCP keepalive 吗?
  • 确实如此。毕竟,这就是问题所在,而不是常规的确认。
  • 你的意思是说有一种方法可以在 Solaris 11 中启用 TCP keepalive,对吧?
【解决方案3】:

你第一次发布声明 Solaris 10 支持 TCP 保持活动,后来它不支持...

Solaris 支持使用 ndd 命令全局设置 tcp keepalive,例如:

ndd -set /dev/tcp tcp_keepalive_interval 120000

OpenSolaris 和 Solaris 11 Express 支持每个套接字的 keepalive 设置。 您可以使用 SO_KEEPALIVE 启用它,并使用 TCP_KEEPALIVE_THRESHOLD 和 TCP_KEEPALIVE_ABORT_THRESHOLD 对其进行调整。

http://docs.oracle.com/cd/E19082-01/819-2254/6n4iaov75/index.html

【讨论】:

    猜你喜欢
    • 2020-08-01
    • 2016-05-15
    • 2016-08-20
    • 2016-02-17
    • 2021-01-13
    • 1970-01-01
    • 2011-01-11
    • 2021-11-20
    • 2018-06-13
    相关资源
    最近更新 更多