【问题标题】:Is TCP 100% reliable? [closed]TCP 100% 可靠吗? [关闭]
【发布时间】:2013-01-13 11:58:04
【问题描述】:

虽然 TCP 是一个可靠的协议,它提供了重传和确认机制,但我认为它不是 100% 可靠的,因为 send() 的成功返回并不能确保数据已经到达目标端点,只意味着数据是复制到内核缓冲区。

应用程序是否有任何机制可以知道数据是否已成功到达目的地?

一种可能的解决方案是在应用层中建立一些确认机制?

【问题讨论】:

  • 确实,如果您不能信任您平台的 TCP 实现,请在您的应用层中构建一个确认机制。
  • 那么,确认机制100%可靠吗?
  • 不可能使任何协议 100% 可靠。见Two Generals Problem
  • @Barmar 仅当可靠性需要是双向的。一个简单的确认就足以知道消息已被接收(猜测在这种特定情况下我们并不担心 MITM 攻击)。
  • @tucuxi:在这种情况下存在误报(您没有收到确认,但实际上收到了消息)。这是否足以算作 100% 的可靠性实际上取决于应用程序:通常只有一侧重新发送直到被确认是可以的,而这基本上就是 TCP 在幕后所做的以提供其保证。

标签: c linux tcp


【解决方案1】:

从某种意义上说,TCP 是可靠的,即发送的消息要么

  1. 在发送时被接收(相同的顺序,相同的内容);假设内置校验和不会发生故障,它可能会失败,因为它只有 16 位 OR
  2. 根本收不到

使用 TCP,接收到的消息绝不应该是乱序或丢失中间消息。

要区分情况 1 和 2,您应该实现确认机制。还可以确保比 CRC 更好的消息完整性的一个好主意是发回传入消息的 MD5 或其他哈希值。

【讨论】:

  • TCP 使用校验和,而不是 CRC。
  • @Barmar CRC 校验和!
  • CRC 不仅仅是一个校验和,它使用位移来防止重新排序,而校验和无法检测到。
  • @Barmar 确实,CRC16 等人使用它,但 CRC 实际上代表“循环冗余 校验和”。
  • 不,它代表Cyclic Redundancy Check
【解决方案2】:

您可以构建自己的应用程序,由接收者向发送者回复成功消息,如果没有收到成功消息,则根据需要重新发送。

在 Java 中,JMS 做这项工作,我相信应该有一些现有的库在 C 中做同样的事情。

【讨论】:

    【解决方案3】:

    当然TCP是可靠的协议,如果你想知道通过网络端口发送和接收的数据,使用wireshark软件捕获发送和接收的数据。通过wireshark你可以追踪到数据包。

    【讨论】:

    • 远程使用wireshark如何帮助应用程序知道它的传输是否被接收?!
    • 请看如何使用wireshark,你可以捕获离开你机器的数据包和进入你机器的数据包
    • 你没有抓住重点。当然,您可以使用wireshark 对流量进行“第三方”分析。你不能用它来告诉一个特定的应用程序是否已经收到了它自己的数据包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2011-03-15
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2014-02-18
    相关资源
    最近更新 更多