【问题标题】:read the content of send-q TCP socket in linux在linux中读取send-q TCP socket的内容
【发布时间】:2023-03-18 03:36:01
【问题描述】:

我有一个 TCP 客户端连续向服务器发送数据。客户端与服务器连接成功后,客户端每隔几秒就连续发送数据。

当客户端和服务器之间的链接在发送少量数据后断开时,我知道 TCP 根据 TCP_retries2 中的值重新传输数据,我将此值配置为 8 ,这样我在 100 后出现写入错误秒。 但是 send-q 中会有一些未确认的数据包。

在关闭这个套接字之前,有没有办法在我的程序中的 send-q 中读取这个未确认数据包的内容,或者我应该记住发送数据并在再次连接后重新发送它?还有其他方法可以实现吗?

【问题讨论】:

    标签: linux sockets tcp


    【解决方案1】:

    您可以使用 ioctl 获取 sendq 的大小:

    SIOCOUTQ
              Returns the amount of unsent data in the socket send queue.
              The socket must not be in LISTEN state, otherwise an error
              (EINVAL) is returned.  SIOCOUTQ is defined in
              <linux/sockios.h>.  Alternatively, you can use the synonymous
              TIOCOUTQ, defined in <sys/ioctl.h>.
    

    请注意,sendq 只告诉您远程系统的内核接受了什么,它不保证在该主机上运行的应用程序处理了它。大多数故障存在于通信双方之间的网络中,但该指标不能用于确定传输成功的证据。

    【讨论】:

    • 假设有 200 个字节排队等待发送,SIOCOUTQ 返回 100,我能否确定它是前 100 个字节被确认,或者可能是最后 100 个字节,而第一个丢失了在路由中?
    • TCP 是一种流协议,因此只有在接收到该字节之前的所有内容时才能确认字节,所以是的,您可以确定它是前 100 个字节。 (有一个名为 SACK 的 TCP 扩展,它承认接收到任意数据块,但这不会改变 tcp 结构的 snd_una 值,所以即使使用了 SACK,我写的内容也应该是正确的。)
    【解决方案2】:

    没有。

    如果您需要知道对等应用程序已收到数据,您需要让对等应用程序通过您的应用程序协议将其确认回您的应用程序,并将任何未确认的数据视为需要以某种方式从您的应用程序重新发送。这也带来了事务幂等性的问题,让你可以重发而不受惩罚。

    【讨论】:

      【解决方案3】:

      探戈需要两个人。您可以关闭连接的一端,它也会等待连接的另一端断开。反过来想一想 3 次握手。

      在关闭连接和重新打开连接之间等待多长时间?在尝试使用相同的连接信息重新连接之前,您必须至少等待 TIME_WAIT。

      【讨论】:

      • TCP 等待另一端断开连接,但您的应用程序不会等待。 close() 函数是异步的。如果您在客户端重用相同的本地端口,您只需要等待 TIME_WAIT,并且没有理由对出站端口号执行其他 Han bozo 防火墙规则,应该将其删除,因为它们完全没有任何作用并使应用程序无法实现.而你实际上并没有回答这个问题。
      【解决方案4】:

      一旦应用程序将其数据提供给 TCP,TCP 就有责任跟踪数据包的确认。如果没有收到 ACK,它会尽最大努力根据 RTO 算法传递数据包。现在直到收到 ACK,数据都保存在 TCP_SEND_Q 中。我认为应用程序没有任何控制来确定 TCP_SEND_Q 的当前状态。

      //我应该记住发送数据并在再次连接后重新发送//

      你是怎么做到的?之前的连接状态没有了,不是吗?在客户端和服务器应用程序对离线接收和发送的内容保持一些了解之前,您必须重新开始新的连接。

      【讨论】:

      • 感谢您的回答。目前我没有任何应用程序级别的确认。我想在我从客户端收到重传超时错误之前发送我发送的所有数据 100 秒。我必须考虑应用程序级别的确认。
      猜你喜欢
      • 2017-05-09
      • 2015-01-13
      • 2016-08-25
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2016-07-27
      相关资源
      最近更新 更多