【问题标题】:TCP retransmission Timeout Detection in C++ [duplicate]C ++中的TCP重传超时检测[重复]
【发布时间】:2011-11-24 07:34:34
【问题描述】:

可能重复:
C++ Functions According to TCP

在我的 Windows C++ 应用程序中,我使用的是 winsock API。

我想检测我的 C++ 函数中的网络错误。

使用wireshark可以看到出现网络错误后有TCP重传包。

您知道如何使用 C++ 函数检测 TCP 重传超时吗?

【问题讨论】:

  • 只是好奇——但是如果您检测到发生了 TCP 重传,您会怎么做呢?鉴于它将重新传输以减轻数据包丢失问题,您为什么要关心?一般来说,如果数据包丢失太大以至于连接无法通过任何字节,则在调用 send/recv 时只会收到错误或套接字关闭通知。
  • 这是一个要求 - 我需要知道执行一系列操作的重传超时指示。关于发送/接收 - 在wireshark中我可以看到在TCP重传超时发生后我得到了很长时间。
  • @EJP - 它不是重复的。我想知道 C++ 中重传超时的指示。你有答案吗?
  • 您可以随时使用UDP并自行实现重传。
  • 这对我来说确实是重复的。要么您收到来自send() 的错误,要么 TCP 什么也没告诉您并继续尝试。你看不到引擎盖下的东西。

标签: c++ networking tcp


【解决方案1】:

基本上没办法。 Sockets API 只是不给你这样的低级信息。您只能检测到完全的连接失败。

如果您想要的正是您所要求的,您必须捕获网络数据包并像在wireshark 中那样进行流量分析。否则,请说明您为什么要检测到这一点。可能是 tcp keepalive 或者 udp 就足够了。

【讨论】:

    【解决方案2】:

    如果连接中断,所有对recv(或WSARecv)的调用都将返回错误。 TCP 本身具有内置于协议中的数据包重传功能,因此在大多数情况下您实际上无需执行任何操作。

    如果两个对等点之间的电缆因某种原因损坏,那么接收时您不会收到错误消息。然后你必须实现你自己的超时。如果您的更高级别的协议使用请求-响应(即您发送请求而其他对等方返回响应),这很容易,如果在 X 秒内没有收到响应,则关闭连接并重新连接。

    编辑回应cmets:

    TCP 内置了这种重传,没有办法关闭它,或者在第一次超时后出错。解决此问题的一种方法是改用 UDP (SOCK_DGRAM) 套接字。这样做的问题是您必须自己处理所有事情,包括在没有响应时处理超时。

    【讨论】:

    • 在wireshark中我可以看到recv函数在TCP重传超时发生后返回错误超过一分钟。
    • @gln 实际的超时时间可能不同,但这就是 TCP 的工作方式。如果一个数据包在超时时间内没有得到回复,那么 TCP 会再次传输该数据包,如果仍然没有得到回复,则会在网络堆栈中向上传播该错误。
    • 在wireshark中我看到5个TCp retrasmissin数据包,然后是很多ARP数据包,在它们中间我收到recv错误。我不想要这个。我想在 retrasimssion 超时后立即知道。
    • @gln 那么你应该切换到UDP,它没有这个重传。它是 TCP 的一部分,无法关闭。当然,使用 UDP 也不会报错,但你必须自己跟踪超时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多