一、可靠数据传输原理
1.实现可靠传输服务是可靠数据传输协议的责任。
2.可靠数据传输协议的下层协议也许是不可靠的,例如TCP是在不可靠的(IP)端到端网络层上实现的可靠数据传输协议。
二、构造可靠数据传输协议
1.经完全可靠信道的可靠数据传输:rdt1.0
2.经具有比特差错信道的可靠数据传输:rdt2.0:自动重传请求协议(Automatic Repeat reQuest,ARQ)
ARQ中还需要三种协议功能来处理存在比特差错的情况:
- 差错检测:需要这种机制帮助接收方检测何时出现了比特差错。
- 接收方反馈:ACK和NAK,0表示NAK,1表示ACK。
- 重传
直到接收到ACK并离开状态时才能继续发送新数据,由于这种行为,rdt2.0被称为停等协议(stop-and-wait)。
新的问题:ACK和NAK分组是否放生比特差错无法检验,即接收方的反馈可能模糊不清。
解决新问题的办法实在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号放在该字段。于是,接收方只需要检查序号即可确定收到的分组是否一次重传。对于停等协议这种简单情况,1比特序号就足够了。
3.经具有比特差错的丢包信道的可靠数据传输:rdt3.0
为了实现基于时间的重传机制,需要一个倒计数定时器,在一个给定的时间过期后,可中断发送方。因此,发送方需要能做到:
- 每次发送一个分组时,便启动一个定时器
- 响应定时器中断
- 终止定时器
因为分组序号在0和1之间交替,因此rdt3.0有时被称为比特交替协议。
三、流水线可靠数据传输协议
1.rdt3.0是一个功能正确的协议,但性能不是令人人满意,主要在于它是一个停等协议。
2.流水线技术对rdt带来以下影响:
- 必须增加序号范围。
- 协议的发送方和接收方也必须缓存多个分组。
- 解决流水线差错恢复的两种基本方法:回退N步(Go-Back-N,GBN)和选择重传(Selective Repeat,SR)。
四、GBN
已被确认 | 发送,还未确认 | 可用,还未发送 | 不可用 |
0,base-1 | base,nextseqnum-1 | nextseqnum,base+N-1 | base+N及以后 |
N常被称为窗口长度,GBN协议也常称为滑动窗口协议。
GBN的发送方必须响应三种类型的事件:
- 上层的调用。当上层调用rdt_send()时,检查发送窗口是否已满,即是否有N个已发送但未被确认的分组。如果满了,将分组返回上层,并隐式地指出。
- 收到一个ACK。在GBN协议中,对序号为n的分组的确认采取累计确认的方式,表明接收方已正确接收到序号为n的以前且包括n在内的所有分组。
- 超时事件。如果收到一个ACK,但仍有已发送但未被确认的分组,则定时器被重新启动。如果没有已发送但未被确认的分组,该定时器被终止。
GBN接收方的动作:
- 如果一个序号为n的分组被正确收到,并且按序,则接收方为分组n发送一个ACK,并将该分组中的数据交付上层。
- 在所有其他情况下,接收方丢弃该分组,并为最近按序接收的分组重新发送ACK。
五、选择重传
顾名思义,SR协议通过让发送方仅重传那些它怀疑在接收方出错的分组而避免了不必要的重传。
这种个需的重传要求接收方逐个地确认正确接收的分组。
SR发送方采取的动作:
- 从上层收到数据。如果序号在发送方的窗口内,则将数据打包并发送;否则就要么缓存要么返回上层。
- 超时。现在每个分组必须拥有自己的逻辑定时器,超时后只能发送一个分组。
- 收到ACK。窗口基序号向前移动到具有最小序号的未确认分组处。如果窗口移动了并且有序号落在窗口内的未发送分组,则发送这些分组。
SR接收方采取的动作:
- 序号在[rcv_base,rcv_base+N-1]内的分组被正确接收。收到的分组落在接收方的窗口内,一个选择ACK返回发送方;如果该分组以前没被收到过,则缓存该分组。如果分组的序号等于接收窗口的基序号,则该分组以及以前缓存的序号连续的分组交付给上层。
- 序号在[rcv_base-N,rcv_base-1]内的分组被正确收到。必须产生一个ACK,即使该分组是接收方以前确认过的分组。
- 其他情况。忽略该分组。
第二步的重新确认是很有必要的,如果没有重新确认,则会导致SR发送方窗口永远不能向前滑动。
一个很重要的思考:窗口长度是不能够太小的,极限情况下窗口长度为1,SR协议就变成了GBN协议了。窗口太大,可能会产生一个困境:是一个新分组还是一次重传。那么窗口多大是合适的呢?
对于SR协议而言,窗口长度必须小于或等于序号空间大小的一半。
六、可靠数据传输机制及其用途的总结
机制 | 用途及说明 |
检验和 | 用于检测一个传输分组中的比特错误。 |
定时器 | 用于超时/重传一个分组。接收方可能会收到一个或多个冗余副本。 |
序号 | 便于分析丢失的分组和冗余的分组。 |
确认ACK | 确认报文通常携带被确认的分组或多个分组的序号。确认是可以逐个的或累积的,这取决于协议。 |
否认确定NAK | 否定报文通常携带未被正确接收的分组的序号。 |
窗口、流水线 | 通过允许一次发送多个分组但未被确认,发送方的利用率可在停等操作的基础上增加。 |