【问题标题】:UDP vs. TCP in case of physical loss of connectionUDP 与 TCP 在物理连接丢失的情况下
【发布时间】:2015-04-24 10:54:56
【问题描述】:

我目前正在完成我的计算机科学学士论文的一个项目,我需要可靠的通信来将数据从读取传感器值的几台微型计算机传输到另一台将值存储在数据库中的计算机。问题是它将部署在相当恶劣的环境中,并且物理连接丢失的可能性很大。

我已经搜索了一段时间关于 UDP 和 TCP 的差异,但大多数文章和论坛都在讨论丢包和其他方面的实际可靠性,而不是在这种情况下可能出现的重新连接.

大多数情况下,对于这个项目来说,TCP 似乎是正确的方式,因为这是一个关于可靠通信的问题,但我一直在考虑在 TCP 和 UDP 中绑定连接的步骤,我更喜欢 UDP,但随后有一个像 DCCP 这样的协议使用确认来确保没有数据包丢失。

如果可能的话,我非常感谢一些输入和可靠的参考。

【问题讨论】:

    标签: networking tcp udp communication


    【解决方案1】:

    这真的取决于 数据 的重要性。如果您不关心中断期间所有信息包的丢失,请使用 UDP。你的生活会更轻松,因为你可以创建一个连接(对于 UDP,这实际上只是意味着记住目的地,而不是每次都指定它)并在世界上无忧无虑地爆炸。

    但是,如果所有数据都到达数据库很重要,则使用 TCP 并调整发送机器上系统的重试计时器,使其比任何实际的网络中断都长。系统会很高兴地继续重试,直到物理连接返回,此时它将迅速传递所有返回数据。

    来自https://drupal.star.bnl.gov/STAR/blog-entry/jeromel/2009/feb/18/tcp-parameters-linux-kernel ...

    tcp_retries1 - INTEGER 在决定之前重试多少次 出了点问题,有必要将此怀疑报告给 网络层。最小 RFC 值为 3,它是默认值,即 对应于 ~3sec-8min,具体取决于 RTO。

    tcp_retries2 - INTEGER 在活着杀死之前重试多少次 TCP 连接。 RFC1122 说限制应该大于 100 秒。这个数字太小了。默认值 15 对应 ~13-30 分钟,具体取决于 RTO。

    将这些设置为数百或数千将有效地永远重试。我没有看到“最大重试间隔”,但这并不重要。

    You can do the same on Windows 但是如果数据以单向方式流动,您实际上并不。为什么?因为如果没有数据要发送,那么就没有数据丢失和重试,因此无法检测到连接已被中断,因此永远不会被视为“中断”。只要保持活动被禁用,无论如何,您当然不想为此用例启用它。

    如果由于某种原因您无法执行此操作(例如,有限的机器控制,那么您将不得不通过 UDP 实现自己的协议,该协议发送确认并在不放弃的情况下重试。有“@ 987654323@" 可以做到这一点,但如果你能让该解决方案发挥作用,它就不如真正的 TCP。

    【讨论】:

      【解决方案2】:

      如果数据很重要,我肯定会使用 TCP! 但最重要的是,我还将为应用程序构建一个函数,以确定与服务器的连接性,并且仅在服务器可访问时发送信息。 这也意味着确保缓冲在没有连接时收集的数据。

      这将确保您不会丢失数据,无论是否是物理 och 逻辑连接问题。

      【讨论】:

        【解决方案3】:

        我的建议是不要直接使用原始 TCP 或 UDP(TCP/IP 套接字编程)。选择一个可靠的通信框架,它将处理所有不可靠的连接丢失问题。例如,如果是在 Windows 平台上,您可以选择 WCF。 HTH。

        【讨论】:

        • 谢谢,实际上这是从 Linux 到 Windows 的通信,但我会研究他们使用的协议,看看是否能找到更多。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2019-03-15
        • 2021-09-12
        相关资源
        最近更新 更多