如何让udp协议变得可靠(AB的PLc如何建立UDP协议)

      最后更新:2023-07-05 21:15

      udp是面向无连接的,必须使用哪一个协议来提供传输的可靠性?

      使用应用层协议提供可靠性。TCP是传输控制协议,是一个可靠的面向连接的协议。它允许网络间两台主机之间无差错的信息传输。UDP 是用户数据报协议,它采用无连接的方式传输数据,也就是说发送端不关心发送的数据是否到达目标主机,数据是否出错等。收到数据的主机也不会告诉发送方是否收到了数据,它的可靠性由上层协议来保障。从结构上划分,物联网应用层包括以下三个部分:1、物联网中间件:物联网中间件是一种独立的系统软件或服务程序,中间件将各种可以公用的能力进行统一封装,提供给物联网应用使用。2、物联网应用:物联网应用就是用户直接使用的各种应用,如智能操控、安防、电力抄表、远程医疗、智能农业等等。3、云计算:云计算可以助力物联网海量数据的存储和分析。依据云计算的服务类型可以将云分为:基础架构即服务(IaaS)、平台即服务(PaaS)、服务和软件即服务(SaaS)。
      udp是面向无连接的,必须使用哪一个协议来提供传输的可靠性?

      udp如何保证数据传输的可靠性?

      UDP要达到TCP的功能就必须实现拥塞控制的功能,而且是在路由之间实现,这个在底层明显是做不到拥塞控制的,在应用层也是做不到的,因为应用层之间和应用程序挂钩,一般只能操控主机的程序,而表示层是处理所有与数据表示及运输有关的问题,包括转换、加密和压缩,在传输层是不可能的,因为你已经使用了UDP协议,无法在本层转换它,所以只有在会话层
      UDP这个协议本身并不保证传输的可靠性。 如果要通过UDP传输数据、但却要保证可靠性的话, 那是要通过第七层(应用层)来实现的。
      我所知道的。UDP可在应用层做校验。
      世界性难题
      udp如何保证数据传输的可靠性?

      如何实现自定义的可靠 UDP 协议--转载

      既然已经有TCP了,为什么还需要UDP可靠?TCP是强制的可靠性传输,其在IP协议的基础上,发送端对所有的数据进行定时重传,接受端对所有的数据进行排序,以此(当然还有很多其他的机制)来实现发送端是什么样子的,接受端就能接受到什么样子的数据。但是现实中有一些场景,我们并不需要如此固执的可靠性。对于FPS游戏这种时效性要求非常高的游戏中,玩家最关心的是自己的射击结果和角色的存活与否,当有一个手雷扔过来时,对于被炸死的玩家而言,这颗手雷是必须要接收到的消息,而其他没有被炸到的玩家,仅需要看到手雷的爆炸动画或者是声音,其更关心的是自己现在的子弹,有没有将敌人爆头。我们不希望因为手雷的消息重传排队,而把射击玩家的结果确认消息延后,这对于TCP而言就力所不逮了。我们看一张图:在传输效率,传输代价和可靠性三个维度上,TCP在最左侧的这条线上,可靠性最高,但传输代价也很大,效率上不及UDP。UDP则在最右侧,只有传输效率,不保证可靠,传输代价也较低。我们如果需要在大约六角形的位置,选择一个折中的方案,那就是UDP可靠传输,即RUDP登场的时刻了。如何实现?首先,为了保证可靠性,我们需要在发送数据的时候添加重传定时器,来保证丢失的数据会被重传。重传的定时器可以定时回调发送重传的数据,也支持将接收到ACK的数据从定时器中取出。现在有了重传定时器,那每次发送数据的时候,应该给定时器设置多长的超时时间呢?最简单的可以设定一个固定的重传时间,最合理的应该针对每条传输链路的不同设置每个连接的合理时间--rto。为了找到rto时间,我们需要获取到每个数据包发送确认时间,即rtt时间,即数据从发送到接收到ACK确认之间的时间间隔。我们参照TCP的实现策略,可以给每个消息记录一个发送时间,当接收到ACK确认时,将此时的时间减去记录的发送时间就获取到了rtt时间。但这样有一个问题,当发生数据重传时接收到ACK,无法判断这个ACK是对初次发送数据的确认还是对重传数据的确认,此时只能将发生重传数据测量到的rtt时间丢弃。所以又有第二种rtt计算策略,我们可以将发送时间记录在数据头中发送出去,接受端在发送确认ACK时,将这个时间戳抄下来顺着ACK返回,这样发送端接收到ACK确认时,就能准确的知道要确认数据的发送时间,由此来计算rtt时间。有了rtt时间,我们按照TCP的标准方法《CP/TPxian详解卷一, P465》,计算rto时间。当接受到ACK确认时,我们需要将确认的数据从定时器中移除。为了提高网络链路利用率,接收端不能每次接收到数据时都立即发送ACK确认,为什么呢?传输的数据量越小,控制头占比越高,而且网络中到处都是只携带一个ACK的包在飞,会造成路由器排队。这里可以接着参考TCP的实现策略。一种是延时ACK,即接收端接收到消息时定制一个pending time,当超时时将这段时间内所有要发送的ACK组合在一起发送,还有一种是捎带ACK,即pending time未到,但恰好也有数据要发送给对端,那么就将ACK捎带在这个数据包中一起发送出去。由于接收端ACK发送都不是瞬时的,所以在上文说到的RTT计算时也需要考虑引起的计算误差。有同学要问了,你这整半天UDP可靠,还不是TCP都一样的策略?那接下来就说点和TCP不一样的东西了。我们之前都只说了一个数据包的发送接收策略,当大量数据到来时如何发送呢?不可能一下子将所有数据都发送出去。所以我们需要一个发送窗体来控制发送数据的个数,当允许发送时就拿出下一个数据包发送,这发生在接收到新的ACK确认或者发送窗体大小调整时。这里和TCP的实现不同,TCP将所有的数据平铺在一个buffer里,然后通过移动滑动窗体来控制发送数据流动。我在这里没有用到滑动窗体,而是将所有的数据包都放到一个权限队列中,按照发送两个高一级权限数据包一个低一级数据包的规则来调整发送顺序,发送窗体中只有inflight的数据包,当可以发送下一个数据包时,再从权限队列中获取。发送窗体负责对发送后的数据缓存,确认,权限队列负责给发送的数据按优先级排序。对接收端而言,也需要一个接收队列对接收到的数据包进行整理,这里我们可以根据需求的不同实现多种排队策略。如果是想得到TCP的效果,数据即有序,又可靠,那我们需要给所有到达的数据包发送ACK确认且排队,只有前一个数据包排好队,无乱序时,才能将数据反回给上层;如果只实现可靠性,不需要有序,那可以接收到一个数据包时,直接反回给上层,但是要发送ACK确认。如果只需要有序性,不需要可靠性,那可以记录目前收到最大的数据包序号,比这个序号大的数据包返回给上层,比这个序号小的直接丢弃,也不需要发送ACK,因为发送端也不会重传数据。以上就是三种不同的可靠性传输。前面我们说了很多,数据包即要携带时间戳,又要携带确认ACK,我们需要给上层发下来的数据添加一个自己的协议头以使双端来识别必要的消息,这里我们可以通过不同的控制标识组合来实现一个变长的协议头,有效利用数据包的传输数据量。其中Flag是必须的,占用4字节的长度,通过位标识后面每个块是否携带,这可以通过手动二进制序列来实现。现在对于一个传输连接而言,我们有了重传机制,确认机制,协议头封装,传输接收控制,但是网络是公共交通,我们如何遵守交通规则,不引起网络阻塞的同时有效利用网络带宽呢?这就要引入拥塞控制算法,我在这里目前使用的是BBR,还没有实现TCP的CUBIC。那为什么使用BBR算法呢?这可就是小孩儿没娘,说来话长了。简单来讲,常规的CUBIC算法通过检测丢包来判断网络拥塞,然后通过控制发送窗体的大小来控制传输在网络中的数据量。大家想一下网络中的传输情况:CUBIC算法在第3阶段检测到丢包,开始减小发送窗体的大小,以收缩网络中传输的数据量,消化路由器排队队列,但是这时已经晚了!在没有发生丢包之前,链路中已经被数据包压的苦不堪言,发送数据的RTT时间已经非常慢。什么时候是链路利用率最高的时候呢?即在2阶段路由器即将有排队情况出现的时候,这时RTT时间最小,但是链路上已经有足够的数据在飞。CUBIC算法还有一个问题是其控制的输出变量只有发送窗体的大小,当发送窗体增大,应用层有数据到来时,会一股脑的将可发送的数据量全部发送出去。现实生活中的十字路口,大家都会遵守交通规则,通过红绿灯控制来保证每个路口都定时的可以让一些车辆通过,然而到了网络世界里一切都变的蛮不讲理,在此路口车很多的情况下,所有车都一个接一个的驶出,而不管交叉路口还有没有别的车等待,这是不对的。所以BBR算法不仅需要控制发送窗体的大小来控制发送的数据量,还通过RTT时间和传输的数据量来计算一个数据的发送速度,通过控制数据流发送的时间间隔,来实现按一定速率发送数据。具体BBR算法是如何实现的,那就是另外一篇长篇大论了,本文不再细说。到目前为止,关于可靠性和传输效率的机制我们基本已经介绍完成,接下来说下传输的建立和连接。传输建立时并没有参考TCP的三次握手,依照UDP的简单粗暴,发送端只管发送数据,接收端能收到算建立了连接,没有接收到则发送端超时。因为我们的协议实现在应用层,没有进程启动的时候也无法发送RST给对端。连接断开时基本参考了TCP的四次挥手实现,继续保留了TIME_WAIT状态来保证网络中上一个连接的数据包不会发送到现任连接上。关于实现的大体机制终于讲完,其他还有一些数据包序列号标识,随机首个序列号,flow queue,pacing实现等细节没有展开,但核心的可靠实现基本就是以上,接下来画一张数据流向图:在socket上有一个Filters process,这是一个过滤器责任链,所有收发的数据都要通过这个过滤器责任链,其可以对传输的包体进行压缩,加密等处理,我在这里实现了snappy对传输数据的压缩过滤器,额外线程通知过滤器,和大数据包的拆分过滤器。通过双向链表管理所有的过滤器模块,可以很方便的嵌入额外的过滤器过程,在这里也可以实现一些熔断转发之类服务治理相关的过滤器。
      如何实现自定义的可靠 UDP 协议--转载

      应用层协议如何保证UDP传输协议的数据可靠性

      在网络通信质量较好的情况下,udp体现出高效率,这适合于传送少量报文的应用,其可靠性由应用程序来保证,如:接收信号后向源方返回一个回响,超时重发、数据检验等功能需应用程序来实现。虽然udp是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。udp也用在路由信息协议rip(routing information protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。
      在传输的数据里加上验证的数据,比如crc32等
      数据包中加入校验码 增加数据交互,采用数据接收方应答数据发送方的机制保证数据传输的可靠性减小单个数据包的长度 等等
      传输时会在你的数据前加校验码的。
      应用层协议如何保证UDP传输协议的数据可靠性

      UDP如何保证传输的可靠性

      UDP是网络传输数据的基础。UDP传输协议的不可靠含义是:即使该数据报丢失,发送方也不知道。但是,对于每个数据报,还是要求尽可能提高传输可靠性
      要实现无差错的传输数据,我们可以采用重发请求(ARQ)协议,它又可分为连续ARQ协议、选择重发ARQ协议、滑动窗口协议。 采用滑动窗口协议,限制已发送出去但未被确认的数据帧的数目。循环重复使用已收到的那些数据帧的序号。具体实现是在发送端和接收端分别设定发送窗口和接收窗口。 在接收窗口和发送窗口间存在着这样的关系:接收窗口发生旋转后,发送窗口才可能向前旋转,接收窗口保持不动时,发送窗口是不会旋转的。这种收发窗口按如此规律顺时钟方向不断旋转的协议就犯法为滑动窗口协议。
      UDP如何保证传输的可靠性

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类