1 可靠数据传输概述
什么是可靠?
不错、不丢、不乱
可靠数据传输协议
- 可靠数据传输对应用层、传输层、链路层都很重要
- 网络Top-10问题
- 信道的不可靠特性决定了可靠数据传输协议(rdt)的复杂性
可靠数据传输协议基本结构:接口
可靠数据传输协议的设计
- 渐进地设计可靠数据传输协议的发送方和接收方
- 只考虑单向数据传输
- 但控制信息双向流动
- 利用状态机(Finite State Machine, FSM)刻画传输协议
2 Rdt 1.0: 可靠信道上的可靠数据传输
- 底层信道完全可靠
- 不会发生错误(bit error)
- 不会丢弃分组
- 发送方和接收方的FSM独立
3 Rdt 2.0: 产生位错误的信道
- 底层信道可能翻转分组中的位(bit)
- 利用校验和检测位错误
- 如何从错误中恢复?
- 确认机制(Acknowledgements, ACK): 接收方显式地告知发送方分组已正确接收
- NAK:接收方显式地告知发送方分组有错误
- 发送方收到NAK后,重传分组
- 基于这种重传机制的rdt协议称为ARQ(Automatic Repeat reQuest)协议
- Rdt 2.0中引入的新机制
- 差错检测
- 接收方反馈控制消息: ACK/NAK
- 重传
Rdt 2.0: FSM规约
4 Rdt 2.1
Rdt 2.0有什么缺陷?
- 如果ACK/NAK消息发生错误/被破坏(corrupted)会怎么样?
- 为ACK/NAK增加校验和,检错并纠错
- 发送方收到被破坏ACK/NAK时不知道接收方发生了什么,添加额外的控制消息
- 如果ACK/NAK坏掉,发送方重传
- 不能简单的重传:产生重复分组
- 如何解决重复分组问题?
- 序列号(Sequence number): 发送方给每个分组增加序列号
- 接收方丢弃重复分组
stop and wait:Sender sends one packet,then waits for receiver response。
Rdt 2.1: 发送方, 应对ACK/NAK破坏
Rdt 2.1: 接收方, 应对ACK/NAK破坏
5 Rdt2.2
发送方
- 为每个分组增加了序列号
- 两个序列号(0, 1)就够用,为什么?
- 需校验ACK/NAK消息是否发生错误
- 状态数量翻倍
- 状态必须“记住”“当前”的分组序列号
接收方
- 需判断分组是否是重复
- 当前所处状态提供了期望收到分组的序列号
- 注意:接收方无法知道ACK/NAK是否被发送方正确收到
Rdt 2.2: 无NAK消息协议
我们真的需要两种确认消息(ACK + NAK)吗?
- 与rdt 2.1功能相同,但是只使用ACK
- 如何实现?
- 接收方通过ACK告知最后一个被正确接收的分组
- 在ACK消息中显式地加入被确认分组的序列号
- 发送方收到重复ACK之后,采取与收到NAK消息相同的动作
- 重传当前分组
6 Rdt 3.0
如果信道既可能发生错误,也可能丢失分组,怎么办?
- ”校验和 + 序列号 + ACK + 重传”够用吗?
方法:发送方等待“合理”时间
- 如果没收到ACK,重传
- 如果分组或ACK只是延迟而不是丢了
- 重传会产生重复,序列号机制能够处理
- 接收方需在ACK中显式告知所确认的分组
- 需要定时器