本文主要是介绍Reliable Data Transfer (RDT) 可靠数据传输协议(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
reliable data transfer protocol 在传输层和网络层都有很重要的应用,用来保证信息传输的准确性
在本文中只考虑单向数据传输(sender发送数据到receiver),但控制信息将在两个方向上流动(互相传递信息例如ACK等)
使用有限状态机(FSM)指定发送方、接收方
Q:什么是finite state machines (FSM)?
A:FSM(Finite State Machine),有限状态机,其在任意时刻都处于有限状态集合中的某一状态。下面的针对sender以及receiver的状态分析图就是FSM
RDT 1.0:
RDT 1.0协议是在理想情况下
- no bit errors
- no loss of packets
sender发送数据包给receiver接收
RDT 2.0:
毕竟不能只考虑理想情况,RDT2.0考虑了bits error的情况
RDT 2.0相比于RDT 1.0 增加了checksum(ACK确认字符和NAK否认字符)
Acknowledgements (ACKs): receiver explicitly tells sender that pkt received OK
Negative acknowledgements (NAKs): receiver explicitly
tells sender that pkt had errors
这里面提到了Stop and wait protocols 就是说等sender给receiver发送了一个数据包以后,需要等待reciever反过来发送给ACK或者NAK。只有收到的receiver的信息以后sender才会继续发送给第二个数据包或者重新发送上一个数据包。
没有错误的情况:
- sender发送数据给receiver
- receiver接收数据并且返回ACK,证明数据无误
- sender经过等待,接收到reciever返回的ACK,继续发送下一个数据包
有错误的情况:
- sender发送数据给receiver
- receiver接收数据并且返回NAK,证明数据有误
- sender经过等待,接收到reciever返回的NAK,将当前数据包重新发送
RDT 2.1:
因为对于RDT 2.0来说,receiver就算接收到了ACK或者NAK,也不知道是哪个数据包(retransmission的数据包 or 当前的数据包)
因此RDT2.1引入了一个 sequence number(0 or 1)
发送方添加序列号到每个pkt,接收方检查这个序列号,以确定是否收到的包是一个重传,接收方丢弃(不交付)重复的pkt
过程如下:
sender:
receiver:
假设接收端收到了正确的分组并向发送端发出了确认信息,但是当发送端接收到错误的接收端的确认信息(即不是ACK也不是NAK)时候,发送端不知道接收端是否得到正确的分组,发送端会在当前状态(1或0)下重新发送分组,而此时接收端已经进入下一个状态(0或1),发送端与接收端当前处于不同的状态,当前接受端的状态是期望得到下一个分组,而发送端发送的是上一个分组,这时候接收端就会通过两端不同的状态明白发送端发送的是上一个分组,跟着会丢弃这个分组,并且发送ACK给发送端, 让发送端进入下一个状态。
Q:只是引入2个sequence number(0 & 1)够不够?
A:RDT 2.1属于等停协议,就是说要按顺序传送分组,上一个分组确认传达后才会开始下一个分组。
RDT 2.2:
RDT 2.2跟RDT 2.1不同的地方在于RDT 2.2只是使用一个ACK而不使用NAK
E.g. 如果接收方接收到0号数据包,返回(ACK,1),发送方接着发送1号数据包。如果接收方接收到0号数据包出现错误,返回(ACK,0),发送方重传0号数据包。
RDT 3.0:
rdt3.0在rdt2.2的基础之上在处理了数据包丢失的情况中增加了 Countdown Timer的机制,如果在(RTT+Processing time at receiver)时间段内,发送方没有接收到反馈信息,那么发送方默认数据包已经丢失了,会自动重传。
Reference:
[1]JamesF.Kurose, and KeithW.Ross. 计算机网络:自顶向下方法. 机械工业出版社, 2009.
[2]https://www.zhihu.com/question/366259154/answer/983403348
这篇关于Reliable Data Transfer (RDT) 可靠数据传输协议(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!