The problem of UDP

如果在TCP链接会比较慢,UDP链接将会有不确定性,你会用那个?然而保证UDP可靠性有很多方法,选用哪个呢?

UDP传输主要有四个问题:

1.数据分片:UDP数据包包含有限信息。因此,我们常常需要将信息分为多个数据包,对于疑惑的分片需要重联。因为给定分片,我们需要唯一的标定分片数目。

2.UDP数据包有时会丢失。如果我们没有接受到该收到的数据包,这时需要一种重传机制。

3.有时,我们会多次收到同一数据包,我们需要检测他们。

4.接受到数据包常常不是原有的数据,我们需要处理这些。

我们可以利用滑动窗口策略解决。好吧,虽然TCP已经实现了这些,但在UDP下,我们不得不自己做这些工作。

RUDP - Reliable User Datagram Protocol

网上提到的解决方法:

1)每个数据包会产生一个唯一的递进id,并附带上一个数据包的id,这样当包发送丢失,和顺序错乱时接受端才回答.并且在接受端需要一个缓存,至少缓存2个包的数据.这个就可以提高效率.

补充1:先给 UDP 包编号,到时候如果丢包,再请求,并按编号重排顺序。

补充2:我们是基于udp协议,然后根据业务需求我们会定制一个标准数据包,每个udp包可能传输1个或多个标准数据.这个时候,在我们的标准数据包里面设置一个包的唯一递进id,比如第一包id是1第二个包是id2.附件上一个标准包的id的目的是可能我们的数据包id产生规则不是连续的.
这样我们在接受方就可以通过id(如果是连续的)来判断是否掉包.判断掉包的方法是查看本次受到的包是否是上一包的递进id.

2)滑动窗口方法(接收端)

窗口机制
    其基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;
同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):

(1).窗口机制
    滑动窗口协议 的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗 口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发 送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设发送窗口尺寸为2,接收窗口尺寸为1):


   分 析:①初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;②发送方打开0号窗口,表示已发出0帧但尚确认返回信息。 此时接收窗口状态不变;③发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之 前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;④接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此时发送窗口状态不 变;⑤发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;⑥发送方继续发送2号帧,2号窗口 打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态 仍不变;⑦接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;⑧发送方收到接收方发来的1号帧收毕的确认信 息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。

    若从滑动窗口的观点来统一看待1比特滑动窗口、后退n及选择重传三种协议,它们的差别仅在于各自 窗口尺寸的大小不同而已。1比特滑动窗口协议:发送窗口=1,接收窗口=1;后退n协议:发窗口>1,接收窗口>1;选择重传协议:发送窗 口>1,接收窗口>1。

(2).1比特滑动窗口协议

    当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停等协议 (stop-and-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继 续发送下一帧。由于接收方需要判断接收到的帧是新发的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。由于停等协议规定只有一帧完全发送成功后才 能发送新的帧,因而只用一比特来编号就够了。其发送方和接收方运行的流程图如图所示。

         

(3).后退n协议

    由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退 n协议。后退n协议中,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可 以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了N个 帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。

   从这里不难看出,后退n协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原 来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低。由此可见,若传输信道的传输质量很差因而误码率较 大时,连续测协议不一定优于停止等待协议。此协议中的发送窗口的大小为k,接收窗口仍是1。

(4).选择重传协议

    在后退n协议中,接收方若发现错误帧就不再接收后续的帧,即使是正确到达的帧,这显然是一种浪 费。另一种效率更高的策略是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中, 同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发 (SELECTICE REPEAT),其工作过程如图所示。显然,选择重发减少了浪费,但要求接收方有足够大的缓冲区空间。

滑动窗口的另一描述:

简要描述一下该算法:

1、将需要传递的信息编码为一个有序的帧序列;

2、发送方设置一个滑动窗口(缓冲区),该窗口大小为最大发送帧数(N)。该缓冲区采用先进先出队列机制,首先发送N帧信息,每帧都有一个定时器,当超时还没有收到接收方的应答帧时,则重发该帧;

3、接收方设置一接收队列,对接收到的每帧入队列。如果该帧是编号最小的帧,则发送该帧收到的应答帧给发送方;

4、发送方如果收到接收方的某帧的应答消息,则判断,如果是队列的第一个帧,则该帧出列。队列空出一位,再发送一帧,否则记录其为可出列标记。

利用滑动窗口算法原理,可以保证一堆数据在有序发送的情况下,顺利的达到接收方。

通过对滑动窗口算法原理的分析,可以将该算法应用在如下场景:

A系统需要给B系统发送大量的资料,这些资料需要拆分为M次才能发送完成,考虑到网络流量问题,不能一次性的就全部把M个数据块发送给B系统。较好的处理方式是设置符合网络流量大小的值N,做为A系统一次发送的数据块个数。N作为滑动窗口的长度。采用滑动窗口算法来完成A、B系统的数据发送,考虑到发送的数据可以是无序(既数据没有先后之分)的情况。需要对该算法略加修改,即发送队列中的任何一个数据块如果收到应答信息,队列都向前滑动一格,并允许立即发送一个新的数据块。就可以很好的解决这个问题。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值