首页 文章

在物理连接丢失的情况下UDP与TCP

提问于
浏览
0

我目前正在研究我的计算机科学学士论文,在这个项目中,我需要一个可靠的通信,用于从读取传感器值的几台微型计算机到另一台将数值存储在数据库中的计算机进行数据传输 . 问题是它将在非常恶劣的环境中部署,并且物理上失去连接的可能性很大 .

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

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

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

3 回答

  • 0

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

  • -2

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

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

  • 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-30min,具体取决于RTO .

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

    You can do the same on Windows but 如果数据一直流动,你实际上并不需要 . 为什么?因为如果没有要发送的数据,则没有数据丢失和重试,因此无法检测到连接是否已被中断,因此它想要为此用例启用它 .

    如果由于某种原因你无法做到这一点(例如,有限的机器控制,那么你将不得不通过UDP实现自己的协议,发送确认并重试而不放弃 . 有“pseudo tcp”代码可以这样做,但如果你可以使解决方案工作,它将不如真正的TCP .

相关问题