我目前正在攻读计算机科学学士论文,我需要一个可靠的通信,用于从读取传感器值的几台微型计算机到另一台将数值存储在数据库中的计算机进行数据传输。问题是它将在非常恶劣的环境中部署,并且物理上失去连接的可能性很大。
我已经搜索了一段时间关于UDP和TCP的差异但是大多数文章和论坛都讨论了丢包和其他方面的实际可靠性,但没有讨论在这种情况下可能出现的重新连接。
大多数情况下,TCP似乎是这个项目的正确方法,因为它是一个关于可靠通信的问题,但我一直在考虑在TCP和UDP中绑定连接的步骤,在那里我更喜欢UDP但是我有一个像DCCP这样的协议使用确认来确保没有数据包丢失。
如果可能的话,我会非常感谢一些输入和可靠的参考。
答案 0 :(得分:0)
这实际上取决于数据的重要性。如果您不关心在停机期间丢失所有信息包,请转到UDP。你的生活会更容易,因为你可以创建一个连接(对于UDP,这实际上只是意味着记住目的地,而不是每次都指定它)并在世界范围内毫无关心地冲走。
但是,如果 重要,所有数据都到达数据库,那么请转发TCP并调整发送计算机上系统的重试计时器,使其比任何实际的网络中断都要长。系统将很乐意继续进行重试,直到物理连接返回,此时它将以乱七八糟的方式传递所有后向数据。
来自https://drupal.star.bnl.gov/STAR/blog-entry/jeromel/2009/feb/18/tcp-parameters-linux-kernel ...
tcp_retries1 - INTEGER在决定之前重试多少次 有些事情是错误的,有必要报告这个问题 网络层。最小RFC值为3,默认为 对应于〜3秒-8分钟,具体取决于RTO。
tcp_retries2 - INTEGER如何在杀死之前重试 TCP连接。 RFC1122表示限制应该超过100 秒。这个数字太小了。默认值15对应于 ~13-30分钟,取决于RTO。
将这些设置为数百或数千将有效地永远重试。我没有看到"最大重试间隔"但它并不重要。
You can do the same on Windows 但如果数据一直流动,您实际上 。为什么?因为如果没有数据要发送,那么就没有数据丢失和重试,因此无法检测到连接是否被中断,因此它永远不会被认为是“#34;破坏”#34; 。只要保持活动被禁用,无论如何,你肯定不想为这个用例启用它。
如果由于某种原因你无法做到这一点(例如,有限的机器控制,那么你必须通过UDP实现自己的协议,发送确认并重试而不放弃。有代码" pseudo tcp"可以做到这一点,但如果你能让这个解决方案发挥作用,它就不会像真正的TCP一样好。
答案 1 :(得分:0)
如果数据很重要,我肯定会使用TCP! 但除此之外,我还将为应用程序构建一个函数,以确定与服务器的连接,并仅在服务器可访问时发送信息。 这也意味着确保缓冲在没有连接时收集的数据。
这将确保您不会丢失数据,无论它是否是物理连接问题。
答案 2 :(得分:-2)
我的建议是不要直接使用原始TCP或UDP(TCP / IP套接字编程)。选择一个可靠的通信框架,它将处理下面的所有不可靠的连接丢失问题。例如,如果它在Windows平台上,您可以选择WCF。 HTH。