天天看点

UDP包丢失处理

包丢失处理

虽然大多数基于丢包的拥塞控制在工作,包丢失被认为是一个简单的拥塞指示,但是这些控制很少在真实的网络环境里对包丢失的模式做过研究。因为一个包丢失可能造成乘性地速率的降低,所以包丢失处理显得非常重要。

有3类涉及到包丢失的特别情形,需要被解决:

1.失去同步。

2.非拥塞的包丢失。

3.包的重新排序。

失去同步是一个条件。当所有的并发流几乎在同一时间发生丢包时,即失去同步。非拥塞的包丢失通常因为出现了链路错误导致,并且该非拥塞的包丢失可能会向传输协议发出错误的网络拥塞信号。另外,包的再排序可以误导接收端将其作为丢失包处理。

因为已经有高效的方法来解决包再排序的问题,所以本节的焦点落在前2种情形上,并且在该情形在文献里的方法不适用于UDT。

1 失去同步(Loss Synchronization)

失去同步这种现象是一个情形:当所有并发流同时增加和减少它们的发包速率时,这时,总计吞吐量产生非常大的震荡,并且导致带宽总计利用率降低。现象的本质原因是:当拥塞发生时,几乎所有的流会发现丢包,然后不得不放弃它们的发送;当没有拥塞发生时,它们都增加发包速率。

UDT使用一种随机取样的方法来缓解这个问题。为了描述这个方法,定义3个术语:

    1.1 丢失事件(Loss event):当包丢失被检测到时触发丢失事件。当发送端接收到一个NAK控制包时,UDT发送端可以检测一个  丢失事件。

    1.2 拥塞事件(Congestion event):是一个特殊的丢失事件。当最后一次速率降低发生时,在丢失事件里丢失的包中的最大序列号,要大于已经发送的包里最大的序列号时,触发该事件。

    1.3 拥塞周期(Congestion Period):两个持续的拥塞事件的间隔时间称为拥塞周期。

假设当前有M个丢失事件发生时间夹在两个拥塞事件之间,并且N是在1和M之间满足均匀分布的随机数。每一个拥塞周期里,UDT控制算法的降低因子是在[1/9,1 – (8/9)N]范围内的随机数。一旦一个NAK控制包被接收,如果这个NAK包开启了一个新的拥塞周期,即该事件就是拥塞事件,发包周期增加1 / 8(和降低发送速率1/9相等),并且在下一个SYN时间间隔点停止发包。每隔N个丢失事件,发包周期将进一步增加另一个1 / 8。

注意,UDT的明确的丢失报告(NAK)的用处和TCP的重复ACK的用处不同。通过重复地ACK响应,TCP的发送端在一个拥塞事件里,可能不知道所有的丢失事件,并且通常只检测第一个丢失事件。事实上,大部分TCP的实现在每一个RTT,不止一次地不降低发送速率。但是,在UDT,所有的丢失事件,通过NAK包来通知。

2 噪声链路(Noisy Link)

如果有大量的非拥塞造成的包丢失(比如链路错误,设备故障等),基于丢包(Lossbased)的控制算法可能工作的不理想。因为它们认为所有丢失的包归因于网络拥塞,于是就降低数据发送速率。虽然在光纤链路上,产生链路错误的几率非常低,但是这些包丢失归因于设备故障和错误的设备参数配置。

UDT使用一个简单的机制,用来容忍这类问题。

在噪声链路上,UDT不在一次拥塞事件里,对第一个丢失包做处理。然而,如果在一次拥塞事件里,有多余一个的丢失包时,将降低发包速率。这种方法,在非拥塞丢失包出现概率小的网络里,是非常有效的。毫无疑问,它也适用于轻量的包重新排序的问题。