RDT2.0:
在RDT2.0中,传输通道被视为有可能发生比特错误,我们使用差错检测来检验接收到的包有没有错误,以此来判断是否应该重传。接收方会返回NAK或ACK,分别对应数据错误和数据正确。在Log.txt中可以看到,在此处接收方返回了NAK,让发送方重传数据。
RDT2.1:
RDT2.1解决了RDT2.0一个致命的问题,那就是返回的NAK或ACK也可能会出现比特位翻转,为了解决这个问题,我们在RDT2.0的基础上增加一个序号(0或1)。这时,发送方有两种发送状态发送0号数据包和1号数据包,接收方也有两种等待状态等待0号数据包和1号数据包。
当ACK和NAK没有发生比特翻转时,当发送方发送0号数据包时,接收方此时期待0号数据包,如果发送时数据没有发生比特翻转,接收方通过检验发现没有问题,会向发送方返回ACK,并期待1号数据包,发送方接收到此返回值,会继续发送1号数据包。如果发送时数据发生比特翻转,接收方通过检验发现错误,会向发送方返回NAK,发送方接收到此返回值,会重新发送0号数据包。
当ACK和NAK发生比特翻转时,假设当发送方发送0号数据包时,接收方返回ACK,但是ACK发生比特翻转,此时接收方期待1号数据包,发送方重新发送0号数据包,所以接收方会拒绝接收0号数据包避免出现重复。如果接收方返回NAK,但是NAK发生比特翻转,此时接收方期待0号数据包,发送方继续发送1号数据,所以接收方会拒绝接收1号数据包避免出现顺序错乱。
RDT2.2:
RDT2.2去掉了NAK,全部返回ACK,只是返回的时候会返回数据包发送过来时的序号。
RDT3.0:
RDT2.2没有考虑到可能会出现丢包的情况,所以RDT3.0在RDT2.2的基础上增加了计时器的机制,如果在RTT时间内,发送方没有接收到接收方返回的返回值,那么发送方会认为数据包在发送过程中丢失了,所以发送方会自动重传。