文章目录
一.概述
可靠数据传输(reliable data transport,rdt)在应用层,传输层,数据链路层都很重要。信道的不可靠性决定了rdt协议的复杂性。为了问题研究的需要,做以下约定:
- 对数据传输的不可靠性研究采用渐进式的。(可靠传输–>比特差错–>比特差错+分组丢失–>…)
- 双向的数据传输看作两个单向的数据传输,因此只考虑单向数据传输。
二.分析过程
rdt1.0:在可靠信道上的可靠数据传输
此时,下层的信道是完全可靠的。即:
无比特出错
没有分组丢失
发送方(send,以下简称S)和接受方(receiver,以下简称S)的操作:
S将数据发送给下层信道,R从下层信道接受数据。双方基本不做与rdt有关的操作。
rdt2.0:具有比特差错(不考虑ACK/NAK出错)的信道
此时,下层的信道可能出错:如0变成1,即比特翻转。需要用校验和来检验比特差错。
怎样处理错误和恢复正常:
- 确认(acknowledge,ACK):R显式的告诉S分组已经被正确接收
- 否定确认(no acknowledge,NAK):R显式的告诉S分组发生差错,S收到NAK后,S重传分组。
rdt2.0中的新机制:
- S进行差错控制编码,缓存(保存副本,以便检错重传)。
- R使用编码检错
- R要反馈:发送ACK,NAK到S。
- S收到反馈后作相应动作(收到ACK,发新的;收到NAK,重发)
rdt2.0的缺陷:若ACK/NAK出错,怎么办?如发的ACK/NAK是无法识别的内容,S就不知道发生了什么事情。S自然也不知道怎么做了。为此,出现了rdt2.1.
rdt2.1:具有比特差错(ACK/NAK可能出错)的信道
针对rdt2.0中ACK/NAK出错,引入序号机制,即在S的每个分组加个序号。
编号占用一位,分组编号方式:0,1,0,1…如此交替。
当ACK/NAK出错,比如无法识别时。S会重传当前分组。此时分为两种情况。
ACK出错:重传导致分组重复,由于分组有编号。重传导致相邻两个分组编号一样,R丢弃即可。
NAK出错:重传刚好传的是R需要的分组。
S和R新增的操作:
S:
- 在分组中加入编号,用一位编号即可。0/1
- 检查ACK/NAK是否出错(需要EDC)
- 记录当前分组的编号是0还是1。
R:
- 必须检测当前收到的分组是否重复。R有一个状态位,记录当前希望接收的分组时0,还是1.
注意:R并不知道S是否正确收到了ACK/NAK。没有对ACK/NAK的确认,即无确认的确认。但是,R可以通过S发送的分组来获取S是否收到ACK/NAK.如:S发送分组(packet,记为pkt)pkt0,R发回ACK,若S发送pkt1,则说明S收到正确的ACK;若S发送pkt0,则说明S未收到正确的ACK.
对这种R发生一个分组,然后等待R的应答(一次只有一个等待确认的分组)的协议称为停等协议(Stop and Wait Protocol).
rdt2.2:无NAK的协议
功能同rdt2.1,但只使用ACK(ACK要编号:ACK0,ACK1,ACK2…)
R对最后正确接收的分组发ACK,以替代NAK。即当前分组需要发NAK时,就发上一个正确接收的分组的ACK.
当收到重复的ACK时(当前分组传输出错),发送放重传当前分组。
这中机制为之后一次发送多个数据单位做了准备,其优点在于:
1.一次能发多个数据单位。
2.无NAK,确认机制简单了,协议也得到简化。
rdt2.2R和S做的操作和rdt2.1相同。只不过当前分组出错,R发送给S的时上一个正确接收的分组的ACK
rdt3.0:具有比特差错和分组丢失的信道
分组在传输时,若分组太多,遇到路由器,会排队等候处理,由于路由器缓存有限,队满时,会丢弃分组。因此,下层信道还可能出现分组丢失(数据或者ACK)的情况。
若分组在传输时丢失,则R会等待这个分组,S会等待这个分组的ACK。这可能导致死锁。但检验和,分组编号,ACK,重传这些机制无法处理此问题。
因此引入超时重传机制。设置一个合理的