计算机网络——传输层(一)

可靠数据传输原理(reliable data transfer protocol, rdt)

rdt 1.0
rdt1.0比较简单,上层应用调用rdt_send(data)向发送端传入数据,发送端调用packet = make_pkt(data)方法产生分组,然后再通过udt_send(packet)方法向网络传输数据(udt代表不可靠数据传输)。
接收端调用rdt_rcv(packet)接受来自网络的数据,再从中提取数据extract(packet, data),然后再向上层应用传递数据deliver_data(data).
rdt 1.0是建立在可靠的信道传输上的协议,也就说在网络上的数据传输不会出现任何问题。
在这里插入图片描述

rdt 2.0
2.0是建立在只存在分组受损的情况下,在这个协议下增加了反馈信息ACK和NAK。发送端发送完数据后等待接收端的反馈信号,如果是ACK则表示当前分组成功发送,发送端准备发送下一个分组;如果是NAK则表示当前分组发送失败,此时发送端会重新发现当前分组,然后再次等待接收端的反馈信号。我们称发送端等待反馈信号的这个状态为停等状态
在这里插入图片描述
但rdt 2.0会产生一个问题,就是当发送端收到反馈信号NAK,并再次传输原来的分组时,接收端怎么分辨这是重发的分组还是新的一个分组呢?所有就产生了 rdt 2.1协议解决这个。
rdt 2.1
在2.1中我们引入新和旧的概念,因为这仅仅只是2种不同的状态,所有在计算机中我们可以用一个bit来表示,也就是用0和1。若之前一个的分组被标记为0,则如果当前分组的标记为1,当前分组就是新的分组;如果当前分组的标记为0,当前分组就是重传的分组。所有在正常传输时,分组的标记是在0和1之间不断变化的,这在rdt 3.0中可以得到体现。
在这里插入图片描述
发送端和接收端用NAK0 和NAK1 来检查新分组和重新分组。然后我们发现可以直接用ACK就能表示这种关系,如果你发送了分组1,若反馈是ACK 1就表示成功接收了分组1。如果反馈是ACK 0就表示未成功接收分组1,而是等待接收之前的分组0。由此我们引入了rdt 2.2协议。

rdt 2.2
在这里插入图片描述

rdt 3.0
2.0是建立在分组或反馈信息受损的情况下,而3.0则是建立在分组或反馈信息可能会直接丢失的情况下。

所以在发送端引入时延的概念,就是在一定时间内没有收到反馈信息,则默认意味着分组丢失或反馈信息丢失。这时候发送端会自动重新发送分组。这个时延至少应该包括:发送端和接收端之间的往返时延和接收端的处理时延。

但也存在这样一种情况,就是分组和反馈信息并没有丢失,只不过在路上的时间太长了导致超过了发送端的判断时延,这时候发送端也依然会重新发送分组。不过没有关系,因为在协议2.0中就已经引入了新和旧的概念,接收端可以判断当前分组是新的还是旧的,如果由于发送端的错误判断而传来一个旧的分组,接收端有能力自动处理这个分组,而不会引起整个数据包的错误。我们称这种旧的分组为冗余分组

这是正常情况下的顺序流:
在这里插入图片描述
简单说明下上图的意思:发送端首先发送分组0,接收端收到分组0,然后给出反馈ACK0,表示已经成功接收分组0,。发送端收到反馈后发送新的分组,为了表示这是新的分组,将其标记为分组1,然后发送给接收端,以此不断循环往复。

这是分组丢失情况下顺序流:
在这里插入图片描述
反馈信息ACK丢失的情况跟上图差不多,我就不画了。

猜你喜欢

转载自blog.csdn.net/weixin_43379478/article/details/83757493