可靠数据传输基本原理(2)-解决数据丢失问题
网络信道不可靠的点
1. 数据在传输的过程中有可能会受损(上一篇文章说明了如何解决这个问题)
2. 数据在传输的过程中有可能会丢失(本文说明如何解决这个问题)
传输层的可靠性协议就是解决上面两个问题的。
消除NAK,用ACK代替NAK
在上一篇文章中如果接收方检测数据有失真,直接回复一个NAK给发送方,当发送方收到NAK之后对数据进行重新传递,从而实现可靠性传输,如下图所示。
在上一篇文章的最后对每一次发送的数据引入了序列号,在序列号的基础上可以用ACK来代替NAK,彻底在数据传输过程中移除NAK。
- 如果接收方检查数据没有损失,则直接ack当前数据的序列号
- 如果接收方检查数据有损失,则直接ack上次成功接受的数据的序列号。
- 发送方如果收到的ack序列号和期望的不一致,则说明数据有损,直接重传
具体如下图所示。
数据在传输过程中丢失怎么处理
信道不稳定,或者路由器的缓存满了等都有可能导致传输的数据丢失。、
具体到可靠性传输有两种类型的数据丢失:
- 数据本身丢失
- ACK丢失
这两种丢失都可以交给发送方进行处理:重传。
具体实现是在发送方设置一个定时器,当数据发送出去后,开启定时器,在给定的实际内(比如一个RTT)如果没有收到ACK,则认为超时,这个时候发送方启动重传。
数据本身丢失
数据再传输过程中丢失了,超时没有收到ack后发送方进行重新传递。
ACK丢失
ack丢失对于发送方来说和数据本身丢失是一样的,都是重新传送。
但是对于接收方来说,因为已经收到了数据,需要做冗余检测,只需要简单返回ack即可。
提前超时
提前超时,对于接收方来说,需要做冗余检测 ,只需返回ack。对发送方,也会收到一个冗余的ack,直接忽略。
作者:iBrake
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.