累了,这里主要是记的多,俺写简单一点 除课件外参考
指望每次信息传递后的结果都和理想中一样毕竟不太可能——哪个传输渠道(这里主要称为信道,channel)都不是完全可靠的
而后面会提到,"Best Effort" 式的IP协议在面对这样的情况时是不会修复的,它自己在传输过程中还可能发生错误或者丢失。
这这俩以及其他各种原因之下,接收主机可能收到一个充满“漏洞”的数据
所以,我们需要设定一些协议来使它们传递的信息至少在我们看来“可靠”——Reliable data transfer,所谓可靠数据传播,这也是TCP传输成立的基础
最基本原理模型
rdt示意
引入了有限状态自动机的概念
- 即,只有有限种状态的,在特定条件下能切换状态的机器
- 比如刷卡就转的这种门禁机器
RDT的迭代
rdt1.0
rdt1.0是基于理想情况下的协议,假设所有信道都是可靠的——没有比特位的翻转,没有数据包的丢失与超时。所以rdt1.0的传输功能就是 发送方发送数据,接收方等着接受数据。
rdt2.0
- rdt2.0 在 rdt1.0 的基础上考虑了bit errors,即,不可信信道中数据包中的1可能会变0,0可能会变成1。rdt2.0的任务是发现并修复这些bit errors
- rdt1.0 中接受者和发送者固定,rdt2.0 引入有限状态自动机finite state machines (FSM) 来切换指定发送者和接受者
实际机制
从实际来说,rdt2.0增加了3种新机制来提升:
- 通过checksum来错误校验
- 接收者反馈接受正误信息(ACKs——acknowledgements,NAKs——negative acknowledgements)
- 重传
即,传输层对应用层的数据进行打包处理时,新增checksum(校验和),从而接收端可以对其数据包进行检验,如果正确,返回ACK,发送者继续发送下一个数据包;如果不正确,返回NAK,发送者重传数据。
udt 指 unreliable……
小测试
出大问题
捏妈ACK或者NCK传错了咋办
不能只是简单地重发,可能重复了就。rdt2.1应运而生
rdt2.1
如何解决重复呢:
- 如果ACK或者NAK错了,currupted了,还是重发
- 但是这回,发送方在打包数据包时添加了0或者1编号sequence number (seq)
- 两个状态就够啦,一次只发送一个未经确认的分组
- sender就有0号数据包和1号package两种;receiver也有了2种状态等待0号package和等待1号package
- receiver把序列重复的删了不接受即可
- receiver也不知道发送方是否正确收到了其ACK/NAK
- 需要“stop and wait”,发送方发送一个package,然后等待接收方响应
机制
罢了还是直接看图
sender:
这个图给ACK和NAK也加了编号,我查阅了一下其他文字内容都没涉及这个,建议不管,看最后那个就ok
receiver:
整体(基本上记这个就差不多):
rdt2.2
做了一点点微不足道的贡献哈,再见啦NAK,ACK就够了
机制
我们在ACK的信息上加上了顺序号:sender发送0号数据包,如果接收方正确接收到0号,返回(ACK0),发送方接着发送1号数据包。如果接收方没有接收到0号数据包或出现错误,返回(ACK1),发送方重传0号数据包。
相当于抽象成了“若不符合要求,重发”和“发新的”两个选项
淦啊2.2估计有个博主一开始写错了……中文基本都是错的,我上次改了一遍结果没改完
还是直接看这俩就好我觉得
题目
rdt3.0
rdt2.2之前的版本都重在处理数据包的bit errors情况,却没有考虑到数据包在传输过程中出现的数据包或者ACKs丢失问题,这样数据包丢失会使得网络处于拥塞状态
机制(解决方法)
方法:在超过合理时间(reasonable amount of time,同TCP)后重传
- 发送端超时重传:如果到时没有收到ACK->重传
- 如果package(或ACK)只是被延迟了:
- 重传将会导致数据重复,但利用序列号已经可以处理这个问题
- 接收方必须指明被正确接收的序列号
- 需要一个倒计数定时器
还是理解这俩就好
过早超时(延迟的ACK)也能够正常工作:但是效率较低,一半包和确认是重复的
来点题目
Q: Consider a reliable data transfer (rdt) protocol over a channel with bit errors (packets are corrupted but not lost). Explain the procedure to detect and recover from errors. (5 marks)
A:
- Extract the checksum from the packet header.
- Calculate a new checksum from the packet and header data received.
- If these do not match there is an error.
- An error is reported with a NACK (or an ACK with the “wrong” number in rdt2.2, rdt3.0)