3.4 可靠数据传输原理
目录:计算机网络-课程笔记目录
前言
-
什么是可靠
- 不错、不丢、不乱
-
可靠数据传输协议
- 网络Top-10问题
- 信道的不可靠特性决定了可靠数据协议(rdt)的复杂性
-
PS:
-
物理层:比特率
-
数据链路层:帧(frame)
-
网络层:包(package)
-
传输层:数据报(datagram)
再上面称之为段(Segment)
-
-
- rdt_send() 和 deliver_data() 都是单向的
- udt_send() 和 rdt_rcv() 都是双向的
-
接下来只考虑单向数据流动
- 但是控制信息是双向流动的:如 udt_send() 和 rdt_rcv()
rdt 1.0:可靠信道上的可靠数据传输
- 底层信道完全可靠
- 不会发生错误(bit error)
- 不会丢弃分组
- 发送方和接收方的FSM(有限状态机)独立
- 都是只有一个状态:等待调用
rdt 2.0:产生位错误的信道
- 缺陷
- NAK、ACK发生错误
- 分组不会丢失,按顺序到达
- 底层信道可能翻转分组中的位(bit)
- 利用校验和检测位错误(难度高)
- 从错误中恢复
- 确认机制(Acknowledgements, ACK):接收方显式地告知发送方分组已正确接收
- NAK机制:接收方显式地告知发送方分组有错误
- 重传机制:发送方收到NAK后,重传分组
- 基于这种重传机制的rdt协议称为ARQ(Automatic Repeat Request)协议
- rdt 2.0中引入的新机制
- 差错检测
- 接收方反馈控制信息:ACK、NAK
- 重传
- 停 - 等协议(考点)
- 发送方
- 状态一:等待上层调用
- 状态二:等待ACK或NAK
- 一 -> 二:加入校验和,发送
- 二 -> 一:重发
- 二 -> 二:收到ACK
- 接收方
- 状态一:等待下层调用
- 有错误:反馈NAK
- 没错误:提取数据,向上传递,反馈ACK
- 发送方
rdt 2.1:应对ACK/NAK破坏和重传重复
-
解决重复分组的问题:发生错误不能简单重传,会产生重复分组
-
产生重复分组的情况:正确接收,ACK坏了,发送方再次发送,接收方又正确接收
- 序列号(Sequence number):发送方给每个分组增加序列号
- 接收方丢弃重复分组
-
-
状态数量翻倍:需要记住当前分组的序列号
-
有限状态机
- 发送方
- 接收方:应对ACK/NAK破坏
-
分组坏掉了:NAK
-
序列号出错:发送ACK,不是NAK也不可以置之不理(Why?)
rdt 2.2:无NAK消息协议
- 与2.1功能相同,但是只是用ACK
- 实现
- 接收方通过ACK告知最后一个被正确接收的分组
- 在ACK消息中显式地加入被确认分组的序列号
- 发送方收到重复的ACK之后,采取与接收到NAK相同的动作
- 重传当前分组
rdt 3.0:丢失分组
- 如果信道既可能发生错误也可能丢失分组
- “校验和+序列号+ACK+重传”够用吗?
- 没有分组到达,死锁
- 方法:发送方等待“合理”时间
- 如果没有接收到ACK,重传
- 如果分组或ACK只是延迟而不是丢失
- 重传会产生重复,序列号机制能够处理
- 接收方需在ACK中显示告知所确认的分组
- 需要定时器
- 发送时启动计时器,随后进入等待ACK,超时重发,启动计时器
- 正确接收,定时器重置
- 发现重复:接收方丢弃,发送ACK,序列号为最后一个接收的序列号
性能分析
-
Edt 3.0能够工作但是性能很差
-
1Gbps链路、15ms端到端传播延迟、1KB分组
-
b = bit,B = byte(kamo)
-
T transmit = L / R = 8kb / 10^9 = 8 microsec(微秒)
-
发送方利用率:发送方发送时间百分比
U sender = (L/R) / (RTT + L/R) = 0.008 / 30.008 = 0.00027
-