目录
一、引言
- 该文章来源于教材的思路。
- 使用FSM状态机描述发送方和接收方服务响应状态。
- 在阅读本文之前,最好了解计算机网络体系结构各层之间的交流方式。
- 红色为重点,蓝色为细节
二、Rdt存在意义及原理
- 可靠数据传输rdt原理: 现实中很多信道是不可靠的,很可能会发生丢包(由缓存溢出)等错误,所以我们需要使用技术手段来是传输变得可靠
- 可靠的含义:不错,不丢,不乱(重复分组)
- Rdt 协议:对应用层,传输层,链路层都很重要。例如在传输层使用了UDP协议,而网络应用需要可靠传输,则需要使用可靠传输协议。
- Rdt 被列为网络十大问题之一。
- 基本FSM结构
三、Rdt 的历经版本及实现
1. Rdt 1.0 协议
- 特点:发送方与接收方都只有一个状态
- 考虑条件:底层信道完全可靠条件下:(理想条件,实际不存在),具体解释如下:
不会发生错误
不会丢弃分组
发送方与接收方的FSM 独立
- 发送方:一个状态,等待上层调用
若上层调用,则产生rdt_send事件,创建packet活动,调用信道上的udt_send(),发送分组,可确定百分百发送,然后回到之前状态,继续等待调用 - 接收方:一个状态,等待下层调用
当传入一个分组,rdt_rcv接收,extract提取,交付给上层deliver_data - 具体的FSM解释图如下:
2. Rdt 2.0 协议
PS:该协议也叫做ARQ协议 Automatic Repeat reQuest
- 特点: 等待上层调用,等待ACK或NAK控制信息
- 考虑条件:基于Rdt 1.0的不可行性,底层信道可能反转分组中的位,解决方法如下:
Frist : 利用校验和检测位错误
Second: 如何从错误中恢复(引入的新机制):
确认机制ACK:接收方显式告知发送方分组已正确接收
NAK:接收方显式告知发送方分组有错, 发送方接收到NAK后,重传分组
- 发送方:若上层调用,则产生rdt_send事件,创建packet活动并加入校验盒,调用信道上的udt_send(),发送分组。同时进入等待ACK/NAK状态,若为NAK,则重传分组,继续等待ACK/NAK,一直处于该状态,直到传回ACK才进入等待调用状态。
- 接收方:当传入一个分组,rdt_rcv接收并且进行判断,如果没有错误extract提取,交付给上层deliver_data并返回ACK,如果发生错误,则直接返回NAK,并处于等待接收状态
- 具体的FSM解释图如下:
3. Rdt 2.1
- 特点:发送方和接收方都有四个状态,比Rdt 2.0中多了两个***状态
- 考虑条件:基于 rdt_2.0的缺陷: 如果ACK/NAK消息发生错误/被破坏,就会进入死锁。 解决方式如下:
可以使用重传来解决问题,但是重传会导致重复分组问题,所以要解决重复分组问题:
发送方给每个分组增加***
同样使用停-等协议
- 发送方:等待上层调用,***为0,若调用,若上层调用,则产生rdt_send事件,创建packet活动(此处加入***)并加入校验盒,调用信道上的udt_send(),发送分组。同时进入等待ACK/NAK状态,若为NAK,则重传分组,继续等待ACK/NAK,一直处于该状态。若 传回ACK,则进入等待调用状态,并改变***为1。
- 接收方:当传入一个分组,rdt_rcv接收并且进行判断,如果分组没有错误,并且期望收到分组***与当前***相同,则extract提取,交付给上层deliver_data并返回ACK,如果发生错误,则直接返回NAK,并处于等待接收状态;
若接收分组没错,***不匹配,则必须发一个ACK,表示正确接收。
- 发送方和接收方FSM解释图分别如下:
发送方
接收方
4. Rdt 2.2
- 特点:基于Rdt 2.1 ,使用无NAK消息机制
- 并无多余考虑条件
- 与Rdt 2.1不同之处如下:
无NAK消息协议:
只需要在ACK消息中显示的加入被确认分组的***,
接收方通过ACK告知最后一个被正确接收的分组
发送方收到重复ACK后,采取重传当前分组
- 具体FSM解释图如下:
5. Rdt 3.0
- 特点:多了一个时钟设置
- 考虑条件:之前所有Rdt 协议只假设了信道可能发生的一种错误,bit error:位的错误。不会丢失分组,现在假设信道既可能丢失分组,又可能发生错误。具体解决方法如下:
First: 发送方等待合理的时间,若timeout,没收到ACK,也没收到NAK,则重传。
Second: 但此时会导致一个问题:分组或ACK只是延迟了,则会引起重复问题,则需要加入***
- 发送方和接收方:在Rdt 2.0的基础上增加一个时钟,其它没有任何变化。给出发送方的FSM解释图:
-
常用的Rdt 3.0的实例情况有以下几种:
First: 没有任何丢失
Second: 丢包
Third:丢失ACK
Fourth: Timeout