本节课我们介绍可靠传输的第三种实现机制,选择重传协议。在前两次课中,我们介绍了停止等待协议和后退恩真协议这两种可靠传输的实现机制。 我们首先来回顾一下这两个协议的要点。从滑动窗口的角度看,使用停止等待协议的发送方,其发送窗口的尺寸 wt 只能等于一,也就是在未收到接收方发来确认的情况下,只能发送一个数据针, 这对于往返实验 rtt 远大于数据真发送实验 tt 的通信链路,例如卫星链路,其信道利用率非常低。使用停止等待协议的接收方,其接收窗口的尺寸 wr 也必须等于一, 只能对数据针按序接收。后退 n n 协议是对停止等待协议的改进,其发送窗口的尺寸 w t 必须满足大于一且小于等于二的 n 次减一,其中 n 是构成 n 序号的比特数量。 由于发送窗口尺寸 wt 大于一,因此发送方在未收到接收方发来确认的情况下,可将序号落在发送窗口内的多个数据针全部发送出去。 若 w t 等于一,则又变回了停止等待协议。若 w t 大于二的 n 次减一,则会造成接收方无法分辨新旧数据针的问题。接收方的接收窗口尺寸 w r 必须满足 w r 等于一,这和 和停止等待协议是相同的,因此接收方只能按序接收数据针。为了减少开销,接收方可以采用累计确认或捎带确认。 发送方发送窗口内某个已发送的数据针产生超时重发时,其后续在发送窗口内且已发送的数据针也必须全部重传, 这就是后退恩珍协议名称的由来。当通信线路质量不好时,后退恩珍协议的信道利用率并不比停止等待协议高。 相比于后退 n 针协议,选择重传协议可进一步提高信道利用率。使用选择重传协议的发送方,其发送窗口的尺寸 wt 必须满足大于一且小于等于二的 n 减一次,其中 n 是构成真序号的比特数量。若 wt 等于一,则与停止等待协议的发送窗口相同。若 wt 大于二的 n 减一次,则会造成接收方无法分辨新旧数据帧的问题。 由于发送窗口尺寸 wt 大于一,因此发送方在未收到接收方发来确认的情况下,可将序号落在发送窗口内的多个数据针全部发送出去。在这一点上,选择重穿协议与后退 n n 协议是相同的。 接收方的接收窗口尺寸 wr 必须满足大于一且小于等于 wt, 否则就没有意义了。接收方可接受序号不连续但 仍处在接收窗口内的数据针,等到所需序号的数据针收到后,再一并上交应用进程,接收方可对按序到达且五五码的数据针发送累计确认。与此同时,接收窗口向前滑动相应的位置, 发送方收到确认时,发送窗口向前滑动相应位置。接收方还可以使用更有效的插错处理策略,即一旦收到雾码的数据针或怀疑数据针丢失,会立即发送相应的否认针。 nak, 发送方收到 nak 后立刻重发物码的数据针,而不必等到该数据针的重传计时器超时再重发。发送方指重传出错的数据 或重传计时器超时的数据针,这就是所谓的选择重传。下面我们举例说明选择重传协议的工作情况。这是发送方的发送缓存,这是接收方的接收缓存。 本例采用三个比特给真编号,共有零到七八个编号,可以看到缓存中真序号为零到七,并反复使用发送窗口的尺寸 w、 t 取最大值 则接收窗口的尺寸 wr 的取值与 wt 相同,也就是 wt 等于 wr 等于二点三减一次等于四。 假设当前落入发送窗口内的序号为零到三,发送方可以在未收到接收方发来确认的情况下 发送零到三号数据针,序号处于发送窗口外的这些针不能发送,当前落入接收窗口内的序号也为零到三。接收方允许接收序号落入接收窗口内且无误码的数据针, 序号出于接收窗口外的这些针不能接收。现在发送方可以将序号落在发送窗口内的零到三号数据针全部发送出去, 假设他们按序且正确的到达接收方。由于此时接收窗口内的序号也为零到三, 所以接收方依次接收这些数据针,然后给发送方发回累计确认针 a、 c、 k 三,并将接收窗口向前滑动四个位置,使得就序号零到三移出 接收窗口,而新序号四到七落入接收窗口。累积确认真 a、 c、 k 三到达发送方。发送方接收后,将自己的发送窗口向前滑动四个位置, 使得旧序号零到三移出发送窗口,而新序号四到七落入发送窗口,发送方现在可以将发送缓存中已发送的零到三号数据帧删除了, 而接收方可则即将接收缓存中的零到三号数据针上交给应用进程。 现在发送方可以将序号落在发送窗口内的四到七号数据针全部发送出去,假设他们按序且正确的到达接收方。由于此时接收窗口内的序号也为 四到七,所以接收方依次接收这些数据针,然后给发送方发回累计确认针 a、 c、 k、 七,并将接收窗口向前滑动四个位置,使得旧序号四到七移出接收窗口,而新序号零到三落入接收窗口。 假设累计确认针 a、 c、 k、 七在传输过程中丢失了,这必然会导致发送方对已发送的四到七号数据针的超时重传。 假设重传的四到七二数据针按序且正确的到达接收方,接收方发现他们是重复的数据针,就会意识到发送方在这些数据中的重传计时器超时之前未收到确认,这有可能是自 之前发送的累计确认针 ack 七迟到了,也有可能是丢失了,于是发送方丢弃这些重复的数据针,并重发累计确认针 ack 七 重发的累积确认真 ack 七到达发送方。发送方接收后,将发送窗口向前滑动四个位置,使得旧序号四到七移出发送窗口,而新序号零到三落入发送窗口, 发送方现在可以将发送缓存中已发送的四到七号数据针删除了。不要忘记了, 在整个过程中,接收方可择机将接收缓存中的四到七号数据针上交给应用进程。我们再来看另一个例子,现在 发送方可以将序号落在发送窗口内的零到三号数据针全部发送出去。假设他们按序到达接收方,但二号针出现了雾码。 由于接收窗口内的序号为零到三,因此接收方依次缓存这些数据针,当检测出二号针误码时,丢弃该针,并给发送方发回针对该针的否认针 n、 a、 k 二,接着缓存三号数据针 否认真 nak 二到达发送方。发送方接收该否认真后,就知道应该立刻重传发送窗口内的二号数据针。 尽管此时二号数据针的重传计时器还未超时,发送方立刻重传二号数据针,重传的二号数据针正确到达接收方, 其序号落在接收窗口内。接收方接收该数据针,然后给发送方发回累计确认针 ack 三, 并将接收窗口向前滑动四个位置,使得旧序号零到三移出接收窗口,而新序号四到七落入接收窗口。接收方可将之前收到的数据针择期上交给应用进程, 累计确认真 a、 c、 k 三到达发送方。发送方接收后,将自己的发送窗口向前滑动四个位置, 使得旧序号零到三移出发送窗口,而新序号四到七落入发送窗口。发送方现在可将发送缓存中已发送的零到三号数据帧全部删除了。 现在发送方可以将序号落在发送窗口内的四到、七号数据针全部发送出去。假设六号数据针在传输过程中丢失了。 由于此时接收窗口内的序号为四到七,因此接收方依次缓存这些数据针, 发现六号针没有按序到达,而其后的七号针到达了,继续缓存七号数据针,然后针对未按序到达的六号数据针发送,否认针 nak 六,否认针 nak 六到达发送方。 发送方接收该否认真后,就知道应该立刻重传发送窗口内的六号数据针。尽管此十六号数据针的重传计时器还未超时, 发送方立刻重传六号数据针,重传的六号数据针正确到达接收方,其序号落在接收窗口内, 接收方接收该数据针,然后给发送方发回累计确认针 ack 七,并将接收窗口向前滑动四个位置,使得旧序号四到七移出接收窗口,而新序号零到三落入接收窗口。 接收方可将之前收到的数据针择机上交给应用进程,累计确认针 a、 c、 k 七到达发送方。 发送方接收后,将自己的发送窗口向前滑动四个位置,使得旧序号四到七移出发送窗口,而新序号零到三 落入发送窗口。发送方现在可将发送缓存中已发送的四到七号数据针全部删除了。 我们再来讨论一下使用选择重穿协议的发送方,其发送窗口尺寸 wt 必须满足的条件, 也就是大于一且小于等于二的 n 减一次。而接收窗口尺寸 wr 必须满足的条件是大于一且小于等于 wt。 我们之前的例子采用三个比特给真编号,真序号为零到七发送窗口的尺寸 w t 取最大值, 则接收窗口的尺寸 w r 的取值与 w t 相同,也就是 w t 等于 w r 等于二的三减一次等于四。现在 我们仍采用三个比特给真编号,真序号为零到七,但是我们将发动窗口尺寸 wt 设置为五,相应的将接收窗口尺寸 wr 也设置为五,看看会出现什么情况。 现在发送方可以将序号落在发送窗口内的零到四号数据针全部发送出去,假设他们按序且正确的到达接收方。 由于此时接收窗口内的序号也为零到四,所以接收方依次接收这些数据帧,然后给发送方发回累计确认 a、 c、 k、 四, 并将接收窗口向前滑动五个位置,使得旧序号零到四移出接收窗口,而新序号五、六、七、零一落 入接收窗口。假设累计确认针 a、 c、 k、 四在传输过程中丢失了,这必然会导致发送方对已发送的零到四号数据针超时重传。假设重传的零到四号数据针按序正确的到达接收方, 很显然,这是接收方之前就已接收的数据针。然而,由于当前接收窗口内有序号零和一,接收方会将重传的零号和一号数据针当做是新的数据针接收,这显然是不正常的情况。 这个例子说明了发送窗口的尺寸 w、 t 和接收窗口的尺寸 w、 r 必须满足所规定的条件,否则可能出现工作不正常的情况。本节课到 到这里就结束了,到目前为止,我们已经通过三次课分别介绍了可靠传输的三种实现机制,停止等待、协议、后退、 n、 真协议、选择重传协议。我们将他们的要点对比总结如下, 需要注意的是,这是数据链路层实现可靠传输的三种机制数据链路层是否要求实现可靠传输,往往取决于信道的特性。 一般来说,有线信道质量较好,不要求实现可靠传输机制,而无线信道质量较差,要求实现可靠传输机制。期待您的参与,下节课见!
粉丝1.3万获赞5.4万


rabbit mq 如何保证消息的可靠传输? robbit mq 如果要保证消息的可靠性呢?咱们需要从三点去考虑,第一块呢是生产者,他需要将消息呢发送到 s 称之,并且录入到队列,那么其次呢是队列需要将消息给他持久化。 那么最后呢,是消费者要成功消费咱们毕业中的消息才算结束。那首先呢,是针对生产者证, robimq 呢,提供了 form 机制,保证了消息呢可以发送到 s 称之交换机,那么还提供了锐称机制,可以保证啊,消息从 s 称之陆游到咱们的队列中,如果发送失败或者是陆游失败呢,他会提供一个回调函数, 咱们可以做从事或者是一些补偿机制。那么其次呢,针对咱们对立啊,对消息的持有化,只需要在发送消息之前给消息设置一个叫做 basic propace 的信息,那么将咱们的 目的设置为三,那么这样呢,即便 robby 的 mq 重启,消息也不会丢失。那么最后呢,就是消费者啊,他需要开启手动 ack, 在消息被成功消费后呢,咱们要手动的基于 china 执行 ack, 那保证消息是可以被正常消费的,哈哈哈哈,哎呀,腰疼。
